1. 程式人生 > >android6.0許可權問題(小米手機已解決)

android6.0許可權問題(小米手機已解決)

關於android6.0版本問題,最直接的解決方案就是把targetSdkVersion最大隻能設定為22。如果你不想這麼做就需要按照goole官方給出的方法一步步的來。

首先你需要在AndroidManifest.xml檔案中註冊一下你要申請的許可權;
接著就是按照goole API給出的方法:
先申請許可權:

if (ContextCompat.checkSelfPermission(getApplicationContext(),
                Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION
_GRANTED) { // 該方法是判斷許可權是否已經申請了,可以理解為AndroidManifest.xml檔案中是否聲明瞭該許可權,並不是使用者同意了該許可權或拒絕了該許可權,當用戶一但使用到該許可權,系統就會彈出對話方塊,詢問使用者是否允許或拒絕該許可權。 }

注意強烈建議在你需要的用到許可權的地方申請許可權,雖然許可權申請在何時申請都可以(必須在你使用到許可權之前),但有時很遇到很多的坑。
然後發出請求許可權:

// 如果應用之前請求過此許可權但使用者拒絕了請求,此方法將返回 true。
// 如果使用者在過去拒絕了許可權請求,並在許可權請求系統對話方塊中選擇了 Don't ask again 選項,
// 此方法將返回 false,並且如果裝置規範禁止應用具有該許可權,此方法也會返回 false。 if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CONTACTS)) { //在這裡提醒使用者你要使用許可權意圖 } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.READ_CONTACTS} , REQUEST_READ_CONTACT);//發起請求
}

最後複寫方法:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (permissions.length > 0) {
            switch (requestCode) {
                case REQUEST_READ_CONTACT:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //許可權被允許
                    } else {
                        // 許可權被拒絕
                        Toast.makeText(MainActivity.this, "許可權被拒絕!", Toast.LENGTH_SHORT).show();
                    }
                    break; 
                default:
                    break;
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

按照上述程式碼即可完成android 6.0 動態許可權申請,下面貼出完整程式碼片段:

 if (ContextCompat.checkSelfPermission(getApplicationContext(),
                Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    Manifest.permission.READ_CONTACTS)) {
                //在這裡提醒使用者你要使用許可權意圖
            } else {
            //請求許可權
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{
                        Manifest.permission.READ_CONTACTS}
                        , REQUEST_READ_CONTACT);
            }
        }

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (permissions.length > 0) {
            switch (requestCode) {
                case REQUEST_READ_CONTACT:
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //許可權被允許
                        /*
                        * 小米手機新增
                        * int checkOp = 0;
                        * AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
                        * checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_WRITE_CONTACTS,
                            Process.myUid(), getPackageName());
                        * if(checkOp == AppOpsManager.MODE_IGNORED){
                            //在這裡提醒使用者你要使用許可權意圖
                            }
                        */
                    } else {
                        // 許可權被拒絕
                        Toast.makeText(MainActivity.this, "許可權被拒絕!", Toast.LENGTH_SHORT).show();
                    }
                    break; 
                default:
                    break;
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

上面的程式碼在小米6.0的系統上是有問題的,在手機第一次彈出對話方塊詢問是否允許該許可權,不管你是拒絕還是同意使用許可權shouldShowRequestPermissionRationale()方法都是返回為false,所以當你拒絕了該許可權,他還是返回false,這就和上面的說法就有點衝突,然而坑爹的時小米官方並沒有對此做出更改,但有人給出瞭解決辦法:

int checkOp = 0;
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
checkOp = appOpsManager.checkOp(AppOpsManager.OPSTR_WRITE_CONTACTS,
                            Process.myUid(), getPackageName());
if(checkOp == AppOpsManager.MODE_IGNORED){
//在這裡提醒使用者你要使用許可權意圖
}

上面的程式碼主要是判斷該操作是否能被允許,比如上述程式碼就是判斷寫入聯絡人的操作是否被允許,所以通過許可權申請和驗證操作是否被允許兩個去判斷小米手機是否允許了該許可權。(其他手機可不用新增上述程式碼,加了也可以,多此一舉)。
當用戶拒絕了許可權時我們可以彈出一個對話方塊去提醒使用者去開啟許可權,如何跳轉到許可權管理設定頁面呢,程式碼如下:

Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

以上是個人見解,有錯誤,歡迎提出來,共同進步。