1、首先在AndroidManifest.xml静态申请权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2、检查权限是否申请:
/**
* 检查单个权限是否申请
*
* @param permissionName 权限名(例:Manifest.permission.WRITE_EXTERNAL_STORAGE)
* @return 申请结果
*/
protected boolean checkPhonePermission(String permissionName) {
if (Build.VERSION.SDK_INT >= 23) {
return ContextCompat.checkSelfPermission(this, permissionName) == PackageManager.PERMISSION_GRANTED;
}
return true;
}
3、申请权限:
/**
* 申请权限
*
* @param permissionName 权限名
*/
public void requestPermissions(String permissionName) {
//注册权限
ActivityCompat.requestPermissions(this, new String[]{permissionName}, 1);
}
4、判断权限申请结果:(在权限申请对话框消失后执行,在Activity中重写,可用于监听权限申请结果)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PERMISSION_GRANTED) {
Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "" + "权限" + permissions[i] + "申请失败", Toast.LENGTH_SHORT).show();
}
}
}
}
5、需要用户手动赋予的权限:
所属权限组 | 权限 |
---|
日历 | READ_CALENDAR |
日历 | WRITE_CALENDAR |
相机 | CAMERA |
联系人 | READ_CONTACTS |
联系人 | WRITE_CONTACTS |
联系人 | GET_ACCOUNTS |
位置 | ACCESS_FINE_LOCATION |
位置 | ACCESS_COARSE_LOCATION |
麦克风 | RECORD_AUDIO |
电话 | READ_PHONE_STATE |
电话 | CALL_PHONE |
电话 | READ_CALL_LOG |
电话 | WRITE_CALL_LOG |
电话 | ADD_VOICEMAIL |
电话 | USE_SIP |
电话 | PROCESS_OUTGOING_CALLS |
传感器 | BODY_SENSORS |
短信 | SEND_SMS |
短信 | RECEIVE_SMS |
短信 | READ_SMS |
短信 | RECEIVE_WAP_PUSH |
短信 | RECEIVE_MMS |
存储 | READ_EXTERNAL_STORAGE |
存储 | WRITE_EXTERNAL_STORAGE |
6、注意
- 如果某权限申请失败,查看是不是权限遍历后一个一个申请的,如果是这样的改为如下一次性申请:
int REQUEST_CODE_CONTACT = 101;
//申请权限
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
//验证是否申请权限
if (getApplicationContext().checkSelfPermission(permissions[1]) != PackageManager.PERMISSION_GRANTED) {
//申请权限
ActivityCompat.requestPermissions(MainActivity.this, permissions, REQUEST_CODE_CONTACT);
}
- 如果Android版本为10,SDK29以上则在AndroidManifest.xml中的application标签中添加如下配置:
android:requestLegacyExternalStorage="true"