Bluetooth does not send the file to another device

It is already set, but I did not find any solution. For bluetooth application, I use bluetoothShare.class .

My source code for sending the file to the target device

MainActvity.class:

 Set<BluetoothDevice> devices = btAdapter .getBondedDevices(); final String btDeviceName = selected_deviceName; BluetoothDevice device = null; for (BluetoothDevice itDevice : devices) { if (btDeviceName.equals(itDevice.getName())) { device = itDevice; } } if (device != null) { ContentValues values = new ContentValues(); values.put(BluetoothShare.URI, uri.toString()); values.put(BluetoothShare.MIMETYPE, "image/jpeg"); values.put(BluetoothShare.DESTINATION, device.getAddress()); values.put(BluetoothShare.DIRECTION, BluetoothShare.DIRECTION_OUTBOUND); Long ts = System.currentTimeMillis(); values.put(BluetoothShare.TIMESTAMP, ts); final Uri contentUri = getApplicationContext() .getContentResolver().insert( BluetoothShare.CONTENT_URI, values); Log.v(TAG, "Insert contentUri: " + contentUri + " to device: " + device.getName()); Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_LONG).show(); } else { textStatus .setText("Bluetooth remote device not found"); } } else { textStatus.setText("Bluetooth not activated"); } } else { Toast.makeText(getApplicationContext(), "No devices found", Toast.LENGTH_LONG).show(); } 

and blueToothShare.class:

 package process.bluetooth.sendfile.opp; import android.net.Uri; import android.provider.BaseColumns; public final class BluetoothShare implements BaseColumns { private BluetoothShare() { } public static final String PERMISSION_ACCESS = "android.permission.ACCESS_BLUETOOTH_SHARE"; public static final Uri CONTENT_URI = Uri .parse("content://com.android.bluetooth.opp/btopp"); public static final String TRANSFER_COMPLETED_ACTION = "android.btopp.intent.action.TRANSFER_COMPLETE"; public static final String INCOMING_FILE_CONFIRMATION_REQUEST_ACTION = "android.btopp.intent.action.INCOMING_FILE_NOTIFICATION"; public static final String USER_CONFIRMATION_TIMEOUT_ACTION = "android.btopp.intent.action.USER_CONFIRMATION_TIMEOUT"; public static final String URI = "uri"; public static final String FILENAME_HINT = "hint"; public static final String _DATA = "_data"; public static final String MIMETYPE = "mimetype"; public static final String DIRECTION = "direction"; public static final String DESTINATION = "destination"; public static final String VISIBILITY = "visibility"; public static final String USER_CONFIRMATION = "confirm"; public static final String STATUS = "status"; public static final String TOTAL_BYTES = "total_bytes"; public static final String CURRENT_BYTES = "current_bytes"; public static final String TIMESTAMP = "timestamp"; public static final int DIRECTION_OUTBOUND = 0; public static final int DIRECTION_INBOUND = 1; public static final int USER_CONFIRMATION_PENDING = 0; public static final int USER_CONFIRMATION_CONFIRMED = 1; public static final int USER_CONFIRMATION_AUTO_CONFIRMED = 2; public static final int USER_CONFIRMATION_DENIED = 3; public static final int USER_CONFIRMATION_TIMEOUT = 4; public static final int VISIBILITY_VISIBLE = 0; public static final int VISIBILITY_HIDDEN = 1; public static boolean isStatusInformational(int status) { return (status >= 100 && status < 200); } public static boolean isStatusSuspended(int status) { return (status == STATUS_PENDING); } public static boolean isStatusSuccess(int status) { return (status >= 200 && status < 300); } public static boolean isStatusError(int status) { return (status >= 400 && status < 600); } public static boolean isStatusClientError(int status) { return (status >= 400 && status < 500); } public static boolean isStatusServerError(int status) { return (status >= 500 && status < 600); } public static boolean isStatusCompleted(int status) { return (status >= 200 && status < 300) || (status >= 400 && status < 600); } public static final int STATUS_PENDING = 190; public static final int STATUS_RUNNING = 192; public static final int STATUS_SUCCESS = 200; public static final int STATUS_BAD_REQUEST = 400; public static final int STATUS_FORBIDDEN = 403; public static final int STATUS_NOT_ACCEPTABLE = 406; public static final int STATUS_LENGTH_REQUIRED = 411; public static final int STATUS_PRECONDITION_FAILED = 412; public static final int STATUS_CANCELED = 490; public static final int STATUS_UNKNOWN_ERROR = 491; public static final int STATUS_FILE_ERROR = 492; public static final int STATUS_ERROR_NO_SDCARD = 493; public static final int STATUS_ERROR_SDCARD_FULL = 494; public static final int STATUS_UNHANDLED_OBEX_CODE = 495; public static final int STATUS_OBEX_DATA_ERROR = 496; public static final int STATUS_CONNECTION_ERROR = 497; } 
+8
android android bluetooth
source share
4 answers

The BluetoothShare class is not supported on Android 4.1 and higher. you can use the following intentional encoding to send a file in Android version 4.1 and higher

 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setComponent(new ComponentName( "com.android.bluetooth", "com.android.bluetooth.opp.BluetoothOppLauncherActivity")); intent.setType("image/jpeg"); file = new File(filepath); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); startActivity(intent); 

as well as some devices in Android version 2.2 / 2.3 do not send a file through the bluetoothShare class.

+6
source share

Perhaps you can try another solution with BufferedWriter and BufferedReader.

Here is the cut code:

  BluetoothDevice mmDevice; Set<BluetoothDevice> mBluetoothAdapter; BluetoothAdapter bAdapter = BluetoothAdapter .getDefaultAdapter(); mBluetoothAdapter = bAdapter.getBondedDevices(); for (BluetoothDevice bc : mBluetoothAdapter) { if (bc.getName().indexOf("name_of_bluetoothdevide") != -1) { UUID uuid = UUID .fromString("00001101-0000-1000-8000-00805F9B34FB"); // Standard // SerialPortService // ID mmDevice = bc; BluetoothSocket mmSocket = mmDevice .createInsecureRfcommSocketToServiceRecord(uuid); bAdapter.cancelDiscovery(); mmSocket.connect(); BufferedWriter Writer = new BufferedWriter( new OutputStreamWriter( mmSocket.getOutputStream())); Writer.write("Bluetooth connected!"); Writer.flush(); app.setmSocket(mmSocket); break; } } 

And for reading:

  BufferedReader Reader = new BufferedReader( new InputStreamReader(mmSocket.getInputStream())); receivedMsg = Reader.readLine(); 

Hope this helps you.

+2
source share

Perhaps this may help you in some way ...

 private void sendData(String message) { byte[] msgBuffer = message.getBytes(); Log.d(TAG, "...Sending data: " + message + "..."); try { outStream.write(msgBuffer); } catch (IOException e) { String msg = "In onResume() and an exception occurred during write: " + e.getMessage(); if (address.equals("00:00:00:00:00:00")) msg = msg + ".\n\nUpdate your server address from 00:00:00:00:00:00 to the correct address on java code"; msg = msg + ".\n\nCheck that the SPP UUID: " + MY_UUID.toString() + " exists on server.\n\n"; errorExit("Fatal Error", msg); } } 
+1
source share

This code works with firmware from MediaTek. Tested on Android 4.0.4. Sends a file without asking anything from the user.

 public boolean SendFileViaBluetoothOPP(String file_path, String destinationMAC){ BluetoothAdapter btadapter = BluetoothAdapter.getDefaultAdapter(); if(btadapter == null) return false; BluetoothDevice btdev = btadapter.getRemoteDevice(destinationMAC); if(btdev == null) return false; Uri uri = Uri.fromFile(new File(file_path)); Intent shareIntent = new Intent(Intent.ACTION_SEND) .putExtra(Intent.EXTRA_STREAM, uri) .setType("application/zip"); List<ResolveInfo> resolvedActivities = getPackageManager().queryIntentActivities(shareIntent, 0); boolean found = false; for(ResolveInfo actInfo: resolvedActivities){ if(actInfo.activityInfo.packageName.equals("com.mediatek.bluetooth")) { shareIntent.setComponent( new ComponentName(actInfo.activityInfo.packageName, actInfo.activityInfo.name ) ); shareIntent.putExtra("com.mediatek.bluetooth.sharegateway.extra.DEVICE_ADDRESS", btdev); shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); found = true; break; } } if(found){ startActivity(shareIntent); return true; } return false; } 

On an older MediaTek phone with Android 2.2.1, this code launches the BluetoothDevicePicker to complete the operation.

+1
source share

All Articles