動態權限分為兩類
1.不涉及隱私的權限
需要在Manifest中聲明
- 網絡權限
- 藍牙權限
- NFC權限等
2.涉及隱私的權限
也需要在Manifest中聲明
- SD卡讀寫權限
- 短信讀寫權限
- 聯系人讀寫權限等
3.需要動態授權的權限組
- **CALENDAR(日歷) **
READ_CALENDAR
WRITE_CALENDAR -
CAMERA(相機)
CAMERA -
CONTACTS(聯系人)
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS -
LOCATION(位置)
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION -
MICROPHONE(麥克風)
RECORD_AUDIO - **PHONE(手機) **
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS -
SENSORS(傳感器)
BODY_SENSORS -
SMS(短信)
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS -
STORAGE(存儲卡)
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
4.動態申請權限
最簡單的方法就是用Android Studio新建一個login項目,選擇Login Activity項目
- Paste_Image.png
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
return true;
}
if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(android.R.string.ok, new View.OnClickListener() {
@Override
@TargetApi(Build.VERSION_CODES.M)
public void onClick(View v) {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
});
} else {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
return false;
}
Paste_Image.png
checkSelfPermission(),shouldShowRequestPermissionRationale(),requestPermissions(),在Android SDK 23以上的API中,已經存在的方法。Activity繼承AppCompatActivity就會存在。 如果使用低于23版本的SDK,可以使用v4 包的中AppCompat.checkSelfPermission()去調用,這是為了兼容23以下版本的兼容包工具。
Paste_Image.png
這里的數據就是你需要請求的權限組
當權限請求成功時,不要忘記,權限請求成功之后的回調,需要重寫onRequestPermissionsResult()方法,如下
- Paste_Image.png
5.推薦一個動態申請權限的類庫,GitHub上1000多star
直接點擊地址:
AndPermission : https://github.com/yanzhenjie/AndPermission