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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!