Android双屏异显

目录

前言

 一、环境介绍

二、设备介绍 

​编辑 使用场景

三、编写代码

1.添加权限

2.创建副屏DisplayPresentation类

3.创建PresentationActivity启动类

4.主屏操控副屏

 5.完整代码链接:


前言

双屏异显可以用在各种窗口服务系统,信息发布系统,如收银机,广告机等。记录一下使用方法~


 一、环境介绍

  • Android

系统版本:Android 7.1 Android 12 
Android Studio Electric Eel | 2022.1.1

jdk-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包下~


猜你喜欢

转载自blog.csdn.net/qaz96801/article/details/130368051