Android TV项目由于会默认预装GMS包里面的所有apk,其中有个live channels的信源播放apk也是采用标准TIF架构的,由于该应用是Google为网络流媒体专门准备的,无法完美兼容本地的信源通道(比如ATV/DTV,HDMI,AV)。所以各大厂商都会基于AOSP上的live tv开发一个单独的通道播放apk,平台中可能存在2个支持TIF的channel apk。
而之前GTVS认证要求可以通过launcher上的inpu微件进行通道切换,当点击任意信源通道时是通过intent消息是拉起对应的apk,所以由于存在2个支持TIF的apk,就会导致出现应用选择的dialog,并且如果用户选择了live channels这个apk进行ADTV播放,可能会由于Google apk兼容性问题导致多个bug(由于live channels是闭源的,无法进行定制,所以大部分厂商会将里面支持网络流媒体播放的功能直接移植到live tv中,然后不再预装)。
那既然live channels有这么多问题是否可以不预装就可以了?答案是可以不预装,但是必须将里面的核心功能移植到另外的live tv中,否则在GTVS认证的cts verify测试中,TIF相关的case将会fail,无法通过认证。
所以这篇文章是针对那些没有做移植功能,并且又不想因为apk存在导致用户体验差的问题。解决方案如下:
1.用户正常使用时,当开机第一次启动时通过addPreferredActivity强制设置发生intent打开支持信源播放的live tv。
2.当检测到已经安装了cts verify测试的apk时,去掉偏好设置,让测试人员可以选择用live channels进行测试。
以下是贴出的解决方案的2个patch(只提供大概的核心代码,可以参考实现其他的客户定制需求)
①开机第一次启动时设置live tv为打开的channel默认应用
--- a/core/res/src/com/droidlogic/BootComplete.java
+++ b/core/res/src/com/droidlogic/BootComplete.java
@@ -24,6 +24,13 @@ import android.content.ContentResolver;
import android.util.Log;
import android.media.AudioManager;
import android.provider.Settings;
+//import android.content.pm.IPackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.ComponentName;
+//import android.app.ActivityThread;
+import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.ServiceConnection;
@@ -33,6 +40,9 @@ import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import android.net.Uri;
import com.droidlogic.app.OutputModeManager;
import com.droidlogic.app.PlayBackManager;
@@ -54,6 +64,7 @@ public class BootComplete extends BroadcastReceiver {
private SystemControlManager mSystemControlManager;
private AudioManager mAudioManager;
private AudioSettingManager mAudioSettingManager;
+ private Context mContext;
@Override
public void onReceive(Context cont