一般开发项目的时候,如果需要某些权限,如网络,获取wifi信息等。需要在AndroidManifest.xml通过uses-permission标签设置对应权限参数,如设置网络权限,需要在AndroidManifest.xml中加入如下内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.axen.mvp">
<uses-permission android:name="android.permission.INTERNET" />
....
</manifest>
这样就能进行网络访问了,但是这种获取权限的方式并不能一劳永逸,不说某些权限需要动态获取,而且部分手机可能对系统权限进行了控制管理,这样就造成了即使在AndroidManifest.xml中添加了权限参数,APP也不能成功获取权限。在这种情况下,就需要动态请求权限了。
一、动态获取权限
Android动态获取权限的代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.权限参数) != PackageManager.PERMISSION_GRANTED) {
// 检查权限状态
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.权限参数)) {
// 用户彻底拒绝授予权限,一般会提示用户进入设置权限界面
} else {
// 用户未彻底拒绝授予权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.权限参数}, 1);
}
}
}
当应用运行到这段代码是,会弹出一个提示框提示用户需要获取对应的权限,如果用户点击了允许,则以后运行应用都会默认允许获取该权限。而如果用户点击了拒绝,则以后运行应用都会默认禁止获取该权限,除非用户在设置界面修改应用权限。
二、监听权限申请结果
上述代码仅能实现动态申请权限,如果需要监听申请权限结果,需要覆写Activity的onRequestPermissionsResult方法:
@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) {
// 申请成功
} else {
// 申请失败
}
}
}
}