# VideoDlnaScreen **Repository Path**: TTwei/VideoDlnaScreen ## Basic Information - **Project Name**: VideoDlnaScreen - **Description**: No description available - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2025-01-06 - **Last Updated**: 2025-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **视频投屏,支持网络投屏和本地投屏** ## **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)