首页 > 其他分享 >TCL 配置 AnyLauncher 实现开机即看网络电视 L48A71/L48C71

TCL 配置 AnyLauncher 实现开机即看网络电视 L48A71/L48C71

时间:2024-10-09 21:46:57浏览次数:1  
标签:AnyLauncher L48A71 桌面 L48C71 2nd adb ADB com

声明

本教程针对具有一定动手能力的人,请尽量理解自己的每一步操作并谨慎执行。最好在完全看完本教程之后再动手操作。操作不当可能导致系统无法退出播放器页面或无法进入系统桌面,请量力而行。

家里的电视是 TCL L48A71,2013年9月就上市了,很老的型号。配置有48英寸1080P分辨率的屏幕,买了没几年就感觉已经远远落后于时代了。目前主要是家里的中老年人在观看。诉求很简单,打开电视就能看到直播频道。

基本情况

电视开机会经过一个较长时间的加载,然后会进入系统桌面。如果使用了网络电视客户端,则需要切换到应用页后,自行打开对应的网络电视应用才能看电视。这些操作对于家里的中老年人,尤其是老年人来说极为繁琐,操作起来比较困难。

为了实现开机即可以收看网络电视,我借助了 AnyLauncher 来将网络电视应用直接作为电视桌面应用,这样一来,系统开机之后进入桌面的步骤就会被替换为进入网络电视应用,这样就大大简化了看电视的步骤。

下面来简单介绍一下设计思路和具体步骤。

目录

开启 ADB (Android Debug Bridge)

TCL 开启 ADB 的方式有很多,下面提供两种方式供大家参考:

使用设置打开【未测试】

操作步骤为:打开 设置系统信息 ,按下遥控器的 上下左右 键,出现相关设置,按屏幕提示操作即可。

使用 TCP 报文打开【已测试】

分不同的操作系统,可以使用不同的方法发送 TCP 报文。需要注意的是,你需要提前知道电视的 IP 地址。这个地址可以通过打开 设置网络无线网络(或者有线网络)→ 网络详情 得到。同时需要保障你操作的电脑和电视处于同一网络环境下,例如连接到同一个路由器。

Windows

Window 上可用的工具很多,下面介绍一种简单的。

工具下载:TCP&UDP测试工具下载-华军软件园

使用该工具的TCP测试模式-客户端模式,这里的内容填写如下:

项目 说明
目标 IP 192.168.X.X 上文中查到的电视IP地址
端口 8090 电视监听的端口

创建完成后,点击页面左侧的连接按钮。连接成功后,在发送区填写 start adbd,点击发送,如果操作正确,接收区将显示 ok

TCL-TCPUDP调试工具

Linux/macOS

使用 nc 命令即可。

echo "start adbd" | nc 192.168.X.X 8090

其中 192.168.X.X 即为前文中获得的电视 IP 地址。

安装与连接 ADB

成功打开电视的 ADB 远程调试功能后,需要使用 adb 命令完成接下来的操作。

安装 ADB

Windows

ADB 的安装可参考Windows下adb的安装方法【小白向】 - 哔哩哔哩,这里推荐一种更简单的安装方法- choco

Windows 程序包管理器 Chocolatey 的使用 - 飞仔FeiZai - 博客园

使用 cmd 或者 PowerShell 安装好 choco 之后,运行:

choco install adb

安装完成后,系统会自动将 adb 添加到可执行文件目录( %PATH% )中。

Linux

使用系统自带的包管理器安装 adb 包即可:

# Ubuntu/Debian
sudo apt install adb

# Arch/Manjaro
sudo pacman -S android-tools

# Fedora (Traditional )
sudo dnf install -y android-tools

# Fedora (Atomic Desktops)
rpm-ostree install android-tools

macOS

工具 | 最简方式在 macOS 中安装 adb 工具 - 知乎

# Install Homebrew
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

# Install ADB via Homebrew
bash brew install android-platform-tools --cask

# If error, remove --cask
bash brew install android-platform-tools

通过 ADB 连接电视

adb connect 192.168.X.X 5555

如果命令运行结果为:

connected to 127.0.0.1:5555
# Or
already connected to 127.0.0.1:5555

adb devices

可以显示连接到的设备,就可以继续进行下一步了。

安装相关软件并配置

为了实现开机即进入网络直播软件,需要安装的工具有两个:

  • 网络直播软件,这里使用的是 友窝(Yowar Player)
  • AnyLauncher ,可以将任意应用作为系统的主页应用。

