Android M(6.0) 權限爬坑之旅

jopen 9年前發布 | 348K 次閱讀 Android開發 移動開發 Android 6.0

有一篇全面介紹Android M 運行時權限文章寫的非常全面(翻譯的):Android M 新的運行時權限開發者需要知道的一切,但是實施過程中還是遇到一些坑。

坑一:用Android5.0編譯的apk,在Android6.0上運行完全沒有問題。

  1. 在Android6.0以上才需要在運行時請求權限,在舊Android版本上保留原有邏輯,安裝時授予權限。
  2. 用舊版本sdk編譯的apk,都使用舊版本權限方式,安裝時授予權限。(也就是說:兼容舊版本)
  3. 用Android6.0(targetSdkVersion 23)編譯apk才需要處理新的權限問題。
  4. 還有一個蛋疼的問題:程序運行當中,用戶關閉了權限,會發生什么?(還未知)
  5. </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>
    

    來自:https://yanlu.me/android-m6-0-permission-chasm/

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