现在安卓系统已经发布了最新的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); }permissionutils
新闻热点
疑难解答