android 投屏,华为手机的电脑模式是如何实现的

1.前言

​ 不知道大家在手机往家里电视投屏的时候有没有发现,华为手机和三星手机投屏成功后,会有手机和电脑两种模式,手机模式是将手机镜像投到屏幕上,而电脑模式,则是将大屏电视变为一个电脑一样,如果连接鼠标或者大屏支持触控,则通过电脑模式是可以直接操作手机的。此时手机只要不关机,是可以继续干其他事情的。这就相当于一个系统分两个用。真是不要太牛逼。

​ 当然还有另外一种投屏方式,应该是大家用的最多的,就是使用DLNA 投屏,将手机播放的视屏,图片,音乐等多媒体投屏到大屏设备播放,此时手机还可以继续干其他事情,甚至关机,也不影响DLNA 的播放。

2. 投屏模式

    1. 手机模式
    1. 电脑模式

    1. DLNA

      如上图播放视屏时点击右上角TV 投屏按钮,即可开启DLNA投屏。

    3.投屏区分

1. DLNA

主要用于视屏,音乐,图片等多媒体的投射。投射时手机和大屏必须在同一局域网中。主要原理还是udp。手机投屏大屏后,手机就可干其他事情,哪怕手机关机,大屏也不会停止播放。

现今社会,基本上视屏,电视,电影,都不是免费的,都需要开会员,而且更可恶的是,同一家app,例如某讯,在电视端和手机端的资源是不互通的。这样就显得DLNA 尤为重要了。

2.Miracast

通过手机setting或者下拉菜单栏里面的投屏进行投屏的,就是用的miracast 协议。
这里面又分手机模式和电脑模式。google 原生支持手机模式镜像。电脑模式目前好像只有华为手机和三星手机支持。

手机模式也就是投屏手机镜像,会将手机的实时页面,同步投屏到大屏上,手机上显示什么,大屏上就显示什么,手机锁屏,大屏锁屏,手机息屏,大屏息屏。

而电脑模式就很像是上面的DLNA 一样,会将一个特定的页面投给大屏,而此时手机可以干其他的事,但不能断开投屏连接。我把这个说为静态页面,把DLNA 那个说为动态页面。

4.进入正题,miracast 投屏电脑模式实现。

与其说是电脑模式实现,不如说是对电脑模式实现的一点思路。因为我也不知道华为是怎么实现的。但我觉得他就说这么实现的。
下面直接上代码:

package com.example.miracast;import android.app.Activity;
import android.app.Presentation;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {private DisplayManager mDisplayManager;private DisplayListAdapter mDisplayListAdapter;private ListView mListView;private final SparseArray<RemotePresentation> mActivePresentations = new SparseArray<RemotePresentation>();private final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() {@Overridepublic void onDisplayAdded(int displayId) {mDisplayListAdapter.updateContents();}@Overridepublic void onDisplayChanged(int displayId) {mDisplayListAdapter.updateContents();}@Overridepublic void onDisplayRemoved(int displayId) {mDisplayListAdapter.updateContents();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.local_display);mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);mDisplayListAdapter = new DisplayListAdapter(this);mListView = (ListView) findViewById(R.id.display_list);mListView.setAdapter(mDisplayListAdapter);}@Overrideprotected void onResume() {super.onResume();mDisplayListAdapter.updateContents();mDisplayManager.registerDisplayListener(mDisplayListener, null);}private void showPresentation(Display display) {RemotePresentation presentation = new RemotePresentation(this, display);mActivePresentations.put(display.getDisplayId(), presentation);presentation.show();}private void hidePresentation(Display display) {final int displayId = display.getDisplayId();RemotePresentation presentation = mActivePresentations.get(displayId);if (presentation == null) {return;}presentation.dismiss();mActivePresentations.delete(displayId);}private final class DisplayListAdapter extends ArrayAdapter<Display> {final Context mContext;private OnCheckedChangeListener mCheckedRemoteDisplay = new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton view, boolean isChecked) {synchronized (mCheckedRemoteDisplay) {final Display display = (Display) view.getTag();if (isChecked) {showPresentation(display);} else {hidePresentation(display);}}}};public DisplayListAdapter(Context context) {super(context, R.layout.list_item);mContext = context;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final View v;if (convertView == null) {v = ((Activity) mContext).getLayoutInflater().inflate(R.layout.list_item, null);} else {v = convertView;}final Display display = getItem(position);//TITLETextView tv = (TextView) v.findViewById(R.id.display_id);tv.setText(display.getName() + "( ID: " + display.getDisplayId() + " )");//DESCRIPTIONtv = (TextView) v.findViewById(R.id.display_desc);tv.setText(display.toString());//SHOW or HIDE the presentationCheckBox cb = (CheckBox) v.findViewById(R.id.display_cb);cb.setTag(display);cb.setOnCheckedChangeListener(mCheckedRemoteDisplay);return v;}public void updateContents() {clear();Display[] displays = mDisplayManager.getDisplays();addAll(displays);}}private final class RemotePresentation extends Presentation {public RemotePresentation(Context context, Display display) {super(context, display);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.remote_display);}}
}

