Android 6.0运行时权限解析与申请
2017-03-29 10:22
417 查看
在Android 6.0版本之前,权限都是无需用户许可,只要用户安装完,AndroidManifest清单上申请的权限都会被系统默认授权,并且授权后也撤销不了。
在Android 6.0版本时采用新的权限模型,只有在需要权限的时候,才告知用户是否授权,是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请。这样的用户的自主性提高很多,比如用户可以给APP赋予摄像的权限,但是可以拒绝记录设备位置的权限,就是怕位置信息上传等等。
权限分为正常权限(normal)和危险权限(dangerous),正常权限不需要去申请,和之前一样在AndroidManifest.xml文件中注册即可,危险权限是需要申请的。
normal:
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
dangerous:
实现方法:
1.在BaseActivity中添加以下代码:
3.在Fragment中的使用:
直接在自己的BaseFragment写个方法调用此Activity的方法即可。
参考:http://www.jianshu.com/p/d3a998ec04ad
http://blog.csdn.net/xuchao_blog/article/details/55259008
在Android 6.0版本时采用新的权限模型,只有在需要权限的时候,才告知用户是否授权,是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请。这样的用户的自主性提高很多,比如用户可以给APP赋予摄像的权限,但是可以拒绝记录设备位置的权限,就是怕位置信息上传等等。
权限分为正常权限(normal)和危险权限(dangerous),正常权限不需要去申请,和之前一样在AndroidManifest.xml文件中注册即可,危险权限是需要申请的。
normal:
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
dangerous:
实现方法:
1.在BaseActivity中添加以下代码:
private int permissionRequestCode = 88; private PermissionCallback permissionRunnable; public interface PermissionCallback { void hasPermission(); void noPermission(); } /** * Android M运行时权限请求封装 * * @param permissionDes 权限描述 * @param runnable 请求权限回调 * @param permissions 请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS */ public void performCodeWithPermission(@NonNull String permissionDes, PermissionCallback runnable, @NonNull String... permissions) { if (permissions == null || permissions.length == 0) return; // this.permissionrequestCode = requestCode; this.permissionRunnable = runnable; if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.M) || checkPermissionGranted(permissions)) { if (permissionRunnable != null) { permissionRunnable.hasPermission(); permissionRunnable = null; } } else { //permission has not been granted. requestPermission(permissionDes, permissionRequestCode, permissions); } } private boolean checkPermissionGranted(String[] permissions) { boolean flag = true; for (String p : permissions) { if (ActivityCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) { flag = false; break; } } return flag; } private void requestPermission(String permissionDes, final int requestCode, final String[] permissions) { if (shouldShowRequestPermissionRationale(permissions)) { //如果用户之前拒绝过此权限,再提示一次准备授权相关权限 new AlertDialog.Builder(this) .setTitle("提示") .setMessage(permissionDes) .setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode); } }).show(); } else { // Contact permissions have not been granted yet. Request them directly. ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode); } } private boolean shouldShowRequestPermissionRationale(String[] permissions) { boolean flag = false; for (String p : permissions) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, p)) { flag = true; break; } } return flag; } /** * Callback received when a permissions request has been completed. */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == permissionRequestCode) { if (verifyPermissions(grantResults)) { if (permissionRunnable != null) { permissionRunnable.hasPermission(); permissionRunnable = null; } } else { //showToast("暂无权限执行相关操作!"); Toast.makeText(BaseActivity.this,"暂无权限执行相关操作!",Toast.LENGTH_SHORT).show(); if (permissionRunnable != null) { permissionRunnable.noPermission(); permissionRunnable = null; } } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } public boolean verifyPermissions(int[] grantResults) { // At least one result must be checked. if (grantResults.length < 1) { return false; } // Verify that each required permission has been granted, otherwise return false. for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } 2.在需要申请权限的时候调用:
performCodeWithPermission() 例如:
performCodeWithPermission("我的程序请求访问相机权限",new BaseActivity.PermissionCallback() { @Override public void hasPermission() { //执行打开相机相关代码 Log.i("---------","已经获得权限了"); } @Override public void noPermission() { Log.i("---------","没有权限哦"); } }, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE); }
3.在Fragment中的使用:
直接在自己的BaseFragment写个方法调用此Activity的方法即可。
/** * Android M运行时权限请求封装 * @param permissionDes 权限描述 * @param runnable 请求权限回调 * @param permissions 请求的权限(数组类型),直接从Manifest中读取相应的值,比如Manifest.permission.WRITE_CONTACTS */ public void performCodeWithPermission(@NonNull String permissionDes,BaseAppCompatActivity.PermissionCallback runnable,@NonNull String... permissions){ if(getActivity()!=null && getActivity() instanceof BaseAppCompatActivity){ ((BaseAppCompatActivity) getActivity()).performCodeWithPermission(permissionDes,runnable,permissions); } }[/code]
参考:http://www.jianshu.com/p/d3a998ec04ad
http://blog.csdn.net/xuchao_blog/article/details/55259008
相关文章推荐
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0的运行时权限 批量申请
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android:6.0运行时权限解析
- android 6.0运行时新权限的申请(转载)
- Android 6.0 运行时权限处理完全解析 (摘抄)
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 向用户申请权限,运行时权限
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析