tumuyan/AnyLauncher: You can choose any Android application and set it as a Luncher. (github.com)

其中网络直播软件可以任意挑选,有其他可用的也可以在评论区一起交流。

下载对应软件安装包

网络直播软件安装包请自行搜索, AnyLauncher 的安装包下载地址在:https://github.com/tumuyan/AnyLauncher/releases/download/1.13/app-release.apk

使用 ADB 安装对应软件包

在进行操作前,请确保 adb devices 中列出了电视设备。

将安装包放置在一个便于找到的目录下,例如根目录或者一级目录下,这里我放在了 E:\TCL\ 目录下:

adb install E:\TCL\player.apk
adb install E:\TCL\AnyLauncher.apk

如果顺利的话,这两条命令都会显示:

Performing Streamed Install:
  pkg: /data/local/tmp/*****.apk
Success

之后,即可在电视的 应用全部应用 看到对应的软件APP图标。

配置 AnyLauncher 实现开机进入直播

【注意】操作不当可能会引起无法进入系统桌面!请谨慎操作!

打开 AnyLauncher 页面,有三个按钮:

  • 设置桌面
  • 选择应用
  • 延迟启动

如果只是需要配置开机进入直播软件,直接用遥控器操作:

  1. 选择 选择应用
  2. 在弹出的列表中选择 优先从后台切换到前台
  3. 在列表中选择对应的应用程序即可;
    • 如果应用太多无法翻页,请在 搜索框 内输入应用名称并点击右侧 搜索 按钮进行过滤
  4. 如果需要设置备用桌面,请再次选择 选择应用
  5. 在弹出的列表中选择 备用启动器
  6. 在列表中选择对应的系统桌面,
    • TCL 原系统桌面显示为 901 DTV,包名为 com.tcl.cyberui
  7. 在备用启动器后的选框中打钩。

之后,按遥控器上的 Home 键(形状为一个小房子),在弹出的对话框中选择 AnyLauncher 并选择下方的 始终

如果配置正确,此时电视会直接打开网络直播软件。

实现原理

配置完成后,系统将使用 AnyLauncher 作为默认的桌面应用,这就导致每次开机或者按 Home 键时,系统都会自动切换到 AnyLauncher 。之后 AnyLauncher 开始接管,并按照配置设置打开对应的直播APP。

同时,如果短时间内多次按 Home 键,理论上来说 AnyLauncher 将会打开备用的系统桌面。

stateDiagram-v2 [*] --> AL: 按下 Home state "AnyLauncher" as AL { state if_state <<choice>> state "直播 APP" as Player { [*] --> 打开网络直播 } state "系统桌面【备用】" as System { [*] --> 系统桌面 } [*] --> if_state if_state --> Player: 默认 if_state --> System: 短时间内多次按下 Home }

系统恢复

在进行上述操作之后,实测很难打开备用桌面。由于系统的版本陈旧,且硬件水平也比较落后,加上遥控器的编码问题,这就让 AnyLauncher 无法检测到短时间内多次按下的 Home 。如果你需要进入系统桌面,则需要如下操作:

临时打开系统桌面

按照前文方法完成与电视端 ADB 的连接,之后运行:

adb shell am start -n com.tcl.cyberui/.MainActivity

可以临时打开系统桌面。

完全恢复系统桌面

按照前文方法完成与电视端 ADB 的连接,之后运行:

adb shell am start -n com.tcl.cyberui/.MainActivity

可以临时打开系统桌面,卸载 AnyLauncher 即可恢复。

或者直接在 adb 上卸载 AnyLauncher:

adb uninstall com.tumuyan.fixedplay

拓展阅读:系统配置及设置双桌面

这一部分主要写如何修改 AnyLauncher 代码实现双桌面来回切换。

由于在前文的实践中无法切换到备用桌面,而 AnyLauncher 是开放源代码的,因此可以直接修改其源码,来实现切换到备用桌面的逻辑。

系统原始状态

家里这台 TCL L48A71 使用的还是 Android 4.2 版本的系统,相当老旧。

通过 adb shell cmd shortcut get-default-launcher 可以得知:

原始桌面包名:com.tcl.cyberui

原始桌面活动名:com.tcl.cyberui.MainActivity

需要实现的效果是:

stateDiagram-v2 [*] --> AL: 按下 Home state "AnyLauncher" as AL { state if_state <<choice>> state "直播 APP" as Player { [*] --> 打开网络直播 } state "系统桌面【备用】" as System { [*] --> 系统桌面 } [*] --> if_state if_state --> Player: 第一次打开电视\n或上次打开的是备用桌面 if_state --> System: 上次打开的是直播 APP }

源代码分析

AnyLauncher 的源代码可以在 tumuyan/AnyLauncher 获取到。使用 Android Studio 打开该项目,定位到其负责执行应用跳转逻辑的部分:

// app/src/main/java/com/tumuyan/fixedplay/MainActivity.java
// ...
// Start from Line 89
public void go() {
    SharedPreferences read = getSharedPreferences("setting", MODE_MULTI_PROCESS);
    ...
    // Line 98
    boolean apply2nd = read.getBoolean("apply2nd", false);
    long lastTime = read.getLong("lastTime", 0);
    int combo = read.getInt("combo", 0);

    final String app_2nd = read.getString("app_2nd", "");
    final String class_2nd = read.getString("class_2nd", "");
    Log.w("2nd", app_2nd + ", combo=" + combo);

    if (apply2nd) {
    // Line 108
        long time = System.currentTimeMillis();
        if (combo > 3)
            combo = 0;
        else {
            if (time - lastTime < 500) {
                combo++;
            } else {
                combo = 0;
            }
        }
    // Line 118
        Log.w("combo", "" + combo);
        {
            SharedPreferences.Editor editor = getSharedPreferences("setting", MODE_MULTI_PROCESS).edit();
            editor.putInt("combo", combo);
            editor.putLong("lastTime", time);
            editor.commit();
        }
        if (combo > 1) {
            if (app_2nd.length() > 0) {
                Intent intent = new Intent();

                intent = packageManager.getLaunchIntentForPackage(app_2nd);
                if (intent != null) {
                    intent.addCategory(Intent.CATEGORY_HOME);
                    Log.w("2nd2", "length>0 -> intent not null");
                    startActivity(intent);
                } else {
                // ...

可以看出:

  • (98)该应用使用 SharedPreferences 存储配置设置及一些运行记录相关的信息;
  • (108)该应用使用 500 毫秒以内调用次数来判断是否启动备用启动器,如果调用次数过多,连击次数会清零;
  • (118)该应用每次调用都会更新上次调用时间和连续调用次数。

为了实现依据上次调用的结果反过来调用另外一个启动器,我们需要修改此逻辑。

代码修改

引入一个布尔值 fallback 来判断是否需要进入备用桌面。同时,需要判断是否为第一次进入桌面,这里直接使用了原有的 splash_time 来进行判断。

在原有代码中,splash_time 的值会在第一次运行的时候从配置文件内读取,在设置好延时后,该值会被设置为 0。因此可以利用该特性来判断是否为第一进入桌面。

之后,在每次进行桌面跳转调用的时候,我们都对这个 fallback 进行反转并将值更新存储到 SharedPreferences 中。这样只需要小小地修改几处代码,即可实现双桌面的来回切换:

// app/src/main/java/com/tumuyan/fixedplay/MainActivity.java
// ...
// Start from Line 89
public void go() {
    SharedPreferences read = getSharedPreferences("setting", MODE_MULTI_PROCESS);
    ...
    // Line 98
    boolean apply2nd = read.getBoolean("apply2nd", false);
    boolean fallback = read.getBoolean("fallback", false);  // MOD
    if (splash_time > 0) {							   	// MOD
        fallback = true;							    // MOD
    }												 // MOD

    final String app_2nd = read.getString("app_2nd", "");
    final String class_2nd = read.getString("class_2nd", "");
    Log.w("2nd", app_2nd + ", fallback=" + fallback);      // MOD

    fallback = !fallback;                                   // MOD
    {                                                       // MOD
        SharedPreferences.Editor editor = getSharedPreferences("setting", MODE_MULTI_PROCESS).edit(); // MOD
        editor.putBoolean("fallback", fallback);            // MOD
        editor.commit();                                    // MOD
    }                                                       // MOD

    if (apply2nd) {
    // Line 108
    // Deleted Line 108-125
        if (fallback) {                                     // MOD
            if (app_2nd.length() > 0) {
                Intent intent = new Intent();

                intent = packageManager.getLaunchIntentForPackage(app_2nd);
                if (intent != null) {
                    intent.addCategory(Intent.CATEGORY_HOME);
                    Log.w("2nd2", "length>0 -> intent not null");
                    startActivity(intent);
                } else {
                // ...

打包与安装

build.gradle 内添加包签名信息:

android {
    ...
    signingConfigs {
        release {
            keyAlias ***
            keyPassword ***
            storeFile file('***')
            storePassword ***
        }
    }
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
    ...
}

使用 Ctrl+F9 Build Project ,将 release 目录下的 AnyLauncher-*.**.apk 使用 ADB 安装到电视上。

【进阶】远程配置 AnyLauncher

Android 4.2 无法支持 scrcpy,无法远程操控电视,因此我只得出此下策,供大家参考。

【注意】这里的部分命令需要系统支持 root ,即 adb shell 中可以运行 su 命令

前文提到,AnyLauncher 的配置使用的是 SharedPreferences 进行存储,该存储的物理位置为 /data/data/com.pkg.name/shared_prefs,代码中指定了 SharedPreferences read = getSharedPreferences("setting", MODE_MULTI_PROCESS) ,我们在 AnyLauncher 的数据目录下可以找到对应的文件:

ADB Shell

shell@android:/ $ su
shell@android:/ # ls -la /data/data/com.tumuyan.fixedplay/shared_prefs
-rw-rw---- u0_a72   u0_a72        111 2024-10-05 21:49 setting.xml
shell@android:/ # cat /data/data/com.tumuyan.fixedplay/shared_prefs/setting.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="fallback" value="true" />
</map>
shell@android:/ #

可以看到,该目录下确实存在名为 settting.xml 的配置文件。

如果没有出现对应的配置文件,可能是安装之后没有运行该 APP 导致的,可以使用:

adb shell am start -n com.tumuyan.fixedplay/.SettingActivity

运行一次程序,之后即可在数据目录下找到该文件。

找到该文件后,使用 adb pull 命令将文件拉取到电脑上进行修改。注意,这里需要先将文件复制到普通用户可以读写的目录下,例如 /sdcard/data/local/tmp/

ADB Shell & Linux Shell

shell@android:/ # cp /data/data/com.tumuyan.fixedplay/shared_prefs/setting.xml /sdcard/setting.xml
shell@android:/ # exit
shell@android:/ $ exit
user@ubuntu:~ $ adb pull /sdcard/setting.xml ./setting.xml

之后,使用文本编辑器将内容进行相应的更改:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="app">com.yowar.ywp</string>
    <string name="label">Yowar Player</string>
    <string name="class">com.yowar.ywp.activities.SplashActivity</string>
    <string name="mode">r1</string>
    <string name="app_2nd">com.tcl.cyberui</string>
    <string name="label_2nd">TCL Desktop</string>
    <string name="class_2nd">com.tcl.cyberui.MainActivity</string>
    <boolean name="apply2nd" value="true" />
    <boolean name="fallback" value="true" />
    <int name="splash_time" value="10" />
</map>

其中:

类型 名称 含义
string app com.yowar.ywp 主要应用包名
string label Yowar Player 主要应用显示名
string class com.yowar.ywp.activities.SplashActivity 主要应用活动名
string app_2nd com.tcl.cyberui 备用应用包名
string label_2nd TCL Desktop 备用应用显示名
string class_2nd com.tcl.cyberui.MainActivity 备用应用活动名
int splash_time 10 延迟启动时间(ms)

再将修改之后的文件重新上传回电视:

ADB Push

user@ubuntu:~ $ adb push ./setting.xml /sdcard/setting.xml
./setting.xml: 1 file pushed, 0 skipped. 0.6 MB/s (532 bytes in 0.001s)

之后,再将配置文件覆盖到原位置:

ADB Shell

shell@android:/ $ su
shell@android:/ # cd /data/data/com.tumuyan.fixedplay/shared_prefs
shell@android:/data/data/com.tumuyan.fixedplay/shared_prefs # cp /sdcard/setting.xml . && chown u0_a72:u0_a72 ./* && chmod 660 ./*

这里需要一起完成,因为程序会自动去写配置文件导致修改失败。

经测试,修改后的 AnyLauncher 可以实现类似双桌面的功能。即使系统对 Home 响应缓慢,也能实现主要桌面向备用桌面的切换。

结语

这一次远程为家里的电视添加功能,实践上完成了我第一对 Android 应用的修改。虽然比较简单,但还是在如何打包一个 Release 版本的 apk 上学到了一些东西;还对 Android 上的 SharedPreferences 有了一个基本的了解。

希望这次分享能够让更多人体验到开机即看电视的好处!

标签:AnyLauncher,L48A71,桌面,L48C71,2nd,adb,ADB,com
From: https://www.cnblogs.com/bearhuchao/p/18455216/TCL-AnyLauncher

相关文章