2013-08-28 34 views
8

Đã được hỏi nhưng tôi không tìm thấy giải pháp nào. Đối với ứng dụng bluetooth, tôi đang sử dụng bluetoothShare.class.Bluetooth không gửi tập tin đến thiết bị khác

mã nguồn của tôi để gửi các tập tin vào thiết bị mục tiêu

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(); 
      } 

và 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; 

} 

Trả lời

6

Lớp BluetoothShare không được hỗ trợ Android 4.1 trở lên. bạn có thể sử dụng mã hóa ý định sau để gửi tệp trong phiên bản Android 4.1 trở lên

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); 

và một số thiết bị trong Android v 2.2/2.3 không gửi tệp qua lớp bluetoothShare.

2

lẽ bạn có thể thử một giải pháp với BufferedWriter và BufferedReader.

Dưới đây là một mã snipped:

  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; 
       } 
      } 

Và để đọc:

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

Hy vọng nó có thể giúp bạn.

+0

Cảm ơn bạn đã trả lời .. app.setmSocket (mmSocket); ứng dụng là gì .. – Arut

+0

Tôi nghĩ rằng mã của bạn là để kết nối các thiết bị ngay. – Arut

+0

quên app.setmSocket (mmSocket); .. điều này chỉ dành cho tôi. –

1

Có lẽ điều này có thể giúp bạn một cách nào đó ...

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

Mã này hoạt động với firmware từ MediaTek. Thử nghiệm trên Android 4.0.4. Gửi tệp mà không yêu cầu bất kỳ điều gì từ người dùng

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; 
} 

Trên điện thoại cũ từ MediaTek với Android 2.2.1 mã này sẽ khởi chạy BluetoothDevicePicker để hoàn tất thao tác.

Các vấn đề liên quan