如何在Android Studio中实现安卓App投屏到TV时展示不同UI?
安卓应用投屏异屏UI实现排查方案
以下是按优先级排序的排查&修复步骤:
- 首先确认权限配置是否完整
Android 10及以上版本必须同时完成两个权限配置:- 清单文件中声明
android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION、android.permission.MEDIA_CONTENT_CONTROL权限 - 运行时主动申请媒体投射权限,未做动态申请的场景下系统会直接拦截第二屏窗口创建
- 清单文件中声明
- 检查Presentation实例创建逻辑是否正确
绝大多数异屏显示异常都是因为Presentation绑定了错误的Display对象,正确流程如下:- 获取
MediaRouter系统服务,监听ROUTE_TYPE_REMOTE_DISPLAY类型的路由变化 - 当检测到可用投屏路由选中时,通过
selectedRoute.getPresentationDisplay()获取电视端对应的独立Display实例 - 用该Display实例构造自定义Presentation子类,在子类onCreate中设置电视端专属的UI布局
示例代码:
创建后调用public class TvDisplayPresentation extends Presentation { public TvDisplayPresentation(Context context, Display display) { super(context, display); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 此处设置电视端独立布局,和手机端UI完全隔离 setContentView(R.layout.layout_tv_custom); } }presentation.show()即可显示电视端UI。 - 获取
- 检查清单配置冲突
如果你的应用或对应Activity配置了android:resizeableActivity="false",会导致系统无法为第二屏分配独立的窗口上下文,直接造成Presentation加载失败,将对应属性改为true即可解决。 - 特殊ROM适配
部分国内定制ROM会限制应用在第二屏的显示优先级,可在Presentation的onCreate中添加以下代码提权:
该配置需要动态申请getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);SYSTEM_ALERT_WINDOW悬浮窗权限。 - 如果你使用的是Google Cast/DLNA投屏方案
该场景下电视端UI运行在电视设备的Receiver程序中,并非运行在手机端,需要单独开发电视端的Receiver应用,两端通过Cast消息总线同步数据即可。
注意:不要在Presentation中持有手机端Activity的强引用,避免内存泄漏,跨屏数据同步建议使用LiveData、本地广播这类生命周期感知组件实现
内容的提问来源于stack exchange,提问作者VIKAS KUMAR
相关产品推荐
相关产品推荐

