關(guān)于動(dòng)態(tài)權(quán)限申請的一些理解
什么時(shí)候才會產(chǎn)生動(dòng)態(tài)權(quán)限的申請等
targetSdkVersion >= 23 ;手機(jī)是安卓6.0及以上前域;這兩個(gè)條件缺一不可池充;
如果targetSdkVersion < 23 捷枯,無論手機(jī)版本是6.0還是6.0以下崇败,都不會有動(dòng)態(tài)權(quán)限申請這回事晓锻,依然使用舊的權(quán)限系統(tǒng)歌焦;
如果targetSdkVersion >= 23, 但是手機(jī)是6.0以下的系統(tǒng)砚哆,仍然不會有動(dòng)態(tài)權(quán)限申請這回事独撇,依然使用舊的權(quán)限系統(tǒng);
只有在targetSdkVersion >= 23躁锁,手機(jī)系統(tǒng)是6.0及以上纷铣,才需要進(jìn)行動(dòng)態(tài)權(quán)限的處理。但是灿里,假如targetSdkVersion < 23关炼,但是用戶手機(jī)是6.0及以上,手動(dòng)關(guān)閉了應(yīng)用的某個(gè)權(quán)限匣吊,用戶取消授權(quán)時(shí),android 6.0系統(tǒng)會警告寸潦,但用戶可以無視這種警告而取消授權(quán)色鸳。這個(gè)時(shí)候,系統(tǒng)本身不拋出異常见转,他將啥都不干命雀,結(jié)果導(dǎo)致函數(shù)返回值是null或者0。盡管app不會在調(diào)用這個(gè)函數(shù)時(shí)崩潰斩箫,但是返回值null或者0可能接下來依然導(dǎo)致崩潰吏砂。
上述只是針對原生系統(tǒng)的,國內(nèi)廠商即使是4.4或者5.1等等6.0以下的系統(tǒng)版本中乘客,基本都會有權(quán)限管理狐血,很多第三方應(yīng)用360,LBE等等也會有權(quán)限管理易核,他們的實(shí)現(xiàn)原理我不清楚匈织,因此我覺得最好在應(yīng)用中實(shí)現(xiàn)權(quán)限檢測、申請這類的工作牡直,防止應(yīng)用各種意外缀匕。
項(xiàng)目中,targetSdkVersion 是22碰逸,我的做法是乡小,在使用危險(xiǎn)權(quán)限之前,檢測應(yīng)用有沒有被授權(quán)(雖然按道理來講饵史,安裝的時(shí)候都被授權(quán)了满钟,但可能被用戶手動(dòng)關(guān)閉了)胜榔,如果有,就正常調(diào)用零远,如果沒有苗分,就彈出Dialog提示用戶沒有被授權(quán)該權(quán)限,請開啟后重試牵辣。具體怎么開啟摔癣,交給用戶自己去做,在這里只是提示而已纬向。也就是說择浊,在項(xiàng)目中,并沒有做targetSdkVersion >= 23的真正意義的動(dòng)態(tài)權(quán)限管理逾条。
權(quán)限分類
以下是危險(xiǎn)權(quán)限琢岩,必須動(dòng)態(tài)管理的(其他未列出的權(quán)限時(shí)屬于正常權(quán)限,用戶無法取消授權(quán))
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
同一個(gè)Group中师脂,只要有一個(gè)Permission被授權(quán)担孔,就認(rèn)為該Group內(nèi)的其他Permission也被授權(quán)。
Fragment申請權(quán)限的時(shí)候
如果使用ActivityCompat.requestPermissions吃警,不會調(diào)用onRequestPermissionsResult()
應(yīng)該直接requestPermissions糕篇,沒有前面的ActivityCompat
請求權(quán)限
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
在targetSdkVersion < = 22的時(shí)候
- 判斷用戶是否有某個(gè)權(quán)限,要使用API:
PermissionChecker.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
- 由于某種原因酌心,項(xiàng)目的targetSdkVersion 最高只能設(shè)置到22拌消,但是需要在調(diào)用系統(tǒng)相機(jī)的時(shí)候檢測權(quán)限,原本是使用如下的權(quán)限工具類來檢測是否有權(quán)限的:
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;
public class PermissionUtil {
private final Context mContext;
public PermissionUtil(Context context) {
mContext = context.getApplicationContext();
}
// 判斷權(quán)限集合
public boolean lacksPermissions(String... permissions) {
for (String permission : permissions) {
if (lacksPermission(permission)) {
return true;
}
}
return false;
}
// 判斷是否缺少權(quán)限,缺少返回true:只有targetSDKversion >=23 的時(shí)候有效
public boolean lacksPermission(String permission) {
return ContextCompat.checkSelfPermission(mContext, permission) ==
PackageManager.PERMISSION_DENIED;
}
}
但是這種方式檢測ContextCompat.checkSelfPermission
無論開啟和關(guān)閉權(quán)限安券,檢測出來都是同一個(gè)結(jié)果墩崩,因?yàn)檫@種檢測方式只適用于targetSdkVersion >= 23的情況。