Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
436 views
in Technique[技术] by (71.8m points)

android - Sending a File using Bluetooth OBEX Object Push Profile (OPP)

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:

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

Has issues on:

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

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...