1、動(dòng)態(tài)權(quán)限獲取機(jī)制
- Google在Android 6.0中引入了動(dòng)態(tài)權(quán)限獲取機(jī)制(Runtime Permission),使得Android的權(quán)限管理更加嚴(yán)格完善箩退。
- 動(dòng)態(tài)權(quán)限獲取要求開發(fā)者在調(diào)用涉及相關(guān)權(quán)限的代碼時(shí)丑罪,使用系統(tǒng)接口來動(dòng)態(tài)得申請(qǐng)相應(yīng)權(quán)限。定位SDK涉及權(quán)限即在此范疇中杰扫。
- 在未獲取到定位權(quán)限情況下队寇,定位SDK獲取到的定位依據(jù)(基站、WiFi)均為空值章姓,因此無法有效定位佳遣,定位服務(wù)會(huì)返回錯(cuò)誤碼167识埋。
2、動(dòng)態(tài)權(quán)限機(jī)制的開啟
因此需要在項(xiàng)目配置文件中修改您的targetSdkVersion配置零渐。
對(duì)于Eclipse環(huán)境窒舟,請(qǐng)更改AndroidManifest.xml中代碼;AndroidStudio環(huán)境诵盼,請(qǐng)更改build.gradle中的代碼惠豺。
3、關(guān)于android:protectionLevel:權(quán)限的等級(jí)
normal 低風(fēng)險(xiǎn)權(quán)限风宁,只要申請(qǐng)了就可以使用(在AndroidManifest.xml中添加<uses-permission>標(biāo)簽)洁墙,安裝時(shí)不需要用戶確認(rèn);
dangerous 高風(fēng)險(xiǎn)權(quán)限戒财,安裝時(shí)需要用戶的確認(rèn)才可使用热监;
signature 只有當(dāng)申請(qǐng)權(quán)限的應(yīng)用程序的數(shù)字簽名與聲明此權(quán)限的應(yīng)用程序的數(shù)字簽名相同時(shí)(如果是申請(qǐng)系統(tǒng)權(quán)限,則需要與系統(tǒng)簽名相同)饮寞,才能將權(quán)限授給它狼纬;
signatureOrSystem 簽名相同,或者申請(qǐng)權(quán)限的應(yīng)用為系統(tǒng)應(yīng)用(在system image中)骂际,與signature類似疗琉,只是增加了rom中自帶的app的聲明 ,盡量不要使用該選項(xiàng)歉铝,因?yàn)閟ignature已經(jīng)適合絕大部分的情況盈简。
對(duì)于普通和危險(xiǎn)級(jí)別的權(quán)限,我們稱之為低級(jí)權(quán)限太示,應(yīng)用申請(qǐng)即授予柠贤。其他兩級(jí)權(quán)限,我們稱之為高級(jí)權(quán)限或系統(tǒng)權(quán)限类缤。當(dāng)應(yīng)用試圖在沒有權(quán)限的情況下做受限操作臼勉,應(yīng)用將被系統(tǒng)殺掉以警示。系統(tǒng)應(yīng)用可以使用任何權(quán)限餐弱。權(quán)限的聲明者可無條件使用該權(quán)限宴霸。
4、動(dòng)態(tài)權(quán)限代碼樣例
在Android 6.0系統(tǒng)中膏蚓,需要?jiǎng)討B(tài)獲取的權(quán)限涉及到:
- 獲取手機(jī)狀態(tài):
Manifest.permission.READ_PHONE_STATE;
- 獲取位置信息:
Manifest.permission.ACCESS_COARSE_LOCATION;
Manifest.permission.ACCESS_FINE_LOCATION;
- 讀寫SD卡:
Manifest.permission.READ_EXTERNAL_STORAGE;
Manifest.permission.WRITE_EXTERNAL_STORAGE;
5瓢谢、獲取權(quán)限使用API
- 第一步,利用Context.checkSelfPermission接口驮瞧,觸發(fā)系統(tǒng)彈窗
- int android.content.Context.checkSelfPermission(String permission)氓扛,此接口會(huì)觸發(fā)系統(tǒng)彈窗,用戶選擇后觸發(fā)Activity中的回調(diào)函數(shù)论笔,以READ_PHONE_STATE為例:
private static final int BAIDU_READ_PHONE_STATE =100;
- 第二步采郎,定義權(quán)限獲取碼千所,申請(qǐng)權(quán)限
- 自定義一個(gè)權(quán)限獲取碼,用于回調(diào)函數(shù)中做對(duì)應(yīng)處理蒜埋,調(diào)用checkSelfPermission接口申請(qǐng)權(quán)限:
if(mContext.checkSelfPermission(Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED) {
// 申請(qǐng)一個(gè)(或多個(gè))權(quán)限淫痰,并提供用于回調(diào)返回的獲取碼(用戶定義)
requestPermissions( new String[]{ Manifest.permission.READ_PHONE_STATE },BAIDU_READ_PHONE_STATE );
}
- 第三步,處理回調(diào)函數(shù)
- 在Activity的onRequestPermissionResult回調(diào)函數(shù)中做處理:
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions,grantResults);
switch(requestCode) {
//requestCode即所聲明的權(quán)限獲取碼理茎,在checkSelfPermission時(shí)傳入
case 1:
BAIDU_READ_PHONE_STATE:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//獲取到權(quán)限黑界,做相應(yīng)處理
//調(diào)用定位SDK應(yīng)確保相關(guān)權(quán)限均被授權(quán),否則會(huì)引起定位失敗
} else{
//沒有獲取到權(quán)限皂林,做特殊處理
}
break;
default:
break;
}
}
6朗鸠、一個(gè)權(quán)限獲取方式
7、多個(gè)權(quán)限獲取方式
8础倍、一個(gè)和多個(gè)權(quán)限獲取唯一不同的地方需要在回調(diào)中分別處理
9烛占、動(dòng)態(tài)權(quán)限獲取的封裝
- 把權(quán)限的申請(qǐng)放在BaseActivity中,然后各個(gè)子Activity去繼承BaseActivity沟启。
- 定義權(quán)限回調(diào)接口
- 申請(qǐng)權(quán)限的方法必須傳遞一個(gè)Activity對(duì)象忆家,工具類中需要一個(gè)Activity管理器獲取最上層的Activity.
Demo地址如下:
AndroidPermission Demo 地址鏈接