Android M 的动态权限解决方案
2016-07-13 17:02
531 查看
Android M 的动态权限解决方案
最近公司项目在内测用户群中发现严重问题,安卓6.0系统在声波配置的界面会闪退。毫无疑问那就是动态权限的问题,由于项目的 build.gradle 中 targetSdkVersion 23而代码中没有处理高危权限,抛出 Permission Denied异常而闪退。下面列出可行解决的方案:
最简单的解决方案就是 把 build.gradle 中 targetSdkVersion 23 修改为 targetSdkVersion 22,在6.0的系统上运行的时候会使用原来的权限处理。然而这里有一个隐藏的问题,如果用户在应用权限中关闭所必须的权限,那么头疼的问题又来了,就需要第二种方案。作为程序员还是不要偷懒,多读书多看报,少吃零食早睡觉。。dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:support-annotations:23.3.0' //需要注意如果有这样的依赖,则需要把 23.3.0,修改为22的版本。 ..... }
Android系统包含默认的授权提示框, 但是我们仍需要设置自己来封装. 原因是系统提供的授权框, 会有不再提示的选项. 如果用户选择, 则无法触发授权提示. 使用自定义的提示页面, 可以给予用户手动修改授权的指导.这里我们就需要偷懒了,毕竟轮子那么多,拿来用总会有奇效。
我使用的 EasyPermission 进行封装调用一个方法即可检测运行时权限,还有很多第三方库。
public class BaseActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { private static final int RC_PERM = 123; private CheckPermListener mListener; public interface CheckPermListener { void superPermission(); } /*检测权限的方法 listener 权限通过回调 resString 权限的解释语句(引导用户开启权限) mPerms 所需检测的权限 */ @AfterPermissionGranted(RC_PERM) public void checkPermission(CheckPermListener listener,int resString, String... mPerms) { mListener = listener; if (EasyPermissions.hasPermissions(this, mPerms)) { mListener.superPermission();//回调 } else { EasyPermissions.requestPermissions(this, getString(resString), RC_PERM, mPerms); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == EasyPermissions.SETTINGS_REQ_CODE) { //从设置界面返回 } } @Override public void onPermissionsGranted(int requestCode, List<String> perms) { } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { EasyPermissions.checkDeniedPermissionsNeverAskAgain(this, getString(R.string.perm_tip), R.string.setting, R.string.cancel, null, perms); } }
在其他Activity中只要extent BaseActivity 合适的触发条件直接调用方法即可,如:
@Override protected void onResume() { super.onResume(); checkPermission( new BaseActivity.CheckPermListener() { @Override public void superPermission() { //原来需要权限去完成的 工作写这里。。 } }, R.string.ask_again, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE); }
在依存于Activity的Fragment中使用参考如下:
((BaseActivity) getActivity()).checkPermission( new BaseActivity.CheckPermListener() { @Override public void superPermission() { toFindDevice(device); } }, R.string.ask_again, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE);
EasyPermission开源地址: https://github.com/googlesamples/easypermissions
高危权限列表:
联系作者
Github: https://github.com/forjrking邮箱: forjrking@sina.com
相关文章推荐
- Android M Runtime Permission 介绍
- Android 6.0运行时权限解决办法
- Android系统-开篇
- Android M运行时权限详解
- Android6.0 运行时权限
- android 6.0运行时权限的申请(微信在android 6.0上实现运行时请求权限的实现)
- Android M 新的运行时权限开发者需要知道的一切
- 运行时权限与文件系统权限
- android6.0(M)新特性
- Android6.0运行时权限处理
- 深入理解android6.0 RunTime Permisstion
- Android 6.0及以上版本的运行时权限介绍
- Android 6.0 应用权限(二) -- 与系统权限一起工作(Working with System Permissions) 使用MarkDown重新整理了排版
- Android运行时权限(危险权限)
- 探讨Android 6.0及以上新权限系统的检测与处理
- Android6.0运行时权限
- Android6.0【运行时申请权限】的分析
- Android不使用支持库请求运行时权限
- Android应用商店——Splash页面的实现,Android运行时权限的使用
- Android6.0运行时权限