2012-08-22 21 views
5

Tengo un dispositivo que envía datos a través de Bluetooth utilizando OBEX Object Push Profile (OPP).Recibir archivo por Bluetooth a través del OBEX Object PushProfile

Usando Logcat ADB veo que mi dispositivo Android recibe una conexión (pero abortar esta conexión?)

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 

Cuando instalo transferencia de archivos Bluetooth (aplicación gratuita de mercado) entonces yo soy capaz de recibir archivos . Pero no me gustaría instalar otra aplicación.

+0

¿Podría publicar el código en cuestión para que los expertos en Android en SO puedan echar un vistazo a th ¿e problema? –

+0

¿Esto ayuda? http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not-working – domsom

+0

@domsom Ya había intentado un código similar sin éxito. El problema parece ser que el Bluetooth nativo aún acepta los datos OPP entrantes y no se activa el código personalizado. Por lo tanto, la solución implicaría no solo escuchar las conexiones entrantes sino también 'registrarse' con el Bluetooth nativo para que se llame al controlador OPP personalizado. –

Respuesta

2

Creo que tengo (al menos una solución parcial) que debería permitir que los archivos sean interceptados a través de OPP y se agregue código personalizado. El primer paso es ir a Ajustes> Aplicaciones> ejecutar> Bluetooth y Compartir matan al BluetoothOppService

Luego utiliza la reflexión para acceder a un método en BluetoothAdapter (código de abajo) que permite la escucha en un puerto específico. Después de lo cual podemos interceptar la comunicación OPP entrante e interactuar con los flujos de entrada y salida. This SO hilo ayudará con la parte de comunicación OPP, pero como un paso inicial I leer el flujo de datos y reponded con el mensaje de un OPP 'OK' es decir 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); 
     } 
    } 
} 

Uso: inicializar usando

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

Después de lo cual, utilice lo siguiente de un Thread (para evitar el bloqueo) y los dispositivos remotos se pueden conectar a través de socket = serverSocket.accept();

+0

No veo por qué necesita una clase contenedora para esto, pero de todos modos: es posible que pueda utilizar el método público 'BluetoothDevice.listenUsingRfcommWithServiceRecord()' utilizando el OPP UUID '00001105-0000-1000-8000-00805f9b34fb'. La clave de su problema probablemente sea que otro servicio (del sistema) ya esté escuchando en el canal OBEX. Entonces, o puede vivir con la solución "kill" que indicó, o puede utilizar el servicio del sistema y supervisarlo como aquí: http://stackoverflow.com/questions/3625959/android-rfcomm-with-obex-push-not- trabajando – domsom

+0

la clase contenedora se utiliza para acceder a un método desde el código 'api android oculto', que es visible en el tiempo de ejecución pero se excluye de la API publicada y de android.jar. Tengo una gran cantidad de código de prueba probando la API publicada; escuchar no es un problema, sin embargo, ninguna de las pruebas ha permitido que el código personalizado responda a datos de OPP externos. –

+0

También debo mencionar que el código de muestra publicado no es una solución completa, ya que he encontrado que todavía se comporta de manera diferente en diferentes dispositivos. Puede recibir datos a través de OPP en mi HTC One X, pero se comporta de manera diferente y no con éxito en el Samsung Nexus S y Galaxy Tab 2. –

Cuestiones relacionadas