Android M(6.0) 權限爬坑之旅
有一篇全面介紹Android M 運行時權限文章寫的非常全面(翻譯的):Android M 新的運行時權限開發者需要知道的一切,但是實施過程中還是遇到一些坑。
坑一:用Android5.0編譯的apk,在Android6.0上運行完全沒有問題。
- 在Android6.0以上才需要在運行時請求權限,在舊Android版本上保留原有邏輯,安裝時授予權限。
- 用舊版本sdk編譯的apk,都使用舊版本權限方式,安裝時授予權限。(也就是說:兼容舊版本)
- 用Android6.0(targetSdkVersion 23)編譯apk才需要處理新的權限問題。
- 還有一個蛋疼的問題:程序運行當中,用戶關閉了權限,會發生什么?(還未知) </ol>
坑二:藍牙掃描需要位置權限
BluetoothUtils: Permission denial: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results
如何申請一個權限:用ACCESS_COARSE_LOCATION舉栗子
1. Manifest添加權限
Android6.0分了幾種權限:Normal Permissions(安裝時自動授權,用戶也不能取消權限) and Dangerous Permissions
<!-- Android6.0 藍牙掃描才需要-->
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> 2. 請求權限
//判斷是否有權限
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
//請求權限
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
//判斷是否需要 向用戶解釋,為什么要申請該權限
ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)
//權限申請結果
onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults)</pre>
坑三:Fragment請求權限
//如果使用ActivityCompat.requestPermissions,不會調用onRequestPermissionsResult()
//請求權限
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
//判斷是否需要 向用戶解釋,為什么要申請該權限
shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS) 坑四:WRITE_SETTINGS權限怎么處理
android.permission.WRITE_SETTINGS不能自動授權,也不能運行時請求授權,咋整啊?通過打開Intent來讓用戶設置。貌似SETTINGS的權限只能這么處理,from CommonsWare research Android 6.0 changes.
/**
* An app can use this method to check if it is currently allowed to write or modify system
* settings. In order to gain write access to the system settings, an app must declare the
* {@link android.Manifest.permission#WRITE_SETTINGS} permission in its manifest. If it is
* currently disallowed, it can prompt the user to grant it this capability through a
* management UI by sending an Intent with action
* {@link android.provider.Settings#ACTION_MANAGE_WRITE_SETTINGS}.
*
* @param context A context
* @return true if the calling app can write to system settings, false otherwise
*/
if(!Settings.System.canWrite(this)){
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
if (Settings.System.canWrite(this)) {
//檢查返回結果
Toast.makeText(MainActivity.this, "WRITE_SETTINGS permission granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "WRITE_SETTINGS permission not granted", Toast.LENGTH_SHORT).show();
}
}
}</pre></div>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!