# **视频投屏,支持网络投屏和本地投屏**

## **android Dlna开发**

[GitHub主页](https://github.com/yanbo469/VideoDlnaScreen)

## 集成方式

### 添加依赖

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

```java

allprojects {

repositories {

...

maven { url 'https://www.jitpack.io' }

maven {url 'http://4thline.org/m2'}

}

}

```

Step 2. Add the dependency

```java

android {

//必须添加,不加会报错

packagingOptions {

exclude 'META-INF/beans.xml'

}

}

dependencies {

compileOnly 'javax.enterprise:cdi-api:2.0'

implementation 'com.github.yanbo469:VideoDlnaScreen:v1.0'

}

```

Step 3. Add the Initialization

```java

public class Application {

@Override

public void onCreate() {

super.onCreate();

//初始化

VApplication.init(this);

}

}

```

Step 4.使用方法

```java

//使用前先注册服务

ClingManager.getInstance().startClingService();

//得到当前搜索到的所有设备

private List clingDevices;

/**

* 基于EventBus,回调会回来的值来显示当前找到的设备

*/

@Subscribe(threadMode = ThreadMode.MAIN)

public void onEventBus(DeviceEvent event) {

clingDevices = DeviceManager.getInstance().getClingDeviceList();

}

@Override

public void onStart() {

super.onStart();

EventBus.getDefault().register(this);

}

@Override

public void onStop() {

super.onStop();

EventBus.getDefault().unregister(this);

}

//选择你要投屏的设备;

DeviceManager.getInstance().setCurrClingDevice(ClingDevice);

//设置网络投屏的信息

RemoteItem itemurl1 = new RemoteItem("一路之下", "425703", "张杰",107362668, "00:04:33", "1280x720", url1);

//添加网络投屏的信息

ClingManager.getInstance().setRemoteItem(itemurl1);

//设置本地投屏的信息

private List objectList;

final DIDLObject object = objectList.get(position);

if (object instanceof Container) {

//得到本地文件夹

Container container = (Container) object;

//点进文件夹刷新数据List objectList

ClingManager.getInstance().searchLocalContent(containerId);

} else if (object instanceof Item) {

//得到本地文件

Item item = (Item) object;

// 设置本地投屏的信息

ClingManager.getInstance().setLocalItem(item);

}

public Item localItem;

public RemoteItem remoteItem;

localItem = ClingManager.getInstance().getLocalItem();

remoteItem = ClingManager.getInstance().getRemoteItem();

/**

* 播放开关

*/

private void play() {

if (ControlManager.getInstance().getState() == ControlManager.CastState.STOPED) {

if (localItem != null) {

newPlayCastLocalContent();

} else {

newPlayCastRemoteContent();

}

} else if (ControlManager.getInstance().getState() == ControlManager.CastState.PAUSED) {

playCast();

} else if (ControlManager.getInstance().getState() == ControlManager.CastState.PLAYING) {

pauseCast();

} else {

Toast.makeText(getBaseContext(), "正在连接设备,稍后操作", Toast.LENGTH_SHORT).show();

}

}

/**

* 本地投屏

*/

private void newPlayCastLocalContent() {

ControlManager.getInstance().setState(ControlManager.CastState.TRANSITIONING);

ControlManager.getInstance().newPlayCast(localItem, new ControlCallback() {

@Override

public void onSuccess() {

ControlManager.getInstance().setState(ControlManager.CastState.PLAYING);

ControlManager.getInstance().initScreenCastCallback();

runOnUiThread(new Runnable() {

@Override

public void run() {

playView.setImageResource(R.mipmap.ic_launcher_round);

}

}

@Override

public void onError(int code, String msg) {

ControlManager.getInstance().setState(ControlManager.CastState.STOPED);

showToast(String.format("New play cast local content failed %s", msg));

});

}

/**

* 网络投屏

*/

private void newPlayCastRemoteContent() {

ControlManager.getInstance().setState(ControlManager.CastState.TRANSITIONING);

ControlManager.getInstance().newPlayCast(remoteItem, new ControlCallback() {

@Override

public void onSuccess() {

ControlManager.getInstance().setState(ControlManager.CastState.PLAYING);

ControlManager.getInstance().initScreenCastCallback();

runOnUiThread(new Runnable() {

@Override

public void run() {

playView.setImageResource(R.mipmap.ic_launcher_round);

}

});

}

@Override

public void onError(int code, String msg) {

ControlManager.getInstance().setState(ControlManager.CastState.STOPED);

showToast(String.format("New play cast remote content failed %s", msg));

}

});

}

/**

* 播放

*/

private void playCast() {

ControlManager.getInstance().playCast(new ControlCallback() {

@Override

public void onSuccess() {

ControlManager.getInstance().setState(ControlManager.CastState.PLAYING);

runOnUiThread(new Runnable() {

@Override

public void run() {

playView.setImageResource(R.mipmap.ic_launcher_round);

}

});

}

@Override

public void onError(int code, String msg) {

showToast(String.format("Play cast failed %s", msg));

}

});

}

/**

* 暂停

*/

private void pauseCast() {

ControlManager.getInstance().pauseCast(new ControlCallback() {

@Override

public void onSuccess() {

ControlManager.getInstance().setState(ControlManager.CastState.PAUSED);

runOnUiThread(new Runnable() {

@Override

public void run() {

playView.setImageResource(R.mipmap.ic_launcher_round);

}

});

}

@Override

public void onError(int code, String msg) {

showToast(String.format("Pause cast failed %s", msg));

}

});

}

/**

* 退出投屏

*/

private void stopCast() {

ControlManager.getInstance().stopCast(new ControlCallback() {

@Override

public void onSuccess() {

ControlManager.getInstance().setState(ControlManager.CastState.STOPED);

runOnUiThread(new Runnable() {

@Override

public void run() {

playView.setImageResource(R.mipmap.ic_launcher_round);

finish();

}

});

}

@Override

public void onError(int code, String msg) {

showToast(String.format("Stop cast failed %s", msg));

}

});

}

/**

* 改变投屏进度

*/

private void seekCast(int progress) {

String target = VMDate.toTimeString(progress);

ControlManager.getInstance().seekCast(target, new ControlCallback() {

@Override

public void onSuccess() {

}

@Override

public void onError(int code, String msg) {

showToast(String.format("Seek cast failed %s", msg));

}

});

}

/**

* 设置音量大小

*/

private void setVolume(int volume) {

currVolume = volume;

ControlManager.getInstance().setVolumeCast(volume, new ControlCallback() {

@Override

public void onSuccess() {

}

@Override

public void onError(int code, String msg) {

showToast(String.format("Set cast volume failed %s", msg));

}

});

}

}

```

## 参考感谢

[Cling DLNA库](https://github.com/4thline/cling)

[DLNA 百科介绍](https://baike.baidu.com/item/DLNA)

[简书-细卷子](https://www.jianshu.com/p/4452182d2b48)

[hubing8658/UPnP-DLNA-Demo](https://github.com/hubing8658/UPnP-DLNA-Demo)

[kevinshine/BeyondUPnP](https://github.com/kevinshine/BeyondUPnP)

一键复制

编辑

Web IDE

原始数据

按行查看

历史

原 android dlna投屏,README.md · Royal520/VideoDlnaScreen - Gitee.com相关推荐

  1. Android dlna 投屏

    android dlna 投屏demo github地址 https://github.com/liulei9385/CyberLink4Android

  2. android 投屏开发框架,Android DLNA投屏-基于CyberGarage开发投屏功能

    在上一篇博客<Android DLNA投屏-基本原理>中,讲到了DLNA的一些基本原理.了解这些基本原理,对开发是很有帮助的.但仅仅依据原理去进行Android DLNA开发,是比较困难的 ...

  3. Android DLNA投屏-基本原理

    转 https://www.jianshu.com/p/19934892a235 1. DLNA简介 DLNA(Digital Living Network Alliance),即数字家庭网络联盟. ...

  4. mx播放器有没有投屏功能_芝杜DLNA投屏功能

    DLNA投屏是一个非常高效实用的功能,也是众多高端家用播放器必备功能之一. 简而言之,便是把手机或平板电脑(同时支持苹果与安卓)中的界面,比如在线视频.音乐软件,直接通过播放器投射在电视机大屏幕上. ...

  5. dlna投屏显示服务器没互动,投屏时,提示没搜索到电视

    原标题:投屏时,提示没搜索到电视 投屏,搜索不到电视设备解决方案 把手机视频投屏电视看,想必很多人都用过,作为忠实的爱好着.每天回家看剧,必投屏.但是仍然有很多人不会投屏,经常遇到的问题就是手机APP ...

  6. android 投屏 app 三星,[图]为何Windows 10的Android应用投屏功能仅限于三星手机?

    原标题:[图]为何Windows 10的Android应用投屏功能仅限于三星手机? 在 Windows 10 May 2020(20H1/Version 2004)功能更新中,微软引入了名为" ...

  7. Android PC投屏简单尝试—最终章2

    源码地址:https://github.com/deepsadness/AppRemote 上一章中,我们简单实现了PC的投屏功能. 但是还是存在这一些缺陷. 屏幕的尺寸数据是写死的 不能通过PC来对 ...

  8. Android PC投屏简单尝试—最终章1

    回顾之前的几遍文章,我们分别通过RMTP协议和简单的Socket 发送Bitmap图片的Base64编码来完成投屏. 回想这系列文章的想法来源-Vysor,它通过 USB来进行连接的.又看到了 scr ...

  9. Android PC投屏简单尝试(录屏直播)2—硬解章(MediaCodec+RMTP)

    代码地址 :https://github.com/deepsadness/MediaProjectionDemo 想法来源 上一边文章的最后说使用录制的Api进行录屏直播.本来这边文章是预计在5月份完 ...

最新文章

  1. linux定时执行python脚本_linux定时执行python脚本的方法以及失败不执行的处理方法...
  2. LeanCloud数据更新不同步问题
  3. Spring之Bean的配置(二)
  4. vue --- 使用vue-router获取带参数的路由
  5. mysql 取左_MySQL select语句从字符串左侧获取5个字符
  6. 石头剪刀布 -2013编程之美全国测试赛 每日一练
  7. 【Java】浅谈Java的GUI开发
  8. SSL请求trustStore的两种注册方式
  9. flink 本地_Flink 01 | 十分钟搭建第一个Flink应用和本地集群
  10. 小农民在深山树林里发现古墓_“快来!快来!这边有一个洞!”秦岭多古墓,难不成还真碰到了?...
  11. STEP 7 V5.5 版本特性
  12. Android安全-应用沙盒简述
  13. sha1校验工具 linux,Linux怎么校验SHA1和MD5
  14. solve函数c语言_c语言:回溯解数独程序
  15. 实现用户注册功能的代码
  16. php计算一年多少周,同时计算出这一周的开始时间和结束时间(可选返回时间戳或日期)
  17. java 字段排序_Java多字段排序之冒泡
  18. Qt读写JSON,以及使用QTreeView展示和编辑JSON数据
  19. 计算机键盘上的星号代表,电脑上星号怎么打(键盘p打出来是星号)
  20. 展现工匠精神的德国“开放数据”国家行动计划

热门文章

  1. 终于鼓起勇气给论文作者发送邮件要数据集和代码
  2. 智能充电桩应用解决方案
  3. Go语言项目实战:基于开源数据的成语查询
  4. word2013html,Word 2013
  5. 新手角色快速建模步骤
  6. 11G GI 安装同时跑脚本测试
  7. Python金融数据挖掘 第八章 复习思考题2
  8. RBAC权限管理的一点小改进
  9. P4869 albus就是要第一个出场(线性基+集合规律)
  10. BUUCTF--[HCTF 2018]Hideandseek