Android開發必知:6.0權限,官方分析

【威哥說】去年,Google升級6.0后,很重要的一點是權限的改變,到現在很多總結分析權限的文章,但是或者不太詳細,或者有疏漏,下面我來給大家來總結下6.0權限的問題。

1.這個新的運行時權限僅當我們設置targetSdkVersion ?23(這意味著你已經在23上測試通過了)才起作用,當然還要是M系統的手機。app在6.0之前的設備依然使用舊的權限系統。

如果app的targetSdkVersion 低于 23,那將被認為app沒有用23新權限測試過,那將被繼續使用舊有規則:用戶在安裝的時候不得不接受所有權限,安裝后app就有了那些權限咯!然后app像以前一樣奔跑!注意,此時用戶依然可以取消已經同意的授權!用戶取消授權時,android 6.0系統會警告,但這不妨礙用戶取消授權。

問題又來了,這時候你的app崩潰嗎?

善意的主把這事也告訴了android小組,當我們在targetSdkVersion 低于23的app調用一個需要權限的函數時,這個權限如果被用戶取消授權了的話,不拋出異常。但是他將啥都不干,結果導致函數返回值是null或者0.

2.代碼沒有成功改為支持最新運行時權限的app,不要設置targetSdkVersion 23 發布,否則你就有麻煩了。只有當你測試過了,再改為targetSdkVersion 23 。

警告:現在你在android studio新建項目,targetSdkVersion 會自動設置為 23。如果你還沒支持新運行時權限,我建議你首先把targetSdkVersion 降級到22

3.權限組:

同一組的任何一個權限被授權了,其他權限也自動被授權。例如,一旦WRITE_CONTACTS被授權了,app也有READ_CONTACTS和GET_ACCOUNTS了。

權限分組官方表格如下:

下面我們來看具體的使用方法:

1.請求要申請的權限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){

ActivityCompat.requestPermissions(this,

new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_PHONE_STATE},2);

}else {

startActivity(new Intent(this,MainActivity.class));

finish();

}

2.請求后的回調方法,根據返回的結果碼執行操作

//動態權限申請后系統的回調方法

@Override

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

switch (requestCode){

case MY_PERMISSIONS_REQUEST:

for (int i = 0; i < grantResults.length; i++) {

//檢查權限是否被拒絕

if (grantResults[i] == PackageManager.PERMISSION_DENIED) {

Toast.makeText(SplashActivity.this, "本應用需要申請讀寫sdcard權限來訪問本地文件", Toast.LENGTH_SHORT).show();

return;

}

}

break;

}

Intent intent = new Intent(SplashActivity.this,MainActivity.class);

startActivity(intent);

finish();

}

3.要注意這個方法,用戶允許或拒絕返回值的類型

/**

* 用戶第一次拒絕后,下一次,返回true,應該提示用戶為什么需要這個權限,添加說明

* 用戶第二次請求權限時,用戶拒絕了,并選擇了不再提醒,返回false

* 設備的策略禁止當前應用獲取這個權限的授權,返回false

*

* 注意:第二次請求權限時候才有選項“不再提醒”,如果用戶一直拒絕,但沒有選擇不再提醒,下次請求權限時候,

* 會繼續有不再提醒的權限

*/

@Override

public boolean shouldShowRequestPermissionRationale(String permission) {

return super.shouldShowRequestPermissionRationale(permission);

}

以上就是Google官方的權限申請方法,這里總結下實際使用時候需要的注意點:

1.只請求你需要的權限:減少請求的次數,或用intent來代替,讓其他的應用來處理。

防止一次請求太多的權限或請求次數太多,用戶可能對你的應用感到厭煩。

2.在應用啟動的時候,最好先請求應用必須的一些權限,不是必須的,在使用的時候,才請求(如一些附帶權限),需要自己整理,管理一下自己應用的權限分類:

2.1 普通權限(normal permissions):只需要在androidmanifest.xml中聲明相應的權限,在安裝應用時,會默認獲得許可。并且用戶不能修改權限許可。(只需要在AndroidManifest.xml中簡單聲明這些權限就好,安裝時就授權。不需要每次使用 時都檢查權限,而且用戶不能取消以上授權。)

2.2 需要申請的權限(dangerous permissions):

2.2.1 必要權限:最好在應用啟動的時候,進行請求許可的一些權限(主要是應用中主要功能需要的權限)

2.2.2 附帶權限:不是應用主要功能需要的權限(如:分享圖片時,需要讀取應用的通訊錄等等)

3.解釋你的應用為什么需要這些權限:在請求之前requestPermissions().,提示用戶,讓用戶不會感到困惑

問題持續收集與回答

小伙伴們嗨起來

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容