2012-08-22 7 views
5

Ich habe Gerät, das Daten sendet über Bluetooth mit OBEX Object Push Profile (OPP).Empfangen von Datei per Bluetooth über OBEX Objekt PushProfile

Mit adb logcat ich sehe, dass mein Android-Gerät eine Verbindung erhält (aber diese Verbindung abbrechen?)

08-22 11:14:37.939: I/BtOppRfcommListener(22586): Accepted connectoin from 00:07:CF:5F:52:A0 
08-22 11:14:37.939: I/BtOpp Service(22586): Start Obex Server 
08-22 11:14:38.109: D/Obex ServerSession(22586): java.io.IOException: Software caused connection abort 
08-22 11:14:38.109: D/PowerManagerService(180): @PowerManagement: 'BtOppObexServer' releaseWakeLock when screen locked 
08-22 11:14:39.219: D/BluetoothEventLoop(180): Device property changed: 00:07:CF:5F:52:A0 property: Connected value: false 

Wenn ich Bluetooth File Transfer (Free-Anwendung von Markt) installieren dann ich in der Lage bin Dateien zu empfangen . Aber ich möchte keine andere Anwendung installieren.

+0

verbinden Könnten Sie den Code in Frage, so dass die Android-Experten auf SO einen Blick auf th e Problem? –

+0

Hilft das? http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not-working – domsom

+0

@domsom Ich hatte bereits ähnlichen Code ohne Erfolg versucht. IMO scheint das Problem zu sein, dass das native Bluetooth immer noch die eingehenden OPP-Daten akzeptiert und der benutzerdefinierte Code nicht ausgelöst wird. Daher würde die Lösung beinhalten, nicht nur auf eingehende Verbindungen zu hören, sondern sich auch mit dem nativen Bluetooth zu "registrieren", so dass der benutzerdefinierte OPP-Handler aufgerufen wird. –

Antwort

2

Ich glaube, ich habe (zumindest eine teilweise) Lösung, die dann Dateien über OPP abgefangen und benutzerdefinierten Code hinzugefügt werden sollte. Der erste Schritt ist, um die Einstellungen> Apps gehen> laufen> Bluetooth Teile und töten die BluetoothOppService

Dann habe ich Reflexion eine Methode für den Zugriff auf BluetoothAdapter (Code unten), die an einem bestimmten Port ermöglicht es hören. Danach können wir die eingehende OPP-Kommunikation abfangen und mit den Eingangs- und Ausgangsströmen interagieren. This SO wird Gewinde mit dem Teil OPP Kommunikation helfen, aber als ersten Schritt gelesen I den Datenstrom und reponded mit einem OPP 'OK' Nachricht dh os.writeByte(ObexSession.OBEX_SUCCESS | ObexSession.OBEX_FINAL_BIT);

// simplified exception handling 
public class BluetoothAdapterProxy 
{ 
    public static final int CHANNEL_OPP = 12; 

    final BluetoothAdapter target; 
    static final Class<?> targetClass = BluetoothAdapter.class; 
    Method listenOn; 

    public BluetoothAdapterProxy(BluetoothAdapter target) 
    { 
     this.target = target; 
     Class<?>[] args = new Class[] { int.class }; 
     try 
     { 
      this.listenOn = targetClass.getDeclaredMethod(
       "listenUsingRfcommOn", args); 
     } 
     catch (NoSuchMethodException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public BluetoothServerSocket listenUsingRfcommOn(int channel) 
    { 
     try 
     { 
      return (BluetoothServerSocket) (listenOn.invoke(target, 
       new Object[] { channel })); 
     } 
     catch (Exception e) 
     { 
      // complain loud, complain long 
      throw new RuntimeException(ex); 
     } 
    } 
} 

Usage: Initialisierung unter Verwendung

serverSocket = new BluetoothAdapterProxy(BluetoothAdapter.getDefaultAdapter()) 
    .listenUsingRfcommOn(BluetoothAdapterProxy.CHANNEL_OPP); 

Danach verwenden Sie die folgenden von einem separaten Thread (um Blockierung zu verhindern) und Remote-Geräte können über socket = serverSocket.accept();

+0

Ich sehe nicht, warum Sie hierfür eine Wrapper-Klasse benötigen, aber trotzdem: Sie können möglicherweise die öffentliche 'BluetoothDevice.listenUsingRfcommWithServiceRecord()' Methode mit der OPP UUID '00001105-0000-1000-8000-00805f9b34fb' verwenden. Der Schlüssel zu Ihrem Problem ist wahrscheinlich, dass ein anderer (System-) Dienst bereits den OBEX-Kanal abhört. Entweder können Sie mit der von Ihnen angegebenen "kill" -Lösung leben oder Sie verwenden den Systemdienst und überwachen ihn wie hier: http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not- Arbeiten – domsom

+0

die Wrapper-Klasse wird verwendet, um eine Methode von der "versteckten Android API", Code, der zur Laufzeit sichtbar ist aber von der veröffentlichten API und Android.jar ausgeschlossen. Ich habe große Mengen an Testcode, der die veröffentlichte API untersucht - das Abhören ist kein Problem, aber keiner der Versuche hat benutzerdefinierten Code aktiviert, um auf externe OPP-Daten zu reagieren. –

+0

Ich sollte auch erwähnen, dass der eingegebene Beispielcode keine vollständige Lösung ist, da ich festgestellt habe, dass er sich auf verschiedenen Geräten immer noch anders verhält. Es ist in der Lage, Daten über OPP auf meinem HTC One X zu empfangen, aber verhält sich anders und nicht ganz erfolgreich auf dem Samsung Nexus S und Galaxy Tab 2. –