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

简介: 零、前言:[1]两行代码解决运行时权限[2]用户拒绝后显示提示信息,有再次验证功能[3]验证成功回调一个权限效果:一个权限效果.gif六个权限演示:六个权限演示.

零、前言:

[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
相关文章
|
6月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
272 64
|
5月前
|
前端开发 数据可视化 Java
Android用Canvas画一个折线图,并加以简单封装
本文介绍了如何用Java绘制动态折线图,从固定折线图的实现到封装成可复用的组件。首先通过绘制XY坐标轴、添加坐标标签和绘制折线及数据点完成基础折线图。接着,将静态数据替换为动态输入,支持自定义X轴、Y轴和折线数据。代码中包含关键方法如`drawDaxes`(绘制坐标轴)、`drawAxispoint`(绘制坐标点)和`drawbrokenLine`(绘制折线)。最终实现可根据传入数据动态生成折线图,适用于Android开发中的数据可视化场景。
164 0
|
6月前
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
357 64
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
238 0
|
10月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
894 11
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
220 2
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
111 0
|
编解码 API 开发工具
Android平台轻量级RTSP服务模块二次封装版调用说明
本文介绍了Android平台上轻量级RTSP服务模块的二次封装实践,旨在简化开发流程,让开发者能更专注于业务逻辑。通过`LibPublisherWrapper`类提供的API,可在应用中轻松初始化RTSP服务、配置视频参数(如分辨率、编码类型)、启动与停止RTSP服务及流发布,并获取RTSP会话数量。此外,还展示了如何处理音频和视频数据的采集与推送。最后,文章提供了从启动服务到销毁资源的完整示例,帮助开发者快速集成实时流媒体功能。
131 0
|
Java Shell Android开发
android 权限申请
android 权限申请
247 5
|
XML Java Android开发
Android 分享机顶盒项目的封装类《GridView》(三)(转)
Android 分享机顶盒项目的封装类《GridView》(三)(转)
94 2

热门文章

最新文章