Einfach UPnP / DLNA-control-point für Android-mit CyberGarage CyberLink for Java
Ich möchte schreiben Sie einen UPnP-control-point-App für Android mit der CyberGarage "CyberLink for Java" - API. Zum testen der API, die ich implementiert eine sehr einfache Anwendung. In dieser Anwendung eine UPnP control point aktiv sucht nach allen UPnP-root-Geräte, überwacht die Antworten und Gerät Benachrichtigungen, und druckt eine Liste der Geräte, die im Netzwerk verfügbar sind.
Die app läuft auf einem Android-Handy, aber keiner der UPnP-Geräte im Netzwerk gefunden werden. Ich habe versucht dies auf zwei verschiedenen Android-Handys. Um zu überprüfen, ob dies ein Android-spezifisches problem, ich implementiert die gleiche Funktionalität wie ein Java Konsole-Anwendung. Interessanterweise wird die Java-Konsole-Anwendung funktioniert absolut in Ordnung und zeigt stets alle UPnP-Geräte in meinem Netzwerk!
Also warum funktioniert das nicht unter Android? Beachten Sie, in der Android-app hatte ich zum implementieren der Netzwerk-spezifische Funktionen in einem separaten thread mit AsyncTask. Sonst bekomme ich Fehler, da ich nicht laufen soll diese auf dem UI-thread. Aber das sollte nicht das problem sein, hab ich Recht?
Unterhalb der source-code der beiden Anwendungen.
Android-Anwendung:
MainActivity.java
package com.example.controller_v1;
import org.cybergarage.upnp.DeviceList;
import org.cybergarage.upnp.UPnP;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Process;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UPnP.setEnable(UPnP.USE_ONLY_IPV4_ADDR);
new StartControlPointTask().execute();
}
private class StartControlPointTask extends AsyncTask {
public static final String TAG = "StartControlPointTask";
@Override
protected Object doInBackground(Object... params) {
Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
MyControlPoint controlPoint = new MyControlPoint();
controlPoint.start();
// controlPoint.search();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
DeviceList rootDevices = controlPoint.getDeviceList();
int numDevices = rootDevices.size();
if (numDevices > 0) {
for (int i = 0; i < numDevices; i++) {
Log.i(TAG, "device " + i + ": " + rootDevices.getDevice(i).getFriendlyName());
}
} else {
Log.i(TAG, "no root devices found");//
}
return null;
}
}
}
MyControlPoint.java
package com.example.controller_v1;
import org.cybergarage.upnp.ControlPoint;
import org.cybergarage.upnp.device.NotifyListener;
import org.cybergarage.upnp.device.SearchResponseListener;
import org.cybergarage.upnp.ssdp.SSDPPacket;
import android.util.Log;
public class MyControlPoint extends ControlPoint implements NotifyListener, SearchResponseListener {
public MyControlPoint() {
addNotifyListener(this);
addSearchResponseListener(this);
}
@Override
public void deviceNotifyReceived(SSDPPacket ssdpPacket) { //NotifyListener
final String TAG = "deviceNotifyReceived";
Log.i(TAG, "executed");
}
@Override
public void deviceSearchResponseReceived(SSDPPacket ssdpPacket) { //SearchResponseListener
final String TAG = "deviceSearchResponseReceived";
Log.i(TAG, "executed");
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.controller_v1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.controller_v1.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Java Konsole-Anwendung:
Main.java
import org.cybergarage.upnp.DeviceList;
import org.cybergarage.upnp.UPnP;
public class Main {
public Main() {
UPnP.setEnable(UPnP.USE_ONLY_IPV4_ADDR);
MyControlPoint controlPoint = new MyControlPoint();
controlPoint.start();
// controlPoint.search();
try {
Thread.sleep(5000); //wait for devices to be found
} catch (InterruptedException e) {
e.printStackTrace();
}
DeviceList rootDevices = controlPoint.getDeviceList();
int numDevices = rootDevices.size();
if (numDevices > 0) {
for (int i = 0; i < numDevices; i++) {
System.out.println("found device " + i + ": " + rootDevices.getDevice(i).getFriendlyName());
}
} else {
System.out.println("no root devices found");
}
}
public static void main(String[] args) {
new Main();
}
}
MyControlPoint.java
import org.cybergarage.upnp.ControlPoint;
import org.cybergarage.upnp.device.NotifyListener;
import org.cybergarage.upnp.device.SearchResponseListener;
import org.cybergarage.upnp.ssdp.SSDPPacket;
public class MyControlPoint extends ControlPoint implements /*DeviceChangeListener,*/ NotifyListener, SearchResponseListener {
public MyControlPoint() {
addNotifyListener(this);
addSearchResponseListener(this);
}
@Override
public void deviceNotifyReceived(SSDPPacket packet) { //NotifyListener
System.out.println("deviceNotifyReceived");
}
@Override
public void deviceSearchResponseReceived(SSDPPacket packet) { //SearchResponseListener
System.out.println("deviceSearchReceived");
}
}
Ich habe keine Ahnung, warum die java-Konsole-Anwendung funktioniert und die android-Anwendung nicht. Ich bekomme keine Antwort von der Dokumentation. Kann mir keiner helfen?
- Sie haben Netzwerk-Berechtigung aktiviert AndroidManifest.xml? ein weiterer möglicher Grund: Sie zwingen zu IPv4-Adressen verwenden, wenn Ihr Gerät konfiguriert ist, um IPv6 verwenden zu können, als Sie keine Adressen haben 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hob ich Ihren code, kompiliert es mit Eclipse ADT und es lief auf einer virtuellen Maschine (VMWare player) mit Android 4.0 (eeepc).
Gibt es eine Android-Sektion auf CyberGarage website, die sagt, dass CyberLink nicht laufen auf dem emulator noch, als es keine Unterstützung von multicast-und doch, vielleicht ist/war Ihr problem.
Hoffe nicht zu spät, um zu helfen.
Andrew
In meinem Fall ist es mit allen Geräten, kann sein, weil ich Kontrolle mit Telefon eher emulator.