android 6.0权限管理
博客专区 > cold19 的博客 > 博客详情
android 6.0权限管理
cold19 发表于6个月前
android 6.0权限管理
  • 发表于 6个月前
  • 阅读 32
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: android6.0(API 级别 23)开始,app可以直接安装,当app在运行时候需要用的权限是会弹出系统对话框逐个询问用户是否授予,当使用到了相对比较敏感的权限时,用户可以拒绝,这就是android运行时权限处理的基本策略。

1.     简介

android 6.0以前,用户安装app是一次性列出需要的权限,询问用户是否安装,只有当用户同意了之后,app才会安装。

而android6.0(API 级别 23)开始,app可以直接安装,当app在运行时候需要用的权限是会弹出系统对话框逐个询问用户是否授予,当使用到了相对比较敏感的权限时,用户可以拒绝,这就是android运行时权限处理的基本策略。

新的android运行时权限策略将android系统的权限分为两大类,一类不涉及用户隐私,这种权限只需要在AndroidManifest.xml中设置即可,另一类涉及用户的隐私内容,这一类需要在AndroidManifest.xml中设置,并且需要用户确认才会被授予。

2.     不需要运行时申请的权限

ACCESS_LOCATION_EXTRA_COMMANDS

ACCESS_NETWORK_STATE

ACCESS_NOTIFICATION_POLICY

ACCESS_WIFI_STATE

BLUETOOTH

BLUETOOTH_ADMIN

BROADCAST_STICKY

CHANGE_NETWORK_STATE

CHANGE_WIFI_MULTICAST_STATE

CHANGE_WIFI_STATE

DISABLE_KEYGUARD

EXPAND_STATUS_BAR

GET_PACKAGE_SIZE

INSTALL_SHORTCUT

INTERNET

KILL_BACKGROUND_PROCESSES

MODIFY_AUDIO_SETTINGS

NFC

READ_SYNC_SETTINGS

READ_SYNC_STATS

RECEIVE_BOOT_COMPLETED

REORDER_TASKS

REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

REQUEST_INSTALL_PACKAGES

SET_ALARM

SET_TIME_ZONE

SET_WALLPAPER

SET_WALLPAPER_HINTS

TRANSMIT_IR

UNINSTALL_SHORTCUT

USE_FINGERPRINT

VIBRATE

WAKE_LOCK

WRITE_SYNC_SETTINGS

3.     需要运行时申请的权限

这些权限同样需要AndroidManifest.xml中设置,如果没有设置,则直接回调开发者权限拒绝。这些权限还有一个组的概念,同一个组的包含若干权限,某一个权限被授予,则同一组的其他权限也会被授予。这些权限包括:

group:com.google.android.gms.permission.CAR_INFORMATION

  permission:com.google.android.gms.permission.CAR_VENDOR_EXTENSION

  permission:com.google.android.gms.permission.CAR_MILEAGE

  permission:com.google.android.gms.permission.CAR_FUEL



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:com.google.android.gms.permission.CAR_SPEED

  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

  permission:android.permission.RECEIVE_MMS

  permission:android.permission.RECEIVE_SMS

  permission:android.permission.SEND_SMS

  permission:android.permission.READ_CELL_BROADCASTS



ungrouped:

  permission:com.huawei.pushagent.permission.RICHMEDIA_PROVIDER

  permission:com.huawei.motion.permission.MOTION_EX

  permission:com.huawei.contacts.permission.CHOOSE_SUBSCRIPTION

4.     动态运行权限的使用步骤

1.检查权限

/**
 * 1.检查权限
 * @param
 * @return 权限是否允许标志
 */
private boolean checkPermissions(String[] permissions) {
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

2.动态请求权限

/**
 * 2.如果没有权限,动态请求权限
 * @param
 * @return void
 */
private void requestPermission(String[] permissions) {
    ActivityCompat.requestPermissions(this, permissions, PERMISSIONS_CODE);
}

3.处理权限返回结果

/**
 * 3.处理返回结果
 * @param grantResults 返回对应权限请求数组,如果成功,则为PERMISSION_GRANTED,否则是PERMISSION_DENIED
 * @return void
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == PERMISSIONS_CODE) {
        boolean grantedFlag = true;
        // 判断是否所有的权限都已经授予了
        for (int grant : grantResults) {
            if (grant != PackageManager.PERMISSION_GRANTED) {
                grantedFlag = false;
                break;
            }
        }

        if (!grantedFlag) {
            guideUserSetting();
        }
    }
}

这个方法permissions参数是请求权限的数据,grantResults是权限请求结果数组,与permissions数组对应,它有两个值需要了解,PERMISSION_GRANTED表示权限通过,对应值是1,PERMISSION_DENIED表示权限被拒绝,对应值是-1.

4.如果权限请求有没有通过的,则弹出对话框提示用户设置,点击对话框按钮可以跳转到设置权限的界面。

/**
 * 4.如果失败,提示用户自己设置
 * @param
 * @return void
 */
private void guideUserSetting() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("备份通讯录需要访问 “通讯录” 和 “外部存储器”,请到 “应用信息 -> 权限” 中授予!");
    builder.setPositiveButton("去手动授权", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            isShowGuide = true;
        }
    });
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();
        }
    });
    builder.show();
}

自己在最后总结写了个demo,参考了网上实现的例子,测试没有问题。

最后附上简单的2张效果图

源码

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 6
码字总数 4103
×
cold19
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: