2015-10-15 15 views
6

Tôi đã nâng cấp lên Android 6 và các ứng dụng sử dụng Bluetooth của tôi không hoạt động với phiên bản API mới này. Đó là cùng một vấn đề với ứng dụng trên Play Store: Bluetooth spp công cụ chuyên nghiệp (ứng dụng tốt để xem nếu bluetooth hoạt động) mà không phát hiện ra các thiết bị.Android 6 bluetooth

Vấn đề có vẻ là trong phát Bluetooth:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
mBluetoothAdapter.startDiscovery() 
Log.i("BLUETOOTH", String.valueOf(mBluetoothAdapter.isDiscovering())); // Return false 

Ứng dụng của tôi làm việc tốt với Android 4/5 và tôi đi theo: http://developer.android.com/guide/topics/connectivity/bluetooth.html

+0

thiết bị nào bạn gặp sự cố này? Mối quan hệ nào? Tôi làm trên Nexus 5 –

+0

Trên Nexus 5 – eldina

Trả lời

18

Nhìn chằm chằm với Android 6.0, bạn có không đủ để đưa quyền vào tệp kê khai. Bạn phải yêu cầu người dùng rõ ràng về từng quyền được coi là "nguy hiểm". BluetoothDevice.ACTION_FOUND đòi hỏi BLUETOOTH và ACCESS_COARSE_LOCATION quyền http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND

Các ACCESS_COARSE_LOCATION http://developer.android.com/reference/android/Manifest.permission.html#ACCESS_COARSE_LOCATION là một "nguy hiểm" cho phép và do đó bạn phải yêu cầu nó sử dụng requestPermission trước khi thực hiện khám phá thực tế.

public void doDiscovery() { 
    int hasPermission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION); 
    if (hasPermission == PackageManager.PERMISSION_GRANTED) { 
     continueDoDiscovery(); 
     return; 
    } 

    ActivityCompat.requestPermissions(MainActivity.this, 
      new String[]{ 
        android.Manifest.permission.ACCESS_COARSE_LOCATION}, 
      REQUEST_COARSE_LOCATION_PERMISSIONS); 
} 

đó trở đi bạn sẽ nhận được câu trả lời người dùng trên onRequestPermissionsResult

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_COARSE_LOCATION_PERMISSIONS: { 
      if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       continueDoDiscovery(); 
      } else { 
       Toast.makeText(this, 
         getResources().getString(R.string.permission_failure), 
         Toast.LENGTH_LONG).show(); 
       cancelOperation(); 
      } 
      return; 
     } 
    } 
} 

Để làm việc với các phiên bản trước của Android bạn nên sử dụng các thư viện tương thích và làm cho các cuộc gọi sử dụng ActivityCompat

+0

có cần thiết cho Bluetooth không? hoặc chỉ cho acess_coarse_location? –

+0

có, cho cả hai, theo tài liệu của google, https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND – Luci

3

Tôi đã trải qua một thời gian điều tra vấn đề này.
Đã tạo báo cáo lỗi trên trình theo dõi lỗi Android here
Vấn đề là hệ thống không chuyển tiếp BluetoothDevice.ACTION_FOUND ý định đến đăng ký BroadcastReceiver. Logcat hiển thị các dòng như sau:

10-16 07:34:09.147  786-802/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=android.bluetooth.device.action.FOUND flg=0x10 (has extras) } to ProcessRecord{5ce2d92 21736:com.example.mvl.bluetoothtest/u0a74} (pid=21736, uid=10074) requires android.permission.ACCESS_COARSE_LOCATION due to sender com.android.bluetooth (uid 1002)  

Chủ đề nào cho tôi mà ứng dụng cần android.permission.ACCESS_COARSE_LOCATION quyền để nhận ý định này. tôi personaly không hiểu tại sao tôi cần sự cho phép để có được các thiết bị Bluetooth xung quanh.
Vì vậy, nếu bạn thêm sự cho phép này để bạn Manifest, sau đó nó sẽ làm việc với một điều kiện tiên quyết hơn - Bạn phải đặt mục tiêu SDK và biên dịch với SDK không cao, sau đó 22.

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
+0

Yêu cầu ACCESS_COARSE_LOCATION vì Bluetooth, chẳng hạn như Wi-Fi và Mạng (không phải thiết bị GPS, nói đúng) cũng có thể giúp bạn xác định điểm locatin của bạn bằng cách sử dụng đèn hiệu BT. Do đó việc cấp quyền cho Vị trí cũng được yêu cầu trước. – dekaru

0

Khi kiểm tra nguồn mã trong GattService.java , bạn sẽ tìm thấy một số mã số ý kiến ​​ trong phương thức onScanResult:

// Do no report if location mode is OFF or the client has no location permission 
// PEERS_MAC_ADDRESS permission holders always get results 
if (hasScanResultPermission(client) && matchesFilters(client, result)) { 
    try { 
     ScanSettings settings = client.settings; 
     if ((settings.getCallbackType() & 
           ScanSettings.CALLBACK_TYPE_ALL_MATCHES) != 0) { 
      app.callback.onScanResult(result); 
     } 
    } catch (RemoteException e) { 
     Log.e(TAG, "Exception: " + e); 
     mClientMap.remove(client.clientIf); 
     mScanManager.stopScan(client); 
    } 
} 

làm rõ điều cần thiết để nhận báo cáo quảng cáo Bluetooth LE.

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