Android 6.0以上动态权限备忘录

来源:互联网 发布:网络侦探攻略第十九章 编辑:程序博客网 时间:2024/05/17 09:18

Android 6.0以上动态权限申请备忘录


最近的一个项目已经打包给测试了,每天的主要工作就是面对着电脑屏幕发呆。发呆之余,顺手整理一下经常会用到的那些代码吧。今天主要写写Android 6.0以上动态权限申请的步骤。
关于什么是普通权限,什么是敏感权限,动态申请权限的流程是什么等已经有前辈们做了大量的阐述,我这里不在赘述了,直接贴代码吧。

1.创建项目

在Android Studio 主界面依次File > New > New Project…… > Next > Next > Next > Finish.

2.在Manifest中声明权限

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="cn.stevengo.permissiontest">    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>    <uses-permission android:name="android.permission.CAMERA"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".PermissionActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

我这里随便声明了两个权限,仅作为示例。

3.添加字符串资源

<resources>    <string name="string_dialog_title_help">帮助</string>    <string name="string_dialog_content_lack_permission">程序缺少必要的权限,请单击【确定】按钮进行设置!</string>    <string name="string_dialog_positiveButton">确定</string>    <string name="string_dialog_negativeButton">取消</string></resources>

4.编写申请逻辑

package cn.stevengo.permissiontest;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.provider.Settings;import android.support.annotation.Nullable;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import java.util.ArrayList;import java.util.List;/** * @author StevenGo * @date 2017/12/21 * <p> * Android 6.0以上动态权限示例 */public class PermissionActivity extends AppCompatActivity {    /**     * 要申请的权限     */    private String[] permissions = new String[]{            "android.permission.WRITE_CONTACTS",            "android.permission.CAMERA"    };    /**     * 权限请求码     */    public static final int PERMISSION_REQUEST_CODE = 0x001;    /**     * startActivityForResult请求码     */    public static final int FOR_RESULT_REQUEST_CODE = 0x002;    /**     * url scheme     */    public static final String PACKAGE_URL_SCHEME = "package:";    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_permission);        initPermission();    }    /**     * 初始化权限的方法     */    private void initPermission() {        //判断当前编译版本是否大于M        //如果小于M直接延时启动        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {            //无需动态申请权限            //do something            return;        }        //当有未授权的权限时进行权限请求        String[] needPermission = checkPermission();        if (needPermission.length != 0) {            ActivityCompat.requestPermissions(PermissionActivity.this,                    needPermission,                    PERMISSION_REQUEST_CODE);            //授权成功        } else {            //do something        }    }    /**     * 检查未授权的权限     */    private String[] checkPermission() {        //存储未授权的权限        List<String> deniedPermissionList = new ArrayList<>();        //检查需要的权限是否已经授权,将未授权的权限保存到list中        for (int i = 0; i < permissions.length; i++) {            if (ContextCompat.checkSelfPermission(PermissionActivity.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {                deniedPermissionList.add(permissions[i]);            }        }        //将list中的权限转换成array存储        String[] deniedPermissions = new String[deniedPermissionList.size()];        for (int i = 0; i < deniedPermissions.length; i++) {            deniedPermissions[i] = deniedPermissionList.get(i);        }        return deniedPermissions;    }    /**     * 进行完权限请求回调的方法     *     * @param requestCode  请求码     * @param permissions  要申请的权限     * @param grantResults 请求结果     */    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        boolean flag = true;        switch (requestCode) {            case PERMISSION_REQUEST_CODE:                //检查是否有未授权的权限                for (int i = 0; i < grantResults.length; i++) {                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {                        flag = false;                        break;                    }                }                //如果没有未授权的权限,执行后续操作                if (flag) {                    //do something                }                //如果有未授权的权限,引导用户授权                else {                    showAlterDialog(R.string.string_dialog_title_help, R.string.string_dialog_content_lack_permission);                }                break;            default:                break;        }    }    /**     * 显示提示对话框     *     * @param titleId   标题资源id     * @param contentId 内容资源id     */    private void showAlterDialog(int titleId, int contentId) {        AlertDialog dialog = new AlertDialog.Builder(this)                //设置标题                .setTitle(titleId)                //设置内容                .setMessage(contentId)                //设置确定按钮                .setPositiveButton(R.string.string_dialog_positiveButton, new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        //启动应用详情页                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);                        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));                        startActivityForResult(intent, FOR_RESULT_REQUEST_CODE);                    }                })                //设置取消按钮                .setNegativeButton(R.string.string_dialog_negativeButton, new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        //执行权限不足对应的操作                        //do something                    }                })                .create();        dialog.show();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        //设置完权限之后重新初始化,检查授权情况        switch (requestCode) {            case FOR_RESULT_REQUEST_CODE:                //重新初始化权限                initPermission();                break;            default:                break;        }    }}

ok,动态申请权限的流程就这么多。
网上这类文章还是蛮多的,我参考了好几篇,但是实在抱歉不知道有哪些了,如果有人看到认为我侵权的话请1435374903@qq.com联系我删除。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怎么办可以复制成不关联的文档 希捷400g硬盘电机不转怎么办 金立手机微信语音播放失败怎么办 手机4g网络变2g怎么办 生存战争2吃了腐烂的食物后怎么办 古筝调音 d的显示为b怎么办 消防建审没有原有的结构图纸怎么办 生石灰弄到脸上用水洗后发热怎么办 吃了没熟的鹅肝怎么办 蹲式厕所被袜子堵了怎么办 自热包的水喝了怎么办 火锅发热包不小心吃了怎么办 塑料螺旋饭盒盖子被吸住了怎么办 昨晚喝太多酒今天排尿拍不出怎么办 开光过的貔貅摔坏一点嘴巴怎么办 诺基亚6第二代忘记解屏密码怎么办 工厂搬迁已经般空了工人怎么办 被上司强行换了一个岗位该怎么办 上司要调整我岗位我该怎么办 我被别人打伤了警察不管怎么办 郑州共享汽车小黄车路上坏了怎么办 爱跟别人聊朋友的事怎么办 任职履历上学历写错了怎么办 六个月的宝宝老长婴儿湿疹怎么办 入伍前驾照没考完退伍后过期怎么办 在电脑上玩英雄联盟没有声音怎么办 梦幻西游新区抢不到副本积分怎么办 倒车时遇上机动车碰瓷的怎么办 电瓶车相撞对方全责但不赔偿怎么办 轻微刮蹭逃逸对方想多要钱怎么办 正常开车撞伤了闯红灯的人怎么办 发现小事故要保持现场堵车怎么办 私处刮毛外面皮肤不小心弄伤怎么办 老婆骂孩子不准老公带饿小孩怎么办 结婚3年妻子不让丈夫碰怎么办 老婆出轨现在没证据他要离婚怎么办 结婚后老婆不让碰分房睡离婚怎么办 电动车调速把手变速挡坏了怎么办 路边车辆贴条了超过15天了怎么办 违停交警拍照了没贴条 照片怎么办 支付宝违章缴费罚单输错了怎么办