现在国内各大市场对权限的要求跟原生的不一样
现在国内各大市场对权限的要求是:明确拒绝后48小时内不允许再次申请, 建议增加时间限制 或者 拒绝后直接不允许再次申请
这个还真是,而且还都要求有详细的说明,类似以下头部的说明

如何应对国内某些应用商店在明确拒绝权限后 48 小时内不允许再次申请的问题
- 首先这种属于业务逻辑的问题,框架本身是不会做这种事情的,但并非不能实现,这得益于框架良好的设计,框架内部提供了一个叫 IPermissionInterceptor 的拦截器类,当前有权限申请的时候,会走 requestPermissions 方法的回调,你可以重写这个方法的逻辑,先去判断要申请的权限是否在 48 小时内已经申请过了一次了,如果没有的话,就走权限申请的流程,如果有的话,那么就直接回调权限申请失败的方法。
public final class PermissionInterceptor implements IPermissionInterceptor {
private static final String SP_NAME_PERMISSION_REQUEST_TIME_RECORD = "permission_request_time_record";
@Override
public void requestPermissions(Activity activity, List<String> allPermissions, OnPermissionCallback callback) {
SharedPreferences sharedPreferences = activity.getSharedPreferences(SP_NAME_PERMISSION_REQUEST_TIME_RECORD, Context.MODE_PRIVATE);
String permissionKey = String.valueOf(allPermissions);
long lastRequestPermissionTime = sharedPreferences.getLong(permissionKey, 0);
if (System.currentTimeMillis() - lastRequestPermissionTime <= 1000 * 60 * 60 * 24 * 2) {
List<String> deniedPermissions = XXPermissions.getDenied(activity, allPermissions);
List<String> grantedPermissions = new ArrayList<>(allPermissions);
grantedPermissions.removeAll(deniedPermissions);
deniedPermissions(activity, allPermissions, deniedPermissions, true, callback);
if (!grantedPermissions.isEmpty()) {
grantedPermissions(activity, allPermissions, grantedPermissions, false, callback);
}
return;
}
sharedPreferences.edit().putLong(permissionKey, System.currentTimeMillis()).apply();
// 如果之前没有申请过权限,或者距离上次申请已经超过了 48 个小时,则进行申请权限
IPermissionInterceptor.super.requestPermissions(activity, allPermissions, callback);
}
@Override
public void grantedPermissions(Activity activity, List<String> allPermissions, List<String> grantedPermissions, boolean all, OnPermissionCallback callback) {
if (callback == null) {
return;
}
callback.onGranted(grantedPermissions, all);
}
@Override
public void deniedPermissions(Activity activity, List<String> allPermissions, List<String> deniedPermissions, boolean never, OnPermissionCallback callback) {
if (callback == null) {
return;
}
callback.onDenied(deniedPermissions, never);
}
}
@cuibg 你这个问题也可以通过这种方式来实现
请求权限的时候在状态栏下弹出popupwindow?
这样做的话,我们得把源码下下来实现,不能直接gradle
这样做的话,我们得把源码下下来实现,不能直接gradle
不需要,小伙子,这个拦截器有开放 API 给外部设置的,你可以看一下框架的 API 文档。
请求权限的时候在状态栏下弹出popupwindow?
在拦截器中显示对应的 UI,至于这个 UI 是什么,可以是 Dialog,也可以是 PopupWindow
@getActivity 谢谢哈
还有,小伙子,下次提问题,记得按照 issue 模板填写,从下一个人开始,如果没有严格按照这个 issue 模板填写是不会受理的,无论是不是框架的问题。
requestPermissions
你好,我这边用的18.5版本的,但是没有requestPermissions这个方法