2015-10-15 5 views
6

मैं एंड्रॉइड 6 में अपग्रेड किया गया और ब्लूटूथ का उपयोग करने वाले मेरे एप्लिकेशन इस नए एपीआई संस्करण के साथ काम नहीं करते हैं। Play Store पर एप्लिकेशन के साथ यह वही समस्या है: ब्लूटूथ एसपीपी टूल्स प्रो (ब्लूटूथ काम करता है या नहीं, यह देखने के लिए अच्छा एप्लीकेशन) जो डिवाइस की खोज नहीं करता है।एंड्रॉइड 6 ब्लूटूथ

समस्या ब्लूटूथ खोज में हो रहा है:

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

मेरे अनुप्रयोगों एंड्रॉयड 4/5 के साथ अच्छी तरह से काम करते हैं और मैं पीछा किया: http://developer.android.com/guide/topics/connectivity/bluetooth.html

+0

आप किस डिवाइस पर इस समस्या का सामना कर रहे हैं? कौन सा नेक्सस? मैं नेक्सस 5 –

+0

पर करता हूं यह एक नेक्सस पर है 5 – eldina

उत्तर

18

एंड्रॉयड 6.0 के साथ घूर यह है एसडीके नहीं उच्च के साथ संकलन, तो करने के लिए है मैनिफेस्ट पर अनुमतियों को शामिल करने के लिए पर्याप्त नहीं है। आपको उपयोगकर्ता को "खतरनाक" माना जाने वाली प्रत्येक अनुमति के बारे में स्पष्ट रूप से पूछना है। BluetoothDevice.ACTION_FOUND ब्लूटूथ और ACCESS_COARSE_LOCATION अनुमति की आवश्यकता नहीं http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND

ACCESS_COARSE_LOCATION http://developer.android.com/reference/android/Manifest.permission.html#ACCESS_COARSE_LOCATION एक "खतरनाक" अनुमति है और इसलिए आप इसे वास्तविक खोज करने से पहले requestPermission उपयोग करने के लिए पूछने के लिए।

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

फिर आप 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; 
     } 
    } 
} 

एंड्रॉयड आप अनुकूलता पुस्तकालयों का उपयोग और ActivityCompat

+0

ब्लूटूथ के लिए यह आवश्यक है? या केवल acess_coarse_location के लिए? –

+0

हां, दोनों के लिए, Google प्रलेखन के अनुसार, https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND – Luci

3

मैं इस समस्या की जांच कर कुछ समय बिताया है।
एंड्रॉइड बग ट्रैकर here
पर बग रिपोर्ट बनाई गई समस्या यह है कि सिस्टम पंजीकृत BroadcastReceiver के इरादे को आगे नहीं बढ़ाता है। Logcat इस तरह लाइनों पता चलता है:

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)  

कौन सा मेरे लिए विषयों है कि आवेदन इस उद्देश्य को प्राप्त करने के android.permission.ACCESS_COARSE_LOCATION अनुमति की जरूरत है। मैं व्यक्तिगत रूप से समझ में नहीं आता क्यों मुझे ब्लूटूथ उपकरणों को पाने के लिए अनुमति की आवश्यकता है।
तो अगर आप प्रकट आप को यह अनुमति जोड़ें, तो यह एक और पूर्व शर्त के साथ काम करना चाहिए - आप लक्ष्य एसडीके सेट और 22.

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

ACCESS_COARSE_LOCATION आवश्यक है क्योंकि ब्लूटूथ, जैसे कि वाई-फाई और नेटवर्क (जीपीएस डिवाइस नहीं, सख्ती से बोलते हुए) बीटी बीकन के उपयोग से आपके लोकेटिन को इंगित करने में भी मदद कर सकते हैं। इसलिए स्थान की अनुमति देना भी पूर्व-आवश्यकता है। – dekaru

0

का उपयोग करते समय स्रोत की जाँच के कॉल करने चाहिए के पिछले संस्करणों के साथ काम करने के लिए GattService.java में कोड, आपको कुछ कोड टिप्पणियां पर विधि में स्कैनरसेट:

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

यह स्पष्ट करता है कि ब्लूटूथ ली विज्ञापन रिपोर्ट प्राप्त करने के लिए क्या आवश्यक है।

संबंधित मुद्दे