1、为什么需要动态申请权限?
因为google觉得有些权限是危险的,所以决定在android6.0(android 23)之后,程序在使用这些危险权限的时候,都需要询问用户是否可以使用这些权限。
2、危险的权限主要有哪些?
和联系人、电话、短信、读写外部存储、相机、位置信息、传感器和日历有关的都涉及危险权限!下面举例5个:
<!--以下是危险权限,需要动态申请-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3、如何动态申请?
需要动态申请的危险权限都是需要在AndroidMenifest.xml中进行相应的配置,然后在加上下面的代码即可:
private int times = 0;
private final int REQUEST_PERMISSION = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView();
checkPermission();
}
private void checkPermission() {
times++;
final List<String> permissionsList = new ArrayList<>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if ((checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.CAMERA);
if ((checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED))
permissionsList.add(Manifest.permission.RECORD_AUDIO);
if ((checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)) {
permissionsList.add(Manifest.permission.READ_PHONE_STATE);
}
if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if ((checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
if (permissionsList.size() != 0) {
if (times == 1) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_PERMISSION);
} else {
new AlertDialog.Builder(this)
.setCancelable(true)
.setTitle("提示")
.setMessage("获取不到授权,APP将无法正常使用,请允许APP获取权限!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_PERMISSION);
}
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
finish();
}
}).show();
}
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
checkPermission();
}