博客
关于我
记录下 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模糊查询like效率,以及更高效的写法
查看>>
MySQL死锁套路:一次诡异的批量插入死锁问题分析
查看>>
Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction
查看>>
mysql每个数据库的最大连接数_MySQL数据库最大连接数
查看>>
Mysql流程控制结构,if函数、case结构、if结构、循环结构
查看>>
mysql添加外网访问权限
查看>>
mysql添加用户
查看>>
MySQL添加用户、删除用户与授权
查看>>
mysql添加用户及权限
查看>>
Mysql添加用户并授予只能查询权限
查看>>
mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决
查看>>
mysql添加索引
查看>>
mysql添加表注释、字段注释、查看与修改注释
查看>>
mysql清理undo线程_MySQL后台线程的清理工作
查看>>
mysql清空带外键的表
查看>>
MySQL清空表数据
查看>>
mysql源码安装
查看>>
Mysql源码安装过程中可能碰到的问题
查看>>
MySQL灵魂16问,你能撑到第几问?
查看>>
MySQL灵魂拷问:36题带你面试通关
查看>>