你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
首页
热门
推荐
精选
登录
|
注册
Android 6.0 超级简单的权限申请2 (Permission)
立即下载
用AI写一个
该例子支持:好用才打赏哦
现在下载学习
发布时间:2018-07-03
45人
|
浏览:2694次
|
收藏
|
分享
技术:Android权限申请
运行环境:AndroidStudio
概述
一句代码搞定权限申请,不需要多余的配置。
详细
### 写在前面 上次写了一个权限申请的例子[Android 6.0 超级简单的权限申请 (Permission)](http://www.demodashi.com/demo/13369.html),原理是封装权限申请的代码到一个Helper类,然后重写`onRequestPermissionsResult`方法处理。这已经是很简洁的权限申请方法了,但是还不够,因为这里还需要重写`onRequestPermissionsResult`方法。所以研究了一番,再写了一个例子,不需要重写`onRequestPermissionsResult`方法,真正做到一句代码搞定权限申请。 ### 实现原理 封装权限申请的相关代码到一个Helper类中,在申请权限的时候,启动一个Fragment,但不显示,在Fragment中申请权限,也在Fragment中处理权限,最后回调给Helper。 ### 实现过程 * 封装`PermissionHelper`类,定义对外开放的方法 ```java /** * @param permissions e.g. {@link Manifest.permission#CAMERA} * @return true if all granted, false otherwise. */ public static boolean isGranted(Activity activity, String... permissions) /** * @param grantedListener run on all permission granted * @param deniedListener run if one permission denied */ public static void requestPermissions(Activity activity, OnPermissionGrantedListener grantedListener, OnPermissionDeniedListener deniedListener, String... permissions) ``` * 获取`AndroidManifest`中注册的权限 ```java private static List
getRegisteredInManifestPermissions(Activity activity) { List
list = new ArrayList<>(); try { PackageInfo packageInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_PERMISSIONS); String[] permissions = packageInfo.requestedPermissions; if (permissions != null) { list.addAll(Arrays.asList(permissions)); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return list; } ``` * 检查权限是否已经注册 ```java for (String permission : permissions) { if (!mRegisteredInManifestPermissions.contains(permission)) { throw new IllegalArgumentException("the permission \"" + permission + "\" is not registered in AndroidManifest.xml"); } } ``` * 检查权限是否已经允许,AndroidM以下的设备直接判断为允许 ```java public static boolean isGranted(Activity activity, String... permissions) { checkPermissions(activity, permissions); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { for (String permission : permissions) { if (activity.checkSelfPermission(permission) == PackageManager.PERMISSION_DENIED) { return false; } } } return true; } ``` * 初始化`Fragment`并添加到`Activity`中 这里的`PermissionHelper`直接继承`Fragment`了,直接重写`onRequestPermissionsResult`处理回调。`new Fragment`之前先检查此Activity中是否已经存在一个,如果有则直接使用。 ```java Fragment fragment = activity.getFragmentManager().findFragmentByTag(TAG); if (fragment == null) { fragment = new PermissionHelper(); FragmentManager fragmentManager = activity.getFragmentManager(); fragmentManager.beginTransaction().add(fragment, TAG).commitAllowingStateLoss(); fragmentManager.executePendingTransactions(); } ``` * 利用Fragment申请权限 ```java fragment.requestPermissions(permissions, mRequestCode++); ``` * 处理`onRequestPermissionsResult`方法,并把结果正确的回调给用户 ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (mOnGrantedListeners.containsKey(requestCode)) { // 这里规定全部权限都通过才算通过 boolean granted = true; // 在Activity A申请权限,然后马上跳转到Activity B,则grantResults.length=0 if (grantResults.length == 0) granted = false; for (int result : grantResults) { if (result == PackageManager.PERMISSION_DENIED) { granted = false; } } if (granted) { OnPermissionGrantedListener listener = mOnGrantedListeners.get(requestCode); if (listener != null) listener.onGranted(); } else { OnPermissionDeniedListener listener = mOnDeniedListeners.get(requestCode); if (listener != null) listener.onDenied(); } mOnGrantedListeners.remove(mRequestCode); mOnDeniedListeners.remove(mRequestCode); } } ``` ### 使用方法 直接在Activity中调用下面代码既可,虽然很多行,但只是一句代码哈哈 ```java PermissionHelper.requestPermissions(this, () -> { // on granted Toast.makeText(MainActivity.this, "onGranted", Toast.LENGTH_SHORT).show(); }, () -> { // on denied Toast.makeText(MainActivity.this, "onDenied", Toast.LENGTH_SHORT).show(); }, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE); ``` ### 文件结构图 ![](/contentImages/image/20180702/cCmweDkiqJxLzx6s7IZ.png) ### 演示效果图 ![](/contentImages/image/20180702/JXZqVLNQknUtpl1k2zI.gif) ### 运行代码可能出现的问题 * compileSdkVersion 27,可以改成你电脑中存在的SDK版本。 * 这里用的是 gradle-4.4-all.zip,如果你用的是其它版本,那么可能会下载超级慢,建议改成你电脑中存在的gradle版本,改文件PermissionHelper/gradle/wrapper/gradle-wrapper.properties即可。 * 其它问题可以直接联系我。
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
感谢
3
手机上随时阅读、收藏该文章 ?请扫下方二维码
相似例子推荐
评论
作者
AudienL
3
例子数量
359
帮助
13
感谢
评分详细
可运行:
4.5
分
代码质量:
4.5
分
文章描述详细:
4.5
分
代码注释:
4.5
分
综合:
4.5
分
作者例子
Android 6.0 超级简单的权限申请 (Permission)
一个完全摆脱findViewById的自动绑定库
Android 6.0 超级简单的权限申请2 (Permission)