您现在的位置是:首页 > 文章详情

TI--安卓运行时权限封装

日期:2018-08-24点击:338

零、前言:

[1]两行代码解决运行时权限
[2]用户拒绝后显示提示信息,有再次验证功能
[3]验证成功回调

一个权限效果:
一个权限效果.gif
六个权限演示:
六个权限演示.gif
一、代码实现
1.单一权限申请
public class MainActivity extends PermissionActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //单权限申请 applyPermissions(_WRITE_EXTERNAL_STORAGE()); } @Override protected void permissionOk() { ToastUtil.showAtOnce(MainActivity.this, "授权通过"); } } 
2.多权限:常用的六组运行时权限
applyPermissions( _WRITE_EXTERNAL_STORAGE(), _READ_CONTACTS(), _CALL_PHONE(), _CAMERA(), _READ_SMS(), _RECORD_AUDIO()); 

附录一:权限封装类,拷贝即用
/** * 作者:张风捷特烈 * 时间:2018/5/16 14:55 * 邮箱:1981462002@qq.com * 说明:申请权限的Activity父类 * <p> * 用法:1:继承 PermissionActivity * 2:调用applyPermissions * 3:permissionOk()回调 */ public abstract class PermissionActivity extends AppCompatActivity { private static final int WRITE_EXTERNAL_STORAGE = 0x01; private static final int RECORD_AUDIO = 0x02; private static final int CAMERA = 0x03; private static final int READ_CONTACTS = 0x04; private static final int CALL_PHONE = 0x05; private static final int READ_SMS = 0x06; private PermissionBean mStorageModel, mRecorderModel, mCameraModel, mContactsModel, mCallPhoneModel, mSMSModel; private PermissionBean[] mModels; private int count = 0; protected boolean noPerm = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 申请权限 */ private void applyPermission(PermissionBean model) { noPerm = PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, model.permission); if (noPerm) { ActivityCompat.requestPermissions(this, new String[]{model.permission}, model.requestCode); count++; } } /** * 申请权限 */ public void applyPermissions(PermissionBean... models) { mModels = models; System.out.println(count); applyPermission(models[count]); if (!noPerm) { permissionOk(); } } /** * 申请SD卡读写权限 */ public PermissionBean _WRITE_EXTERNAL_STORAGE() { mStorageModel = new PermissionBean(Manifest.permission.WRITE_EXTERNAL_STORAGE, "我们需要您允许我们读写你的存储卡,以方便使用该功能!", WRITE_EXTERNAL_STORAGE); return mStorageModel; } /** * 申请读取通讯录权限 */ public PermissionBean _READ_CONTACTS() { mContactsModel = new PermissionBean(Manifest.permission.READ_CONTACTS, "我们需要您允许我们读取通讯录,以方便功能使用!", READ_CONTACTS); return mContactsModel; } /** * 申请读取通讯录权限 */ public PermissionBean _READ_SMS() { mSMSModel = new PermissionBean(Manifest.permission.READ_SMS, "我们需要您允许我们读取短信,以方便功能使用!", READ_SMS); return mSMSModel; } /** * 申请录音权限 */ public PermissionBean _RECORD_AUDIO() { mRecorderModel = new PermissionBean(Manifest.permission.RECORD_AUDIO, "我们需要您允许我们访问录音设备,以方便录音功能使用!", RECORD_AUDIO); return mRecorderModel; } /** * 申请拍照权限 */ public PermissionBean _CAMERA() { mCameraModel = new PermissionBean(Manifest.permission.CAMERA, "我们需要您允许我们访问相机,以方便拍照功能使用!", CAMERA); return mCameraModel; } /** * 申请电话权限 */ public PermissionBean _CALL_PHONE() { mCallPhoneModel = new PermissionBean(Manifest.permission.CALL_PHONE, "我们需要您允许我们访问电话设备,以方便功能使用!", CALL_PHONE); return mCallPhoneModel; } /** * 当用户处理完授权操作时,系统会自动回调该方法 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (count != mModels.length) { applyPermission(mModels[count]); } else { permissionOk(); count=0;//count归零 } } else { count--; } switch (requestCode) { case WRITE_EXTERNAL_STORAGE: showInfoDialog(permissions, grantResults[0], mStorageModel); break; case RECORD_AUDIO: showInfoDialog(permissions, grantResults[0], mRecorderModel); break; case CAMERA: showInfoDialog(permissions, grantResults[0], mCameraModel); break; case READ_CONTACTS: showInfoDialog(permissions, grantResults[0], mContactsModel); break; case CALL_PHONE: showInfoDialog(permissions, grantResults[0], mCallPhoneModel); break; case READ_SMS: showInfoDialog(permissions, grantResults[0], mSMSModel); break; } } /** * 如果拒绝,弹出对话框,说明为什么需要这个权限 * * @param permissions * @param grantResult * @param model */ private void showInfoDialog(String[] permissions, int grantResult, final PermissionBean model) { if (PackageManager.PERMISSION_GRANTED != grantResult) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("权限申请") .setMessage(model.explain).setPositiveButton( "我知道了", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { applyPermission(model); } } ); builder.setCancelable(false); builder.show(); } } return; } /** * Permission的bean对象 */ public static class PermissionBean { public String permission;//请求的权限 public String explain;//解析为什么请求这个权限 public int requestCode;//请求代码 public PermissionBean(String permission, String explain, int requestCode) { this.permission = permission; this.explain = explain; this.requestCode = requestCode; } } protected abstract void permissionOk(); } 
附录二:危险权限:需要运行时
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 使用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 录音 group:android.permission-group.SMS 信息 permission:android.permission.READ_SMS 读取信息 permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送 permission:android.permission.RECEIVE_MMS 接收彩信 permission:android.permission.RECEIVE_SMS 收信息 permission:android.permission.SEND_SMS 发信息 
运行时权限组中的一个获取权限,其他就不需要运行时权限,但AndroidManifest.xml仍要配置 

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg
原文链接:https://yq.aliyun.com/articles/633843
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章