安卓6.0(API23)权限问题爬坑之旅!

来源:互联网 发布:机器人学 知乎 编辑:程序博客网 时间:2024/06/07 02:36

安卓6.0权限问题分析与解决

引言

现在安卓系统已经发布了最新的7.0版本,对系统进行了升级和优化,在6.0版本的时候修改了系统权限的安全级别,区分为普通权限和需要申请的特殊权限,6.0之前所有的权限都可以在清单配置文件在AndroidManifest.xml中申请,6.0之后只有部分权限可以在清单配置中申请,其他特殊权限需要动态申请,本文引用google的demo初步解决了6.0的权限申请问题,希望大家指正!

Google-demo下载地址

权限分类

普通权限(在清单配置中修改)

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

动态权限

以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。

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

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

权限申请

1.将targetSdkVersion设置为23,注意,如果你将targetSdkVersion设置为>=23,则必须按照Android谷歌的要求,动态的申请权限,如果你暂时不打算支持动态权限申请,则targetSdkVersion最大只能设置为22.(注:如果不需要使用23以上的特性或功能可以选择设置为22)
2. 在AndroidManifest.xml中申请你需要的权限,包括普通权限和需要申请的特殊权限。
3. 开始申请权限,此处分为3部。

(1)Activity继承AppCompatActivity,检查是否由此权限checkSelfPermission(),如果已经开启,则直接做你想做的。

public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {        if (permission == null) {            throw new IllegalArgumentException("permission is null");        }        return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());    }

(2)如果未开启,则判断是否需要向用户解释为何申请权限shouldShowRequestPermissionRationale。

 @Override    public boolean shouldShowRequestPermissionRationale(String permission) {        return super.shouldShowRequestPermissionRationale(permission);    }

(3)如果需要(即返回true),则可以弹出对话框提示用户申请权限原因,用户确认后申请权限requestPermissions(),如果不需要(即返回false),则直接申请权限requestPermissions()。

PermissionUtils.requestPermission(this, PermissionUtils.CODE_CAMERA, mPermissionGrant);

(4)在权限开启成功的回调方法中执行要执行的方法。

private PermissionUtils.PermissionGrant mPermissionGrant = new PermissionUtils.PermissionGrant() {        @Override        public void onPermissionGranted(int requestCode) {            switch (requestCode) {                case PermissionUtils.CODE_CAMERA:                    Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                    intent2.putExtra(MediaStore.EXTRA_OUTPUT,                            Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "pic.jpg")));                    startActivityForResult(intent2, 1);// 采用ForResult打开                    break;                default:                    break;            }        }    };

(5)显示权限开启结果。

 @Override    public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,                                           @NonNull int[] grantResults) {        PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);    }

最后给上demo

permissionutils

希望可以帮到入坑的同学

6 0
原创粉丝点击