动态权限分为两类
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项目
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;
}
checkSelfPermission(),shouldShowRequestPermissionRationale(),requestPermissions(),在Android SDK 23以上的API中,已经存在的方法。Activity继承AppCompatActivity就会存在。 如果使用低于23版本的SDK,可以使用v4 包的中AppCompat.checkSelfPermission()去调用,这是为了兼容23以下版本的兼容包工具。
这里的数据就是你需要请求的权限组
当权限请求成功时,不要忘记,权限请求成功之后的回调,需要重写onRequestPermissionsResult()方法,如下
5.推荐一个动态申请权限的类库,GitHub上1000多star
直接点击地址:
AndPermission : https://github.com/yanzhenjie/AndPermission