博客
关于我
记录下 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/

你可能感兴趣的文章
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>