RafikiPermissions 是为了简化 Android 危险权限动态申请操作,将权限申请判断和权限申请过程简化,将权限申请结果拆分成授予成功和授予失败两部分处理,使结果处理更富有逻辑性。组件名称 Rafiki 拉菲奇来源于狮子王里的狒狒长老,统管权限 :D
步骤一:在项目的 build.gradle
中添加 jitpack
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
步骤二:添加依赖项
dependencies {
implementation 'com.github.nasduck:RafikiPermissions:1.2.0'
}
假设我们需要动态获取相机的权限 Manifest.permission.CAMERA
在 AndroidManifest.xml
中加入相应的权限:
<uses-permission android:name="android.permission.CAMERA" />
public class BaseActivity extends AppCompatActivity {
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 在onRequestPermissionsResult中加入这行代码,传入对应的值
RafikiPermissions.getInstance(this).onResult(requestCode, permissions, grantResults);
}
}
// 对于权限是否授予进行判断,已授予返回true,未授予进行权限授予操作
if (RafikiPermissions.getInstance(this)
.setResultStrategy(new PermissionResultCustomStrategy(this)) // 设置自定义的权限授予结果处理策略, 也有其他2种预定义策略
.requestCamera()) {
// 已经授予权限的逻辑操作
...
}
实现接口 OnPermissionResultListener
:
@Override
public void onPermissionsResultGrant(int requestCode) {
switch (requestCode) {
case RafikiResultCode.RESULT_CODE_CAMERA:
// 权限授予成功
}
}
@Override
public void onPermissionsResultDenied(int requestCode) {
switch (requestCode) {
case RafikiResultCode.RESULT_CODE_CAMERA:
// 权限授予失败后
}
}
提供三种权限处理策略
- PermissionResultNothingStrategy 默认策略. 无论是否授予策略, 不做任何操作
效果图:
- PermissionResultGuideStrategy 用户拒绝授予权限后, 弹出弹窗引导用户去应用设置中作权限授予
效果图:
- PermissionResultCustomStrategy 自定义权限授予策略. 实现
OnPermissionResultListener
接口自定义授权回调处理逻辑
效果图:
封装了各个权限对应的 .requestXX() 方法. 比如上面例子中, 请求照相权限, 直接调用 requestCamera()
动态请求多个权限时,根据需要添加相应的权限,最后使用 request()
方法请求权限,参数传入自定义的 requestCode(不传则默认为RafikiResultCode.RAFIKI_PERMISSION_RESULT_CODE
), 用以在回调中识别这次请求:
if (RafikiPermissions.getInstance(this)
.addReadExternalStorage()
.addWriteExternalStorage()
.setResultStrategy(new PermissionResultCustomStrategy(this)) // 设置自定义的权限授予结果处理策略
.request(RESULT_CODE)) {
// 已经授予权限的逻辑操作
}
或者使用 addPermissions()
设置一组权限
List<String> permissions = new ArrayList();
permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (RafikiPermissions.getInstance(this)
.addPermissions(permissions)
.setResultStrategy(new PermissionResultCustomStrategy(this))
.request(RESULT_CODE)) {
// 已经授予权限的逻辑操作
}
- Lihao Zhou
- Chuan DONG
- Si Cheng(设计师)
Copyright (2019) Chuan Dong, Lihao Zhou
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.