您的位置:首页 > 移动开发 > Android开发

Android实战之6.0权限申请详解及简单封装(Util方向)

2018-01-29 21:03 555 查看
Android6.0出来很久了,之前项目也都做过适配,最快又写新项目了,所以重新记录一下,

首先我们这篇文章要说什么:

1、什么叫6.0权限适配

2、正常官方建议的适配方案

3、简单封装成Util(工具类)

那么,你能从这篇文章中获得什么?

没错,就是上面说的三点,你能了解一下这个6.0权限的具体详情

一、什么叫6.0权限适配

随着android系统的快速发展,已经从比较低的android4.3稳健的提升到现在的8.0,在这其中6.0系统开始及以后的系统,有了一些新的特性,如动态权限管理,意思就是当我们再6.0之前,我们要打开照相机,只需再Manifest中申请权限即可,但是再6.0之后,对于一些敏感权限是需要我们开发者去动态请求的,用户同意后才会允许应用去打开照相机,需要哪个权限,现去申请哪个权限,这大致上就是我们说的6.0动态权限申请。大家可以看下官方文档 http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html,能更好的理解。 那么有哪些权限是需要动态申请的呢,


group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS//添加联系人
permission:android.permission.GET_ACCOUNTS//获取手机号
permission:android.permission.READ_CONTACTS//读取联系人

group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG  //
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE  //打电话
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
permission:android.permission.CAMERA //照相机

group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION  //位置

group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE  //内存的只读权限
permission:android.permission.WRITE_EXTERNAL_STORAGE//内存的只写权限

group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
b713
//录音机

group:android.permission-group.SMS
permission:android.permission.READ_SMS  //读取短信
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS  //接收短信
permission:android.permission.SEND_SMS  //发送短信
permission:android.permission.READ_CELL_BROADCASTS


大致的危险权限就是上面这些,接下来我们已打电话为例子,说下怎么在6.x的系统下申请权限

二、正常官方建议的适配方案

正常再6.0之前我们调用系统拨打电话的功能,代码如下:

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+"10086"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


而在6.0之后官方推荐的是这样的:

if(Build.VERSION.SDK_INT >= 23){     //表示ANdroid6.0
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED) {//说明没有授权,需要去申请
//申请权限
ActivityCompat.requestPermissions(Main2Activity.this, new String[]{Manifest.permission.CALL_PHONE}, 11);
} else {   //已经授权权限
//调用打电话方法
}
}else{
//调用打电话方法
}


解释:首先判断SDK版本是否大于23,当大于23的时候先检测我们要申请的打电话权限是否授权,如果已经授权直接就执行打电话方法,如果没有则需要ActivityCompat或者ContextCompat调用内部的requestPermissions去申请权限,既然我们有申请权限,那么就有申请后的回调。在Activity中重写onRequestPermissionsResult()方法 ,如下:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

if(requestCode==11){//说明是请求打电话的,由上请求时设置的
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//用户允许
//打电话
}else{
Toast.makeText(Main2Activity.this, "您没有授权,请在设置中打开授权,保证正常使用", Toast.LENGTH_SHORT).show();
}
}
}


请求权限回调,可能当前界面会请求多个权限,如打电话,发短信等,所以再请求时会设置一个标识,我们这里随便赋值的11,正常中我们可以随便赋值。以上就是正常的申请,及回调.

三、简单封装成Util(工具类)

package com.example.contactsmoudle.utils;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;

import com.example.contactsmoudle.Main2Activity;
import com.example.contactsmoudle.contactsmoudle.MainActivity;

/**
* 权限简单请求类
* Created by cgq on 2018/1/29.
*/

public class PermissionsUtil {

//判断是否有此权限
public static boolean hasPermissions(Context context, String permission){
if (Build.VERSION.SDK_INT >= 23){//需要判断
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS)//定位,oncreate里此方法,如果用户选择打开蓝牙,则不调用,此处调用
!= PackageManager.PERMISSION_GRANTED) {
return false;
} else {   //已经授权权限
return true;
}
}else {   //不需要申请,直接执行
return true;
}
}

public static void requestPermission(Context context,String permission,int requestcode){
ActivityCompat.requestPermissions((Activity) context, new String[]{permission}, requestcode);
}

}


封装之后的代码如下:

if(PermissionsUtil.hasPermissions(this,Manifest.permission.CALL_PHONE)){
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+"10086")); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
}else {
PermissionsUtil.requestPermission(this,Manifest.permission.CALL_PHONE,CALL_PHONE_CODE);
}


以上就是简单的对android6.0的封装,接下来还会优化成如多个权限组申请,和基于建造者模式进行封装。篇幅中可能会有部分观点受个人眼界限制,欢迎指教改正,qq:2145228494,

感谢生活、感谢科技、感谢分享!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: