Enviar un archivo usando Bluetooth OBEX Object Push Profile (OPP)

¿Hay alguna manera de enviar un archivo usando la API de Android con Bluetooth usando OBEX?

Necesito enviar un archivo a una impresora que solo admita OBEX OPP.

Puedo enviar el archivo usando la intención de Android ACTION_SEND a la impresora sin problemas, pero tendría que enviarlo programáticamente.

Puedo conectarme a la impresora bluetooth usando OBEX OPP UUID (1105) con el método createRfcommSocketToServiceRecord (), pero luego debería seguir las especificaciones obex para enviar un archivo usando OBEX … no es tan simple como escribir bytes en el socket de salida. .

Pero si el bash ACTION_SEND puede manejar esto, ¿por qué no hay ninguna API para que los desarrolladores envíen los archivos?

También revisé algunas librerías de terceros como BlueCove, pero aún así no funcionó … (Nexus One y Galaxy Tab arrojan una excepción diciendo que la biblioteca nativa bluecove_armv71 no está disponible … y LG Optimus One dice que bluecove_armv61 isn ‘t disponible ..)

estoy atascado, ¿alguna idea?

SOLUCIÓN DE TRABAJO

Para cualquiera que intente enviar un archivo a un dispositivo bluetooth sin suerte, proporciono una solución que funciona usando proveedores de contenido (gracias a KPBird):

Toma la clase java BluetoothShare desde aquí

Entonces, el siguiente código envía un archivo en la tarjeta SD a un dispositivo bluetooth:

BluetoothDevice device; String filePath = Environment.getExternalStorageDirectory().toString() + "/file.jpg"; ContentValues values = new ContentValues(); values.put(BluetoothShare.URI, Uri.fromFile(new File(filePath)).toString()); values.put(BluetoothShare.DESTINATION, device.getAddress()); values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_OUTBOUND); Long ts = System.currentTimeMillis(); values.put(BluetoothShare.TIMESTAMP, ts); Uri contentUri = getContentResolver().insert(BluetoothShare.CONTENT_URI, values); 

ACTUALIZAR

Algunas personas están experimentando problemas con la solución anterior, se ha probado en los siguientes dispositivos:

Funciona en:

  • LG Optimus One (Android 2.1)
  • HTC Desire (Android 2.2)
  • Google Nexus One (Android 2.2 y 2.3)
  • Samsung Galaxy S2 (Android 4.0.3)
  • HTC Amaze (Android 2.3.4)

Tiene problemas en:

  • LG P500 (Android 2.3.3)
  • Galaxy TAB P500 (Android 2.2)
  • Google Nexus S (Android 4.1.2)

Si puede probar este fragmento en dispositivos que no figuran en la lista anterior, proporcione los detalles de los dispositivos (marca, nombre, versión de Android, etc.) con los que lo probó y los resultados de la prueba, en un comentario a continuación. , Actualizaré la pregunta incluyendo tus datos.

He escrito una aplicación de muestra para probar la respuesta provista. Lamentablemente, no funciona para mí, así que creo que esta pregunta no está completamente respondida.

Creo que hay soporte en Android para OPP. Hay una ruta en android / packages / apps / Bluetooth /…../ opp / *. java

Si su versión no tiene esto, encontré un enlace útil que ayudará a usar OBEX OPP en Android. La modificación del marco de Android es necesaria aquí.

http://i-miss-erin.blogspot.in/2009/10/how-to-have-obex-function-in-android.html

No hay API públicas para acceder a OBEX. Sobre por qué no hay API: Google sabe mejor 🙂

Alguien dijo que funciona bien en algunos teléfonos Samsung, pero que no funciona en otros teléfonos Samsung. Luego usé “BluetoothShare” para escribir un progtwig de prueba simple, y pido a mis amigos que me presten un teléfono para probar …

  1. NO puede funcionar en HTC Incredible
  2. Puede funcionar en SonyEricsson Xperia arc S

Por lo tanto, creo que algunos teléfonos no son compatibles con estos códigos de BluetoothShare …