Android 音乐投放dlna DMS功能实现
1、功能说明
在安卓设备上实现音频dlna DMS投放:安卓设备做主设备,把本地音频投放到dlna协议的设备上播放;
主要功能:1)搜索当前网络上有没有dlna设备;
2)读取本地音频文件;
3)音频播放、暂停、下一首、上一首、音量控制。
2、功能
1)搜索dlna设备
调用服务连接
private void initConnection() {
connection = new ServiceConnection() {
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
manageDLNA.setUpnpService((AndroidUpnpService) arg1); // 获得服务对象
manageDLNA.getListInfo().clear();
InetAddress inetAddress = getLocalIpAddress(MainActivity.this);
if (manageDLNA.getMediaServer() == null && inetAddress != null) {
try {
mediaServer = new MediaServer(inetAddress);
manageDLNA.setMediaServer(mediaServer);
} catch (ValidationException e) {
e.printStackTrace();
}
}
manageDLNA.getUpnpService().getRegistry()
.addDevice(manageDLNA.getMediaServer().getDevice());
manageDLNA.addServiceDevices(manageDLNA.getMediaServer().getDevice());
manageDLNA.prepareMediaServer(MainActivity.this);
// 绑定接口
manageDLNA.getUpnpService().getRegistry()
.addListener(registryListener);
// 开始搜索设备
manageDLNA.getUpnpService().getControlPoint().search();
showProgressDialog();
}
public void onServiceDisconnected(ComponentName arg0) {
manageDLNA.setCuurentInfo(null);
manageDLNA.setUpnpService(null);
manageDLNA.setServerPrepared(false);
}
};
}
监听接口
class BrowseRegistryListener extends DefaultRegistryListener {
@Override
public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
String Type = device.getType().getType();
if(Type.equalsIgnoreCase("MediaServer")){
manageDLNA.addServiceDevices(device);
//changDMSdata(0);
handler.sendEmptyMessage(0);
// manageDLNA.addServiceDevices(manageDLNA.getMediaServer().getDevice());
// handler.sendEmptyMessage(0);
}
if(Type.equalsIgnoreCase("MediaRenderer")){
manageDLNA.addDevices(device);
//changDMRdata(0);
handler.sendEmptyMessage(1);
String dd = device.getIdentity().getUdn().toString();
String ggg = device.getIdentity().getDescriptorURL().toString();
String nn = device.getDetails().getFriendlyName();
}
}
@Override
public void remoteDeviceRemoved(Registry registry, RemoteDevice device) {
String Type = device.getType().getType();
if(Type.equalsIgnoreCase("MediaServer")){
manageDLNA.deleteServiceDevices(device);
//changDMSdata(1);
handler.sendEmptyMessage(2);
}
if(Type.equalsIgnoreCase("MediaRenderer")){
manageDLNA.deleteDevices(device);
//changDMRdata(1);
handler.sendEmptyMessage(3);
}
}
@Override
public void localDeviceAdded(Registry registry, LocalDevice device) {
String Type = device.getType().getType();
if(Type.equalsIgnoreCase("MediaServer")){
manageDLNA.addServiceDevices(device);
//changDMSdata(0);
handler.sendEmptyMessage(0);
}
if(Type.equalsIgnoreCase("MediaRenderer")){
manageDLNA.addDevices(device);
changDMRdata(0);
}
}
@Override
public void localDeviceRemoved(Registry registry, LocalDevice device) {
String Type = device.getType().getType();
if(Type.equalsIgnoreCase("MediaServer")){
manageDLNA.deleteServiceDevices(device);
changDMSdata(1);
}
if(Type.equalsIgnoreCase("MediaRenderer")){
manageDLNA.deleteDevices(device);
changDMRdata(1);
}
}
}
添加设备
private void changDMSdata(int o){
if(o == 0){
if(adapterDMS != null){
if(listServiceInfo != null){
for(int i = 0; i < ManageDLNA.getInstance().getSerListInfo().size(); i++){
if(!listServiceInfo.contains(ManageDLNA.getInstance().getSerListInfo().get(i))){
listServiceInfo.add(ManageDLNA.getInstance().getSerListInfo().get(i));
}
}
adapterDMS.setData(listServiceInfo);
adapterDMS.notifyDataSetChanged();
}
}
}else if(o == 1){
if(adapterDMS != null){
if(listServiceInfo != null){
for(int i = 0; i < listServiceInfo.size(); i++){
if(!ManageDLNA.getInstance().getSerListInfo().contains(listServiceInfo.get(i))){
listServiceInfo.remove(i);
}
}
adapterDMS.setData(listServiceInfo);
adapterDMS.notifyDataSetChanged();
}
}
}
}
private void changDMRdata(int o){
if(o == 0){
if(adapter != null){
if(listDeviceInfo != null){
for(int i = 0; i < ManageDLNA.getInstance().getListInfo().size(); i++){
if(!listDeviceInfo.contains(ManageDLNA.getInstance().getListInfo().get(i))){
DeviceInfo dd = manageDLNA.getListInfo().get(i);
// listDeviceInfo.add(ManageDLNA.getInstance().getListInfo().get(i));
listDeviceInfo.add(dd);
}
}
adapter.setData(listDeviceInfo);
adapter.notifyDataSetChanged();
}
}
}else if(o == 1){
if(adapter != null){
if(listDeviceInfo != null){
for(int i = 0; i < listDeviceInfo.size(); i++){
if(!ManageDLNA.getInstance().getListInfo().contains(listDeviceInfo.get(i))){
if(!"Local Play".equals(listDeviceInfo.get(i).getName()))
listDeviceInfo.remove(i);
}
}
adapter.setData(listDeviceInfo);
adapter.notifyDataSetChanged();
}
}
}
}
2)读取本地文件
OnItemClickListener contentItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
// TODO Auto-generated method stub /storage/sdcard0/kgmusic/download/张学友 - 一路上有你.mp3
ContentItem content = contentListAdapter.getItem(position);
if (content.isContainer()) {
manageDLNA.getUpnpService().getControlPoint().execute(
new ContentBrowseActionCallback(MainActivity.this,
content.getService(), content.getContainer(),
contentListAdapter));
onback.add(content);
}else {
if(DMSSelect != -1 && DMRSelect != -1){
Intent intent = new Intent();
intent.setClass(MainActivity.this, GPlayer.class);
intent.putExtra("DMSSelect", DMSSelect);
intent.putExtra("DMRSelect", DMRSelect);
intent.putExtra("audio", position);
intent.putExtra("title", content.toString());
ArrayList<String> url = new ArrayList<String>();
for(int i = 0,l = contentListAdapter.getCount();i<l;i++){
url.add(contentListAdapter.getItem(i).getItem().getFirstResource().getValue());
}
intent.putExtra("playURI", contentListAdapter.getItem(position).getItem().getFirstResource().getValue());
intent.putStringArrayListExtra("contentListAdapter", url);
startActivity(intent);
}
}
}
};
3)音频播放、暂停、下一首、上一首、音量控制
public boolean beginPlay(Service mediaRender) {
ControlPoint controlPoint = ManageDLNA.getInstance().getUpnpService().getControlPoint();
if (mediaRender == null) {
return false;
}
controlPoint.execute(new Play(mediaRender){
public void success(ActionInvocation invocation) {
System.out.println("success~~~~~~~~~~success");
}
public void failure(ActionInvocation arg0, UpnpResponse arg1,
String arg2) {
System.out.println("failure~~~~~~~~~~failure3333333");
}
});
System.out.println("pauseMuisc~~~~~~~~pauseMuisc222");
return false;
}
public boolean stopMuisc(Service mediaRender) {
ControlPoint controlPoint = ManageDLNA.getInstance().getUpnpService().getControlPoint();
if (mediaRender == null) {
return false;
}
controlPoint.execute(new Stop(mediaRender){
public void success(ActionInvocation invocation) {
}
public void failure(ActionInvocation arg0, UpnpResponse arg1,
String arg2) {
System.out.println("failure~~~~~~~~~~failure");
}
});
return false;
}
public boolean pauseMuisc(Service mediaRender) {
ControlPoint controlPoint = ManageDLNA.getInstance().getUpnpService().getControlPoint();
if (mediaRender == null) {
return false;
}
controlPoint.execute(new Pause(mediaRender){
public void failure(ActionInvocation arg0, UpnpResponse arg1,
String arg2) {
System.out.println("failure~~~~~~~~~~failure3333333");
}
});
System.out.println("pauseMuisc~~~~~~~~pauseMuisc222");
return false;
}
demo 下载:http://download.youkuaiyun.com/download/workwayli/10113142