Android实战之6.0权限申请详解及简单封装(Util方向)
2018-01-29 21:03
555 查看
Android6.0出来很久了,之前项目也都做过适配,最快又写新项目了,所以重新记录一下,
首先我们这篇文章要说什么:
1、什么叫6.0权限适配
2、正常官方建议的适配方案
3、简单封装成Util(工具类)
那么,你能从这篇文章中获得什么?
没错,就是上面说的三点,你能了解一下这个6.0权限的具体详情
一、什么叫6.0权限适配
大致的危险权限就是上面这些,接下来我们已打电话为例子,说下怎么在6.x的系统下申请权限
二、正常官方建议的适配方案
正常再6.0之前我们调用系统拨打电话的功能,代码如下:
而在6.0之后官方推荐的是这样的:
解释:首先判断SDK版本是否大于23,当大于23的时候先检测我们要申请的打电话权限是否授权,如果已经授权直接就执行打电话方法,如果没有则需要ActivityCompat或者ContextCompat调用内部的requestPermissions去申请权限,既然我们有申请权限,那么就有申请后的回调。在Activity中重写onRequestPermissionsResult()方法 ,如下:
请求权限回调,可能当前界面会请求多个权限,如打电话,发短信等,所以再请求时会设置一个标识,我们这里随便赋值的11,正常中我们可以随便赋值。以上就是正常的申请,及回调.
三、简单封装成Util(工具类)
封装之后的代码如下:
以上就是简单的对android6.0的封装,接下来还会优化成如多个权限组申请,和基于建造者模式进行封装。篇幅中可能会有部分观点受个人眼界限制,欢迎指教改正,qq:2145228494,
感谢生活、感谢科技、感谢分享!
首先我们这篇文章要说什么:
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,
感谢生活、感谢科技、感谢分享!
相关文章推荐
- Android 6.0 权限申请详解,以及权限申请框架MPermissions的简单使用
- Android 6.0 的权限管理自己简单的封装--(到BaseActivity)
- Android 6.0权限申请详解及权限资料整理
- Android 6.0 运行时权限 fragment的简单封装 basefragment
- android简单学习6.0的动态权限申请
- android 6.0以后的运行时权限申请及封装 相关记录
- Android 6.0权限详解及封装
- android 6.0权限申请封装
- Android之6.0 权限申请封装
- React-Native之Android(6.0及以上)权限申请详解
- Android 6.0 动态权限申请简单简洁优雅的处理方式
- Android 6.0权限申请详解及权限资料整理
- Android 6.0 权限的申请 与 封装
- Android 运行时权限处理封装在 BaseActivity 中,方便业务申请时只需要简单的 1,2 行代码即可成功处理权限申请
- android 6.0权限申请封装
- Android权限详解(含6.0动态申请)
- Android 6.0 动态权限申请封装的处理方式
- Android 6.0运行时权限 baseactivity简单封装
- Android 6.0 动态权限申请详解
- Android 6.0 申请权限Permission Denial: reading com.android.providers.media.MediaProvider