remote_display.xml

<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"tools:context=".MainActivity" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:textSize="22sp"android:textStyle="bold"android:text="Hello world, Remote Display over Miracast!!" /></RelativeLayout>

local_display.xml

<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"tools:context=".MainActivity" ><ListViewandroid:id="@+id/display_list"android:layout_width="match_parent"android:layout_height="wrap_content" /></RelativeLayout>

list_item.xml

<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="wrap_content"android:padding="8dp"><CheckBox android:id="@+id/display_cb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:checked="false"/><TextView android:id="@+id/display_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_toRightOf="@+id/display_cb"android:layout_alignBaseline="@+id/display_cb"android:textSize="18sp"android:textColor="#000000"/><TextView android:id="@+id/display_desc"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/display_cb"android:textSize="14sp"android:textColor="#303030"/>
</RelativeLayout>



这样就实现了,投屏到大屏上后,小屏依然可以干其他事情。这样我们就可以把上面那个remote_display页面写成和电脑的window 桌面一样的launcher。

android 投屏,华为手机的电脑模式是如何实现的相关推荐

  1. android 异源投屏,华为手机如何帅气投屏 无需APP也可以?

    5G时代的加持之下,智能物联网的建设已经步入快车道,全场景智慧生活为大家带来不一样的生活体验.智慧生活的打造离不开每个终端设备的互联协同,从操作到互动,每多一处场景的互动,便会让生活多一分便捷. 从最 ...

  2. android 投屏截图,手机投屏到电脑上怎样截图?图片格式可以这样设置

    现在的手机功能可以说太齐全了,不仅可以满足各种生活需求,办公也不在话下,手机方便归方便,真正办起公来还是电脑更顺手一些,毕竟屏幕比较大,展示的也比较清楚,手机同步电脑也可以的,但是需要连接线才行,不是 ...

  3. 苹果android投屏,iPhone手机如何投屏到智能电视?

    苹果手机投屏电视最简单图文教程,苹果手机iPhone 6S.苹果手机iPhone 7等产品均可实现哦! 准备工具:苹果手机一部.智能电视一台(小编试用电视为酷开电视). 准备工作:将苹果手机和智能电视 ...

  4. android数据线投屏电视机,手机投屏电视的几种方式点评

    手机与电视的多屏互动使用次数已经超过了会议室中办公设备与显示屏幕的互动次数,不得不吐槽:手机投屏电视已经被你们玩坏了.今天小编就来点评一下手机投屏电视的几种方式. 一.使用自带投屏功能的手机 安卓手机 ...

  5. win10无线投屏_手机投屏到电脑竟如此简单?四种方法教你把手机画面声音同时传到电脑...

    怎么把手机画面投到电脑上?手机投屏直播用什么投屏软件?在日常生活中很多人喜欢把手机投屏到电脑上,要么是因为手机屏幕太小,要么是想通过手机投屏到电脑的方式进行直播.其实手机投屏到电脑的方式远远不止一种, ...

  6. win10平板模式_win10电脑投屏到手机

    win10电脑投屏到手机 手机投屏智能电视,相信大家都会操作:电脑投屏到智能电视相信大家也都会操作,难一点的,手机投屏到电脑,在电脑支持Miracast的前提下,经常投屏的朋友也能操作,但是吧电脑无线 ...

  7. android手机变windows8,安卓手机如何把手机界面投屏到windows8/10电脑上

    原标题:安卓手机如何把手机界面投屏到windows8/10电脑上 安卓手机如何把手机界面投屏到windows8/10电脑上 miracast投屏协议只有Win8/10系统才支持,在投屏之前我们需要对电 ...

  8. android投屏到电视机,华为手机如何投屏到电视机上?按步骤,1分钟搞定手机投屏电视机...

    现在,越来越多的人开始用上了华为手机,几乎人手一台.在平时学习.工作中,我也经常使用华为手机来处理.完成很多事项.任务,例如把手机投屏到电视机上.除了满足学习.工作需求,我也经常把手机投屏电视来看视频 ...

  9. 华为手机连接电脑用什么软件_屏幕镜像怎么连接电脑?使用这款软件,轻松投屏苹果手机到电脑...

    原标题:屏幕镜像怎么连接电脑?使用这款软件,轻松投屏苹果手机到电脑 此前小峰在介绍如何通过让安卓手机投屏到电脑的时候,就有很多网友来私信小峰,说介绍了安卓手机,为什么就不介绍苹果手机呢?当时小峰这边确 ...

  10. 苹果android投屏,如何将iPhone手机投屏到电脑电视?

    随着越来越多的智能电视的出现,把手机上播放的影片投放到电视上也越来越常见,我们可以借助APP,也可以借助苹果手机,那你们知道如何将iPhone手机投屏到电脑电视的吗?我们一起来看看怎么做呢! 方法操作 ...

最新文章

  1. SetProcessWorkingSetSize 降低程序运行内存
  2. k8s 命令 重启_快速入门Kubernetes(K8S)——资源清单
  3. redis shutdown (error) ERR Errors trying to SHUTDOWN. Check logs.
  4. Java多线程之并发协作生产者消费者设计模式
  5. Atitit.获取approot api 应用根路径 java c#.net php asp
  6. sharepoint简单说明
  7. java获取本地mac地址
  8. php集中管理,PHPWind 7.5 SP2 公布 三大改良增强营运基本功能
  9. pdn阻抗测试_Hyperlynx仿真PDN阻抗后仿真
  10. Q121:PBRT-V3,光传播方程(The Light Transport Equation)(14.4章节)
  11. 数电笔记之逻辑函数卡诺图化简
  12. Opencv模板匹配学习
  13. 服务器lsass系统错误,电脑开机提示lsass.exe系统错误,安全帐户管理器初始化失败该怎么办?...
  14. 【第38题】2019年OCP认证12C题库062考试最新考试原题
  15. java随机生成车牌号函数
  16. Word2010专项试题
  17. 试证明:如果X→Y,W→Z ,则 XW→YZ。
  18. 基于51单片机的俄罗斯方块小游戏
  19. windows-problem :电脑上网的无线图标带有黄色星号,但不影响正常上网!
  20. C#连接sqlserver数据库,插入数据,并且读取数据库数据画折线图。

热门文章

  1. 【图像处理技术】 | 黑科技解读 之 PS检测、弯曲拉平、切边增强、摩尔纹
  2. 五个金念什么_四个“金”字读什么?
  3. 多读少写的场景 如何提高性能
  4. 旅游推荐系统更新版本
  5. 金融二叉树模型-给期权定价
  6. Java二叉树基础操作常见代码例题
  7. 为什么我的电脑显示rpc服务器不可用,电脑提示RPC服务器不可用解决办法
  8. Ubuntu 查看硬盘容量
  9. 微信小程序直接打开第三方app,如何实现?
  10. deecamp考试题