# uniapp安卓投屏插件demo **Repository Path**: lafengdad/uniapp_dlna_android ## Basic Information - **Project Name**: uniapp安卓投屏插件demo - **Description**: uniapp投屏原生插件安卓示例工程 - **Primary Language**: Android - **License**: Apache-2.0 - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 20 - **Created**: 2023-01-29 - **Last Updated**: 2023-01-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##### 若要使工程跑起来,首先要使用HBuilder生成本地资源包,放到工程对应的目录下,详情请参考官方文档。包括SDK的版本和HBuilder的版本需要对应,配置本地打包key等注意事项。 ##### lyzml_dlna投屏插件2.0版本使用说明: 1、安卓插件增加了音量控制、播放进度监听等接口; 2、安卓插件修改设备返回信息,增加设备唯一标识; 3、安卓插件扫描设备方法和播放方法修改; ``` 本插件通过DLNA协议实现了简易版的投屏功能,支持安卓和IOS,功能很简单, 相对于上个版本 1、修改了扫描接口返回结果; 2、修改了投屏参数; 3、增加了一些控制类接口; 目前有以下几个接口: 扫 描 设 备:lyzmlDLNA.startSearch(callback); 投 屏:lyzmlDLNA.playVideo({udn:"",mediaURL:""},callback); 暂 停 投 屏:lyzmlDLNA.pauseVideo(); 继 续 投 屏:lyzmlDLNA.resumeVideo(second); 结 束 投 屏:lyzmlDLNA.stopVideo(); 设 置 监 听:lyzmlDLNA.setPlayMonitor(callback); 获取扫描结果:lyzmlDLNA.getSearchResult(callback); 获取本机 IP:lyzmlDLNA.getIpAddress(callback); 获取当前音量:lyzmlDLNA.getVolume(); 获取最小音量:lyzmlDLNA.getMinVolumeValue(); 测试了该方法无效,一般默认为0 获取最大音量:lyzmlDLNA.getMaxVolumeValue(); 测试了该方法无效,一般默认为100 设 置 音 量:lyzmlDLNA.setVolume(volume); 设 置 静 音:lyzmlDLNA.setMute(true); 测试了该方法无效,不知道为啥 获取当前播放进度:lyzmlDLNA.getPositionInfo(); 获取视频总时长:lyzmlDLNA.getMediaDuration(); 快进快退:lyzmlDLNA.seek(second); 获取传输状态:lyzmlDLNA.getTransportState(); ``` ``` 1、在需要的页面上获取插件 const lyzmlDLNA = uni.requireNativePlugin('lyzml-DLNA'); ``` ``` 2、开启扫描 lyzmlDLNA.startSearch(resp=>{ if(resp.code == 0){ this.searchingText = "搜索中..."; }else if(resp.code == 1){ //返回扫描的结果,eg: [{ip:"192.168.0.108",name:"xiaomiTV",udn:"uuid:748065fdaa8cbfd53939c2de4e3fcb3865f08dea7d7b227df3fe1a8354c4ee4b"}] this.tvList = resp.result; }else if(resp.code == 2){ this.searchingText = "搜索完成"; } }); 注:该方法相对于1.0版本修改了返回参数格式,{code:0,result:[]}; code:0表示开始搜索,1表示扫描到可用设备并返回,2扫描结束,扫描一段时间自动结束。 扫描到新的设备都会触发此回调,可能会多次回调,返回的结果是所有扫描到的设备列表; 由于同一台设备上可能存在多个接收端,此版本增加了udn返回参数,以区别不同的接收端。 (1.0版本使用的是ip) ``` ``` 3、投屏接口,通过udn来指定投屏设备,将音视频的url投屏到设备上进行播放 lyzmlDLNA.playVideo({ udn:"dsdsdfss111", mediaURL:url },(resp)=>{ //这里有个回调,可以不用 //返回信息{code:"0",desc:"发送指令成功(并不代表投屏成功)"} //code非0时为失败,desc返回失败原因 if(resp && 0!=resp.code){ uni.showToast({ icon: "none", title: "若投屏失败,请尝试重新扫描" }); } }); ``` ``` 4、继 续 投 屏:lyzmlDLNA.resumeVideo(second); 参数为秒,暂停时可记录已播放的进度,pauseVideo()后的继续播放 ``` ``` 5、设置监听,由于投屏发射端和接收端不能做到同步,发出的指令都是异步返回的。 lyzmlDLNA.setPlayMonitor((resp) => { switch (resp.code) { case "1": //onGetTransportState,获取传输状态回调, //共有STOPPED、PLAYING、TRANSITIONING、PAUSED_PLAYBACK、PAUSED_RECORDING、RECORDING、NO_MEDIA_PRESENT、ERR //目前测试只发现以下3种状态,其他的不知道啥场景会触发 let status = resp.result; this.currPlayState = status; if ("PLAYING" == status) { this.isPlaying = true; } else if ("PAUSED_PLAYBACK" == status || "STOPPED" == status) { this.isPlaying = false; } break; case "2": //onGetMediaDuration,获取视频时长回调 this.durationSecond = resp.result; this.durationStr = ut.turnSSToHHMISS(this.durationSecond); break; case "3": //onMuteStatusChanged,设置静音状态的回调,测试了静音不生效,不知道为啥 this.isMute = resp.result; break; case "4": //onVolumeChanged,音量变化回调 this.currVolume = resp.result; break; case "5": //onPlay,开始播放回调 this.isPlaying = true; break; case "6": //onPause,暂停播放回调 this.isPlaying = false; break; case "7": //onStop,结束播放回调 this.isPlaying = false; break; case "8": //onProgressUpdated,播放进度回调,会出现一下跳好几秒的情况,并不是每一秒回调一次 this.currTimeSecond = resp.result; this.currTimeStr = ut.turnSSToHHMISS(this.currTimeSecond); break; case "9": //onSeekComplete,快进快退回调 this.getTransportState(); break; case "10": //onError,调用发生错误时的回调,可以打印出来看看,调试的时候可以看看,有时候莫名奇妙会不停回调错误 break; default: break; } }); ``` ``` 5、可以主动调用接口获取扫描到的结果,这个接口就算是停止扫描后也可以获取到之前扫描的结果,返回的结果和startSearch的回调结果一致: lyzmlDLNA.getSearchResult((devList)=>{ //返回扫描的结果,eg: [{ip:"192.168.0.108",name:"xiaomiTV","udn":"uuid:748065fdaa8cbfd53939c2de4e3fcb3865f08dea7d7b227df3fe1a8354c4ee4b"}] }); ``` ``` 6、获取本机IP:lyzmlDLNA.getIpAddress((ip)=>{ console.log("====getIPAddress====",ip); }); ```