本文共 8629 字,大约阅读时间需要 28 分钟。
/* * 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; } ListneedRequest = 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); }
如果多个权限申请,
onRequestPermissionFailureWithAskNeverAgain
onRequestPermissionFailure
onRequestPermissionSuccess
可以通过,
if (!permissions.contains(Manifest.permission.WRITE_EXTERNAL_STORAGE))
判断权限是否通过
转载地址:http://uovcz.baihongyu.com/