2016-04-22 9 views
2

私は、SDK 23を搭載したBluetoothデバイスにコンパイル時に接続する接続性のあるアプリケーションを開発しています。 Bluetoothの複数のアクセス権を要求する際に問題が発生しています。これは私がこれまでにやっていることです:Android Marshmallowで複数のBluetoothのアクセス許可を要求しています

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

私は、Bluetoothを有効に要求するためのダイアログボックスを取得することができるよけれども、私はデバイスに接続するために、第2の許可、すなわちを得ることはありません。 logcatでは、私が取得:

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 

そして、私はデバイスに接続することはできませんよ以来、私はちょうどここにはまり込みます。そして、このコードはLollipopまでのAndroidバージョンでうまく動作し、ちょうどMarshmallowバージョンで問題を引き起こします。

答えて

6

BLUETOOTHおよびBLUETOOTH_ADMINnormal permissionsであるため、自動的に付与されます。実行時にtable of dangerous permissionsのアクセス権のみが要求される必要があります。

Android 6.0 changes: Access to Hardware Identifierで述べたようにしかし、:

あなたがそれらのいずれかの方法を使用している場合(それ危険なパーミッションであるとして)、実行時に、少なくともACCESS_COARSE_LOCATIONを要求する必要があります。

+0

ああ。それから私はそれらを要求する必要はありませんか?いいえ、マシュマロよりも低いバージョンではどうすれば対応できますか?また、READ_EXTERNAL_STORAGEやWRITE_EXTERNAL_STORAGEのような他のパーミッションを使用する必要がある場合は、同じエラーが発生する可能性があるので、それらをリクエストする方法はありますか? – Mirhawk

+0

私は実際にあなたの問題であると思われるもので私の回答を更新しました(あなたが6.0+を目標とする場合は、Bluetoothスキャンのための場所の許可が必要です)。いずれにしても、(同時に)複数のパーミッションを要求できますが、実行できないのは、 'requestPermissions()'を2回以上呼び出すことです。 ifステートメントを組み合わせて、要求したいすべてのアクセス許可に 'checkSelfPermissions()'を呼び出すだけで、許可されていないアクセス権があればすべて要求する必要があります(システムは、既に受け入れられている)。 – ianhanniballake

関連する問題