2018-03-21Android 6.0權(quán)限的問(wèn)題

android 從6.0對(duì)用戶權(quán)限的獲取方式進(jìn)行了修改,不像以前那樣只在AndroidManifest.xml單單的添加權(quán)限就可以的,有些敏感的權(quán)限還需要在runtime詢問(wèn)用戶是不是賦予此APP所需要的權(quán)限,當(dāng)然如果你沒(méi)有對(duì)這些敏感的權(quán)限在runtime進(jìn)行處理的話android默認(rèn)是會(huì)禁止當(dāng)前權(quán)限。下面就說(shuō)說(shuō)那些權(quán)限是需要在runtime進(jìn)行處理的.


谷歌官方

相信被6.0權(quán)限問(wèn)題折磨了很久的人都看到過(guò)這張圖了,他對(duì)權(quán)限進(jìn)行了分組,當(dāng)前組任何一個(gè)權(quán)限被允許了那么當(dāng)app需要當(dāng)前組任何一個(gè)權(quán)限的時(shí)候系統(tǒng)都不會(huì)在重新詢問(wèn)客戶。
接下來(lái)就說(shuō)說(shuō)怎么在runtime時(shí)處理權(quán)限問(wèn)題:

 int hasReadContactsPermission
               = checkSelfPermission("android.permission.READ_CONTACTS");
      if (hasReadContactsPermission
              != PackageManager.PERMISSION_GRANTED) {
           requestPermissions(new String[]
                  {Manifest.permission.READ_CONTACTS}, 123);//第一個(gè)參數(shù)是需要的權(quán)限,第二參//數(shù)是自定義的一個(gè)回調(diào)值
           return;
     }

我這用的是讀取聯(lián)系人的權(quán)限為例,在讀取聯(lián)系人之前調(diào)用該片方法,當(dāng)然了調(diào)用了這些代碼還是不行的,因?yàn)槟悴恢烙脩羰沁x擇了禁止還是允許(其實(shí)你要是在操作權(quán)限之前只調(diào)用上面的代碼詢問(wèn)框直接不出來(lái)就給你拒絕了)

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 123:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted

                    asyncQueryHandler = new MyAsyncQueryHandler(this.getContentResolver());

                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 0);

                    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; // 聯(lián)系人Uri;
                    // 查詢的字段
                    String[] projection = {ContactsContract.CommonDataKinds.Phone._ID,
                            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                            ContactsContract.CommonDataKinds.Phone.DATA1, "sort_key",
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                            ContactsContract.CommonDataKinds.Phone.PHOTO_ID,
                            ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY};
                    // 按照sort_key升序查詢
                    asyncQueryHandler.startQuery(0, null, uri, projection, null, null,
                            "sort_key COLLATE LOCALIZED asc");
                } else {
                    // Permission Denied
                    Toast.makeText(ActivityAddFriends.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

到這權(quán)限管理才算是完成,但是這樣有一點(diǎn)不好,就是當(dāng)用戶選擇了禁止的時(shí)候app就會(huì)獲取不到數(shù)據(jù),只有當(dāng)用戶給你權(quán)限了才可以,還有另外一種方法,當(dāng)需要權(quán)限的時(shí)候先彈出了一個(gè)diloa告訴用戶我要權(quán)限是為了干什么。具體代碼如下:

private void insertDummyContactWrapper() { 
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS); 
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) { 
showMessageOKCancel(“You need to allow access to Contacts”, 
new DialogInterface.OnClickListener() { 
@Override 
public void onClick(DialogInterface dialog, int which) { 
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, 
123); 
} 
}); 
return; 
} 
} 
insertDummyContact(); 
}

private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) { 
new AlertDialog.Builder(MainActivity.this) 
.setMessage(message) 
.setPositiveButton(“OK”, okListener) 
.setNegativeButton(“Cancel”, null) 
.create() 
.show(); 
}` 

這樣的話當(dāng)用戶點(diǎn)擊cannel的時(shí)候最多這一次權(quán)限沒(méi)有得到,但是當(dāng)下一次需要這個(gè)權(quán)限的時(shí)候就會(huì)還彈出來(lái)這個(gè)對(duì)話框,來(lái)詢問(wèn)用戶。
參考的博客是一篇純英文的看著有點(diǎn)費(fèi)勁,有翻譯的但是一時(shí)找不到了。
參考文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,936評(píng)論 25 709
  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,859評(píng)論 0 12
  • 用到的組件 1、通過(guò)CocoaPods安裝 2、第三方類庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,159評(píng)論 1 180
  • 七月 大水沒(méi)過(guò)河堤 魚兒游到岸邊 你向我走來(lái) 我在你眼中 看到了大海 在此之前 花和花一起盛開 風(fēng)和風(fēng)一起遠(yuǎn)行 在...
    我就是小彩虹閱讀 273評(píng)論 0 0
  • 整整一年又一個(gè)多月,媽媽全職陪伴了你這么長(zhǎng)時(shí)間,其實(shí)很短,居然就這么過(guò)去了……明天,媽媽又將回到職場(chǎng),可能是媽媽太...
    鐘家少奶奶閱讀 258評(píng)論 0 0

友情鏈接更多精彩內(nèi)容