欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android如何实现设备的异显功能详解,

来源: 开发者 投稿于  被查看 22452 次 评论:279

Android如何实现设备的异显功能详解,


目录
  • 前言
  • 一、什么是异显
  • 二、实现步骤
    • 2.1权限
    • 2.2定义分屏的界面
    • 2.3操作分屏界面
  • 总结

    前言

    大家都知道无线投屏或者有线投屏的功能,但应该很少有人知道安卓中的异显功能? 这篇文章是为了让大家对异显有初步的认识,以及怎么实现简单的异显。

    一、什么是异显

    无线投屏或者有线投屏的时候,安卓设备的画面会原封不动的投影在显示器上,这就是投屏。   

    而异显,则是安卓设备和显示器的画面分开显示,比如安卓设备上在聊天,显示器上还可以在播放电影,是不是和多窗口的感觉有点像。

    当然,安卓设备需要支持VGA/HDMI显示。 哪些设备支持呢,我在某商家店面上发现只有部分设备是支持的。

    另外有部分安卓设备同时支持投屏和办公两种模式,有部分安卓设置则只支持投屏。     某品牌手机的办公模式

    二、实现步骤

    2.1 权限

    • 静态权限

    在实现投屏功能之前,应该去允许操作投屏的权限,它的权限实际上是显示系统窗口的权限,在配置文件中

    <!-- 显示系统窗口权限 -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <!-- 在 屏幕最顶部显示-->
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
    • 动态权限
    if (Build.VERSION.SDK_INT >= 23) {
                if (!Settings.canDrawOverlays(MainActivity.this)) {
                    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                            Uri.parse("package:" + getPackageName()));
                    startActivityForResult(intent, 10);
                }
            }
            
     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 10) {
                if (Build.VERSION.SDK_INT >= 23) {
                    if (!Settings.canDrawOverlays(this)) {
                        // SYSTEM_ALERT_WINDOW permission not granted...
                        Toast.makeText(MainActivity.this, "not granted", Toast.LENGTH_SHORT);
                    }
                }
            }
            super.onActivityResult(requestCode, resultCode, data);
        }

    为什么需要这些权限,因为副屏的主要类Presentation是继承与Dialog的

    2.2 定义分屏的界面

    public class DifferentDisplay extends Presentation {
        public DifferentDisplay(Context outerContext, Display display) {
            super(outerContext, display);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.diffrentdisplay);
        }
    
        public void setText(String text) {
            TextView textView = findViewById(R.id.tv_test);
            textView.setText(text);
        }
    }

    界面布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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"
        android:background="@color/purple_200"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/tv_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="异显"
            android:textSize="50sp" />
    
    </RelativeLayout>

    2.3 操作分屏界面

    先放代码再来说明

    public class MainActivity extends AppCompatActivity {
        final String TAG = "MainActivity";
        DifferentDisplay mPresentation;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 双屏显示
            DisplayManager mDisplayManager; //屏幕管理类
            Display[] displays;// 屏幕数组
            mDisplayManager = (DisplayManager) MainActivity.this.getSystemService(Context.DISPLAY_SERVICE);
            displays = mDisplayManager.getDisplays(); // 得到显示器数组
            if (displays.length == 0) {
                Log.d(TAG, "无显示屏");
                return;
            }
            mPresentation = new DifferentDisplay(getApplicationContext(), displays[1]);//displays[1]是副屏
           // 8.0 需要替换为 TYPE_APPLICATION_OVERLAY mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            mPresentation.show();
        }
    
        int index = 1;
    
        public void Test(View view) {
            if (mPresentation != null)
                mPresentation.setText(++index + "点击");
        }
    }

    Display[] displays是获取的屏幕的个数,包括安卓设备自身的屏幕。 比如new DifferentDisplay(getApplicationContext(), displays[1]) 操作的就是第一块副屏。

    另外有个权限问题

    mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

    上诉代码在6.0及以上是可以的(未验证),但在8.0以上需要这样使用
    8.0以上需要将:WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 替换为:WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

    总结

    到此这篇关于Android如何实现设备的异显功能的文章就介绍到这了,更多相关Android实现设备异显功能内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • Android Presentation实现双屏异显

    用户评论