2016-04-22 14 views
2

Ich entwickle eine App mit Konnektivität, die mit einem Bluetooth-Gerät mit SDK 23 als Kompilieren mit verbindet. Ich habe Probleme beim Anfordern mehrerer Berechtigungen für Bluetooth. Dies ist, was ich bisher getan hat:Anfordern mehrerer Bluetooth-Berechtigungen in Android Marshmallow

@Override 
public void onStart() { 
    super.onStart(); 
    if (D) 
     Log.e(TAG, "++ ON START ++"); 


    if (ContextCompat.checkSelfPermission(MyBlueToothClientActivity.this, 
      Manifest.permission.BLUETOOTH) 
      != PackageManager.PERMISSION_GRANTED) { 
    } else { 
     ActivityCompat.requestPermissions(MyBlueToothClientActivity.this, 
       new String[]{Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}, 
       REQUEST_ENABLE_BT); 
    } 


    if (ContextCompat.checkSelfPermission(MyBlueToothClientActivity.this, 
      Manifest.permission.BLUETOOTH) 
      != PackageManager.PERMISSION_GRANTED) { 
    } else { 

     ActivityCompat.requestPermissions(MyBlueToothClientActivity.this, 
       new String[]{Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}, 
       REQUEST_CONNECT_DEVICE_INSECURE); 
    } 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_ENABLE_BT: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

    // permission was granted, yay! 
       Intent enableIntent = new Intent(
         BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(enableIntent, REQUEST_ENABLE_BT); 


      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       if (CommonData.mChatService == null) 
        setupChat(); 

       Toast.makeText(MyBlueToothClientActivity.this, "Permission denied for bluetooth", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 

     case REQUEST_CONNECT_DEVICE_INSECURE: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! 
       Intent enableIntent = new Intent(
         BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(enableIntent, REQUEST_CONNECT_DEVICE_INSECURE); 


      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       if (CommonData.mChatService == null) 
        setupChat(); 

       Toast.makeText(MyBlueToothClientActivity.this, "Permission denied for bluetooth", Toast.LENGTH_SHORT).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

Obwohl ich in der Lage bin das Dialogfeld zu bekommen für Ihr Interesse an die Bluetooth ermöglicht, ich habe nicht die zweite Erlaubnis bekommen, das heißt mit einem Gerät zu verbinden. Im logcat, erhalte ich:

01-01 06:41:24.334 25473-25473 E/BluetoothChat: ++ ON START ++ 
    01-01 06:41:24.344 25473-25473 W/Activity: Can reqeust only one set of permissions at a time 

Und da ich nicht in der Lage bin zu dem Gerät zu verbinden, ich habe gerade hier stecken. Und dieser Code funktioniert gut auf Android-Version bis Lollipop, verursacht nur Probleme in der Marshmallow-Version.

Antwort

6

BLUETOOTH und BLUETOOTH_ADMIN sind normal permissions und werden daher automatisch gewährt. Nur Berechtigungen in der table of dangerous permissions müssen zur Laufzeit angefordert werden.

jedoch, wie erwähnt in der Android 6.0 changes: Access to Hardware Identifier:

Um die Hardware-IDs von in der Nähe von externen Geräten über Bluetooth und Wi-Fi-Scans zugreifen können, müssen Sie Ihre App haben nun die ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION Berechtigungen:

Wenn Sie eine dieser Methoden verwenden, müssen Sie mindestens ACCESS_COARSE_LOCATION zur Laufzeit verlangen (wie es eine gefährliche Erlaubnis ist).

+0

Oh. Muss ich dann nicht danach fragen? Wenn nein, wie handhabe ich sie für Versionen niedriger als Marshmallow? Auch, wenn ich andere Berechtigungen wie READ_EXTERNAL_STORAGE und WRITE_EXTERNAL_STORAGE verwenden musste, wie kann ich sie anfordern, da ich dort den gleichen Fehler bekommen könnte? – Mirhawk

+0

Ich habe meine Antwort mit der Frage aktualisiert, von der ich glaube, dass sie möglicherweise Ihr Problem ist (Sie benötigen die Standortberechtigung für das Bluetooth-Scannen, wenn Sie 6.0+ als Ziel haben). In jedem Fall können Sie gleichzeitig mehrere Berechtigungen anfordern, aber Sie können 'requestPermissions()' nicht mehr als einmal hintereinander aufrufen. Sie sollten einfach Ihre if-Anweisungen kombinieren und 'checkSelfPermissions() 'für jede Berechtigung, die Sie anfordern möchten, aufrufen und wenn diese nicht gewährt werden, dann fordern Sie sie alle an (das System fordert den Benutzer nicht auf, die Berechtigungen zu akzeptieren). wurde bereits akzeptiert). – ianhanniballake

Verwandte Themen