Android -- 双屏异显之方法一

embedded/2024/12/24 19:30:46/

Android – 双屏异显之方法一:MediaRouter

PS:
1. 部分主板可能不支持,得验证;
2. 副屏输出可以不用连接显示屏也能正常后台运行;
3. 主屏Activity内控制副屏;
4. 副屏截图命令:screencap -p -d 1 <path_name>;(-d 1 副屏截屏)

使用方法:

//主屏activity内
private MediaRouter mMediaRouter;
private SecondDisplay secondDisplay;//控制副屏显隐
public void onSecondChange(View view) {if (secondDisplay == null) {showSecondScreen();} else {closeSecondScreen();}
}
//====================================
private void showSecondScreen() {if (secondDisplay != null) {return;}mMediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE);updatePresentation();
}private void closeSecondScreen() {if (secondDisplay != null) {secondDisplay.release();secondDisplay.dismiss();secondDisplay = null;}
}private void updatePresentation() {// Get the current route and its presentation display.MediaRouter.RouteInfo route = mMediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);Display presentationDisplay = route != null ? route.getPresentationDisplay() : null;// Dismiss the current presentation if the display has changed.if (secondDisplay != null && secondDisplay.getDisplay() != presentationDisplay) {secondDisplay.dismiss();secondDisplay = null;}// Show a new presentation if needed.if (secondDisplay == null && presentationDisplay != null) {secondDisplay = new SecondDisplay(this, presentationDisplay);secondDisplay.setOnDismissListener(mOnDismissListener);try {secondDisplay.show();} catch (WindowManager.InvalidDisplayException ex) {secondDisplay = null;ex.printStackTrace();}}
}//副屏关闭监听
private final DialogInterface.OnDismissListener mOnDismissListener = new DialogInterface.OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {if (dialog == secondDisplay) {secondDisplay = null;}}
};

SecondDisplay.java (副屏类)

//主要继承Presentation类
public class SecondDisplay extends Presentation {private static final String TAG = "SecondDisplay";private Context mContext;//构造函数public SecondDisplay(Context outerContext, Display display) {super(outerContext, display);this.mContext = outerContext;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//副屏布局,与activity内一样setContentView(R.layout.layout_second);initUI();}private void initUI() {//绑定控件}public void release() {//关闭页面前注销资源}
}

http://www.ppmy.cn/embedded/148415.html

相关文章

Linux Shell 脚本编程基础知识篇—shell 运算命令详解

ℹ️大家好&#xff0c;我是练小杰&#xff0c;本文继续Linux shell脚本编程的基础知识内容&#xff0c;接着讲算术运算命令的详细操作~~ 复习&#xff1a;【shell简介以及基本操作】 更多Linux 相关内容请点击&#x1f449;“Linux专栏”~ 文章目录 let运算命令的用法let 的高…

uniapp图片数据流���� JFIF ��C 转化base64

1&#xff0c;后端返回的是图片数据流&#xff0c;格式如下 &#xfffd;&#xfffd;&#xfffd;&#xfffd; JFIF &#xfffd;&#xfffd;C 如何把这样的文件流转化为base64&#xff0c; btoa 是浏览器提供的函数&#xff0c;但在 小程序 环境中&#xff08;如微信小程序…

基础I/O -> 如何谈文件与文件系统?

文件的基础理解 空文件也要在磁盘上占据空间。文件 文件内容文件属性。文件操作 对内容的操作 对属性的操作或者是对内容和属性的操作。标定一个文件&#xff0c;必须使用&#xff1a;文件路径 文件名&#xff08;具有唯一性&#xff09;。如果没有指明对应的文件路径&…

uniapp小案例---趣味打字坤

当点击输入框时出现小鸡打字 当输入框失焦时打字鸡沉下去 原图自取 这里运用了一个三元 :class"isActive?active:"&#xff0c;当聚焦时isActivetrue从而让class绑定&#xff0c;当失焦时isActivefalse <template><view class"out"><inp…

开始探索XDP:开启Linux高性能网络编程的新篇章

XDP&#xff08;eXpress Data Path&#xff09;是 Linux 中的一项强大新网络功能&#xff0c;它允许在数据包进入网络栈之前以高性能可编程的方式访问这些数据包。然而&#xff0c;XDP 的学习曲线较高。许多开发者已经为这项功能撰写了入门博客&#xff0c;例如 Paolo Abeni 的…

【Redis经典面试题三】Redis有哪些数据类型?

目录 一、string 1.1 基本命令 1.2 使用场景 场景一&#xff1a;微博粉丝数 场景二&#xff1a;存json串 二、hash 2.1 基本命令 2.2 使用场景 三、list 3.1 基本命令 3.2 使用场景 场景一&#xff1a;微博粉丝关注列表 场景二&#xff1a;存放集群服务器日志 四…

命令行音乐库管理工具Beets

什么是 Beets &#xff1f; Beets 是一个音乐库管理系统和音乐文件元数据标签编辑器。它使用 MusicBrainz 数据库来自动填充音乐文件的元数据信息&#xff0c;并且可以通过插件系统来增加各种额外功能&#xff0c;比如自动下载专辑封面&#xff0c;歌词等。其目的是使您的音乐收…

情报信息收集能力

红队专题-Web渗透之资产思路框架知识整理 钓鱼社工 钓鱼自动化zip域名ARP欺骗快捷方式ToolsburpsuiteApp 抓包ffuf模糊测试QingScanWiresharkCloudCFEn-Decodeffffffff0xInfodirbdirmapdirsearchdnsenum使用测试常规使用使用字典文件进行dns查询子域名暴力查询部分C类IP地址IP块…