博客
关于我
记录下 rxpermissions2 的封装
阅读量:501 次
发布时间:2019-03-07

本文共 8617 字,大约阅读时间需要 28 分钟。

Android 权限申请工具类

工具类

/* * Copyright 2017 JessYan * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.yoshin.commonlibrary.permission;import android.Manifest;import com.tbruyelle.rxpermissions2.Permission;import com.tbruyelle.rxpermissions2.RxPermissions;import java.util.ArrayList;import java.util.List;import io.reactivex.annotations.NonNull;import me.jessyan.rxerrorhandler.core.RxErrorHandler;import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;/** * ================================================ * 权限请求工具类 * * @see PermissionUtil wiki 官方文档 * Created by JessYan on 17/10/2016 10:09 * Contact me * Follow me * ================================================ */public class PermissionUtil {       private PermissionUtil() {           throw new IllegalStateException("you can't instantiate me!");    }    public static void requestPermission(final RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler, String... permissions) {           if (permissions == null || permissions.length == 0) {               return;        }        List
needRequest = new ArrayList<>(); for (String permission : permissions) { //过滤调已经申请过的权限 if (!rxPermissions.isGranted(permission)) { needRequest.add(permission); } } if (needRequest.isEmpty()) { //全部权限都已经申请过,直接执行操作 if (requestPermission != null) { requestPermission.onRequestPermissionSuccess(); } } else { //没有申请过,则开始申请 rxPermissions .requestEach(needRequest.toArray(new String[0])) .buffer(permissions.length) .subscribe(new ErrorHandleSubscriber
>(errorHandler) { @Override public void onNext(@NonNull List
permissions) { List
failurePermissions = new ArrayList<>(); List
askNeverAgainPermissions = new ArrayList<>(); for (Permission p : permissions) { if (!p.granted) { if (p.shouldShowRequestPermissionRationale) { failurePermissions.add(p.name); } else { askNeverAgainPermissions.add(p.name); } } } if (failurePermissions.size() > 0) { if (requestPermission != null) { requestPermission.onRequestPermissionFailure(failurePermissions); } } if (askNeverAgainPermissions.size() > 0) { if (requestPermission != null) { requestPermission.onRequestPermissionFailureWithAskNeverAgain(askNeverAgainPermissions); } } if (failurePermissions.size() == 0 && askNeverAgainPermissions.size() == 0) { if (requestPermission != null) { requestPermission.onRequestPermissionSuccess(); } } } }); } } public static void all(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA); } /** * 请求摄像头权限 */ public static void launchCamera(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA); } public static void scanQrCode(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.CAMERA); } /** * 请求外部存储的权限 *

* 当申明了WRITE_EXTERNAL_STORAGE权限时, READ_EXTERNAL_STORAGE权限会自动添加的。 */ public static void externalStorage(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE); } /** * 请求发送短信权限 */ public static void sendSms(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.SEND_SMS); } /** * 请求打电话权限 */ public static void callPhone(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.CALL_PHONE); } /** * 请求获取手机状态的权限 */ public static void readPhoneState(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.READ_PHONE_STATE); } /** * 手机通讯录 * * @param requestPermission * @param rxPermissions * @param errorHandler */ public static void readPhoneContact(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.READ_CONTACTS, Manifest.permission.READ_PHONE_STATE); } /** * 手机位置信息 * * @param requestPermission * @param rxPermissions * @param errorHandler */ public static void readPhoneLocation(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE); } /** * 手机录像机 * * @param requestPermission * @param rxPermissions * @param errorHandler */ public static void readVideoPermission(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } public static void readVersionPermission(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION , Manifest.permission.ACCESS_FINE_LOCATION); } public static void readRecordAudio(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO ); } public static void readCalendar(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) { requestPermission(requestPermission, rxPermissions, errorHandler, Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR ); } public interface RequestPermission { /** * 权限请求成功 */ void onRequestPermissionSuccess(); /** * 用户拒绝了权限请求, 权限请求失败, 但还可以继续请求该权限 * * @param permissions 请求失败的权限名 */ void onRequestPermissionFailure(List

permissions); /** * 用户拒绝了权限请求并且用户选择了以后不再询问, 权限请求失败, 这时将不能继续请求该权限, 需要提示用户进入设置页面打开该权限 * * @param permissions 请求失败的权限名 */ void onRequestPermissionFailureWithAskNeverAgain(List
permissions); }}

需要依赖:

"rxpermissions2"             : "com.github.tbruyelle:rxpermissions:0.10.2",            "rxerrorhandler2"            : "me.jessyan:rxerrorhandler:2.1.1",

注意:

同一时间多次调用无效,如果需要申请多个权限,需要如下

public static void all(RequestPermission requestPermission, RxPermissions rxPermissions, RxErrorHandler errorHandler) {           requestPermission(requestPermission, rxPermissions, errorHandler,                Manifest.permission.ACCESS_COARSE_LOCATION,                Manifest.permission.ACCESS_FINE_LOCATION,                Manifest.permission.READ_PHONE_STATE,                Manifest.permission.WRITE_EXTERNAL_STORAGE,                Manifest.permission.CAMERA);    }

如果多个权限申请,

  1. 有一个点击不再询问,那么回调的是onRequestPermissionFailureWithAskNeverAgain
  2. 有一个禁止那么回调onRequestPermissionFailure
  3. 都同意,俺么onRequestPermissionSuccess

可以通过,

if (!permissions.contains(Manifest.permission.WRITE_EXTERNAL_STORAGE))

判断权限是否通过

来源

转载地址:http://uovcz.baihongyu.com/

你可能感兴趣的文章
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
查看>>
Nginx 我们必须知道的那些事
查看>>
Nginx 源码完全注释(11)ngx_spinlock
查看>>
Nginx 的 proxy_pass 使用简介
查看>>
Nginx 的 SSL 模块安装
查看>>
Nginx 的优化思路,并解析网站防盗链
查看>>
Nginx 的配置文件中的 keepalive 介绍
查看>>
Nginx 相关介绍(Nginx是什么?能干嘛?)
查看>>
Nginx 知识点一网打尽:动静分离、压缩、缓存、跨域、高可用、性能优化...
查看>>
nginx 禁止以ip形式访问服务器
查看>>
NGINX 端口负载均衡
查看>>
Nginx 结合 consul 实现动态负载均衡
查看>>
Nginx 负载均衡与权重配置解析
查看>>