视频投屏,支持网络投屏和本地投屏
android Dlna开发
集成方式
添加依赖
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
maven {url 'http://4thline.org/m2'}
}
}
Step 2. Add the dependency
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
public class Application {
@Override
public void onCreate() {
super.onCreate();
//初始化
VApplication.init(this);
}
}
Step 4.使用方法
//使用前先注册服务
ClingManager.getInstance().startClingService();
//得到当前搜索到的所有设备
private List<ClingDevice> 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<DIDLObject> objectList;
final DIDLObject object = objectList.get(position);
if (object instanceof Container) {
//得到本地文件夹
Container container = (Container) object;
//点进文件夹刷新数据List<DIDLObject> 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));
}
});
}
}