目录
前言
双屏异显可以用在各种窗口服务系统,信息发布系统,如收银机,广告机等。记录一下使用方法~
一、环境介绍
- Android
系统版本:Android 7.1 Android 12
Android Studio Electric Eel | 2022.1.1jdk-18.0.2
二、设备介绍
使用场景
安卓平板接一个HDMI显示器,显示器为副屏~
三、编写代码
首先创建一个android程序, 创建过程就不多讲了~
1.添加权限
AndroidManifest中增加权限,代码如下:
<!-- 申请悬浮权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
动态申请权限:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
//启动Activity让用户授权
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 1000);
return;
}
}
2.创建副屏DisplayPresentation类
继承Presentation, Presentation其实就是一个Dialog
DisplayPresentation简单实现了一个全屏的webview,用来加载网页~
代码如下:
package com.armt.sdktest_armt.displays;
import android.app.Presentation;
import android.content.Context;
import android.net.http.SslError;
import android.os.Bundle;
import android.view.Display;
import android.webkit.SslErrorHandler;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.armt.sdktest_armt.R;
public class DisplayPresentation extends Presentation {
public WebView webView;
public DisplayPresentation(Context outerContext, Display display) {
super(outerContext, display);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.display_presentation);
//此处URI可能失效
addWeb("https://haokan.baidu.com/v?vid=3742103441181501443&");
}
public void setVideoUrl(String url) {
webView.loadUrl(url);
}
public void addWeb(String url) {
webView = findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
webSettings.setDomStorageEnabled(true);
webSettings.setSupportZoom(true);
//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
// 设置支持JavaScript激活,可用等
webSettings.setJavaScriptEnabled(true);
/*
* 设置自身浏览器,注意:可用把WebView理解为浏览器
* 设置setWebViewClient(new WebViewClient());后,手机就不会跳转其他的浏览器
*/
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 注掉 super
// super.onReceivedSslError(view, handler, error);
// 接受所有网站的证书,忽略SSL错误,执行访问网页,解决网页空白的问题
handler.proceed();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
webView.loadUrl(url);
}
}
display_presentation.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
3.创建PresentationActivity启动类
1.获取屏幕管理类 2.获取副屏display数据 3.创建副屏界面DisplayPresentation 4.show()显示副屏 代码如下(示例):
//屏幕管理类
DisplayManager mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
//获取副屏
Display[] presentationDisplays = mDisplayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
if (presentationDisplays.length > 0) {
mPresentation = new DisplayPresentation(this, presentationDisplays[presentationDisplays.length - 1]);
}
//获取全部显示屏
//Display[] displays = mDisplayManager.getDisplays();
//mPresentation = new DisplayPresentation(this, displays[displays.length - 1]);
mPresentation.show();
//另一种方法
/*MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
if (presentationDisplay != null) {
mPresentation = new DisplayPresentation(this, presentationDisplay);
mPresentation.show();
}
}
*/
4.主屏操控副屏
获取到DisplayPresentation对象后, 可以在主屏界面修改变更数据,或者使用EventBus等框架传递数据也行
PresentationActivity类中调用:
mPresentation.setVideoUrl("https://www.qq.com");
DisplayPresentation中实现函数:
public void setVideoUrl(String url) {
webView.loadUrl(url);
}
5.完整代码链接:
在displays包下~