博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录下 rxpermissions2 的封装
阅读量:498 次
发布时间:2019-03-07

本文共 8629 字,大约阅读时间需要 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/

你可能感兴趣的文章