权限是一种安全机制。Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。
在Android6.0之前,我们只需要在AndroidManifest.xml文件中直接添加权限即可,但是在Android6.0之后,我们只在AndroidManifest.xml文件中配置是不够的,还需要在Java代码中进行动态获取权限。当然这里不是所有的权限都需要动态获取,只需要获取危险权限就可以了。
Android中的危险权限分为9组24种
我们只需要在用这些权限的时候,才需要去动态申请,除这些之外的权限,我们只需要在AndroidManifest.xml文件种写上即可,动态申请的权限同样需要在AndroidManifest.xml文件中写。而且每一组种的权限只要有一个授权了,其他的也会自动授权,也就是说申请相关的一组即可
需要注意只有当我们的编译版本大于21 (5.0版本)后需要动态处理权限。
请求方法
1.首先需要在AndroidManifest.xml文件中写上这个权限
<user-permission android:name="android.premission.CALL_PHONE"/>
2.然后在Java代码进行动态获取
2/**
* 请求授权
*/
private void requestPermission(){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){ //表示未授权时
//进行授权
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},1);
}else{
//调用打电话的方法
makeCall();
}
}
3请求之后,我们需要重写onRequestPermissionsResult这个方法
/**
* 权限申请返回结果
* @param requestCode 请求码
* @param permissions 权限数组
* @param grantResults 申请结果数组,里面都是int类型的数
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ //同意权限申请
makeCall();
}else { //拒绝权限申请
Toast.makeText(this,"权限被拒绝了",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
相关技巧
对于多个权限同时授权 装到数组中即可
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},1);
实际开发用到地方非常多,为了方便使用进行如下封装首先是定义的接口
/**
* Created by 11213 on 2017/1/4.
* 权限回调接口
*/
public interface PermissionListener {
//授权成功
void onGranted();
//授权部分
void onGranted(List<String> grantedPermission);
//拒绝授权
void onDenied(List<String> deniedPermission);
}
BaseActivity的代码
public class BaseActivity1 extends AppCompatActivity {
private PermissionListener mlistener;
/**
* 权限申请
* @param permissions 待申请的权限集合
* @param listener 申请结果监听事件
*/
protected void requestRunTimePermission(String[] permissions,PermissionListener listener){
this.mlistener = listener;
//用于存放为授权的权限
List<String> permissionList = new ArrayList<>();
//遍历传递过来的权限集合
for (String permission : permissions) {
//判断是否已经授权
if (ContextCompat.checkSelfPermission(this,permission) != PackageManager.PERMISSION_GRANTED){
//未授权,则加入待授权的权限集合中
permissionList.add(permission);
}
}
//判断集合
if (!permissionList.isEmpty()){ //如果集合不为空,则需要去授权
ActivityCompat.requestPermissions(this,permissionList.toArray(new String[permissionList.size()]),1);
}else{ //为空,则已经全部授权
listener.onGranted();
}
}
/**
* 权限申请结果
* @param requestCode 请求码
* @param permissions 所有的权限集合
* @param grantResults 授权结果集合
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0){
//被用户拒绝的权限集合
List<String> deniedPermissions = new ArrayList<>();
//用户通过的权限集合
List<String> grantedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
//获取授权结果,这是一个int类型的值
int grantResult = grantResults[i];
if (grantResult != PackageManager.PERMISSION_GRANTED){ //用户拒绝授权的权限
String permission = permissions[i];
deniedPermissions.add(permission);
}else{ //用户同意的权限
String permission = permissions[i];
grantedPermissions.add(permission);
}
}
if (deniedPermissions.isEmpty()){ //用户拒绝权限为空
mlistener.onGranted();
}else { //不为空
//回调授权成功的接口
mlistener.onDenied(deniedPermissions);
//回调授权失败的接口
mlistener.onGranted(grantedPermissions);
}
}
break;
default:
break;
}
}
}
子Activity中进行调用
private void requestPermission(){
requestRunTimePermission(new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE}
, new PermissionListener() {
@Override
public void onGranted() { //所有权限授权成功
}
@Override
public void onGranted(List<String> grantedPermission) { //授权失败权限集合
}
@Override
public void onDenied(List<String> deniedPermission) { //授权成功权限集合
}
});
}