Is there any way to send a file using the android bluetooth API using OBEX?
I need to send a file to a printer that supports OBEX OPP only.
I can send the file using the android intent ACTION_SEND to the printer with no problems, but I'd need to send it programmatically..
I can connect to the bluetooth printer using OBEX OPP UUID (1105) with the method createRfcommSocketToServiceRecord(), but then I should follow obex specifications to send a file using OBEX.. it isn't as simple as writing bytes to the output socket..
But if the intent ACTION_SEND can handle this, why there isn't any api for developers to send the files?
I also checked some third party libs like BlueCove, but I still didn't get it to work.. (Nexus One & Galaxy Tab throw an exception saying that native library bluecove_armv71 isn't available.. and LG Optimus One says that bluecove_armv61 isn't available..)
i'm stuck, any ideas?
WORKING SOLUTION
For anyone trying to send a file to a bluetooth device with no luck, I provide a working solution using content providers (thanks to KPBird):
Grab the java class BluetoothShare from here
Than, the following code sends a file on the SD card to a bluetooth device:
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);
UPDATE
Some people are experiencing problems with the solution above, it has been tested on the following devices:
Works on:
Has issues on:
If you are able to test this snippet on devices which are not listed above, please provide the details of the devices (brand, name, android version, etc..) with which you tested it, and the test results, in a comment below, I will update the question including your data.
The Object Push Profile, or OPP, contained on many mobile phones, including those built on the Android operating system, is not an application; it is an internal Bluetooth technology component that enables you to perform a wireless task.
OBEX Push. Transfers a file from the originator of the request to the recipient; a CONNECTION object containing no target is sent, then PUT is used to transfer the file. OBEX File Transfer Protocol. Stores and retrieves files, similar to FTP.
OBject EXchange (OBEX) is a communications protocol that facilitates binary transfers between Bluetooth enabled devices. Originally specified for Infrared Communications, it has since been adopted to Bluetooth and is utilized by a variety of different profiles such as OPP, FTP, PBAP and MAP.
I've written a sample application to test the answer provided. Unfortunately it doesn't work for me, so I think this question is not completely answered.
i think there is support in Android for OPP.There is a path in android/packages/apps/Bluetooth/...../opp/*.java
If your version doesnot have this, i found a useful link that will help to use OBEX OPP in android. Android framework modification is needed here.
http://i-miss-erin.blogspot.in/2009/10/how-to-have-obex-function-in-android.html
There are no public APIs for accessing OBEX. On why there are no APIs - Google knows best :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With