Skip to content

setGameQuerySystemPermissionListener

设置系统权限请求监听器

setGameQuerySystemPermissionListener 用于处理 Runtime 模块在需要调用 Android 系统硬件能力(如摄像头、麦克风、地理位置、蓝牙等)时的授权逻辑。

不同于业务权限,系统权限直接涉及 Android 操作系统的 Runtime Permissions。通过此监听器,App 可以接管授权前的提示逻辑,例如在弹出系统权限框之前,向用户解释为什么要使用该权限,或者在用户拒绝后引导其前往系统设置。


方法声明

java
/**
 * 设置 Runtime 模块请求系统权限的监听器。
 * 如果应用需要在系统服务被关闭或者权限被用户拒绝的情况再次提示或者引导用户,请设置此监听者。
 */
void setGameQuerySystemPermissionListener(SUDRTGameHandle.GameQuerySystemPermissionListener listener);

内部接口与 Handle

java
public interface GameQuerySystemPermissionListener {
    /**
     * 向系统申请权限前调用
     *
     * @param handle           申请结果回调,用于通知 Runtime 继续后续流程
     * @param fromJSMethod     触发本次授权的 JS API 名称(如 "startRecord")
     * @param systemPermission 申请的系统权限字符串(如 "android.permission.RECORD_AUDIO")
     * @param appId            小游戏 ID
     * @param authStatus       当前权限状态(GRANTED=1, DENIED=2)
     * @param serviceEnabled   系统服务(如 GPS 开关)是否已开启
     */
    void beforeQuerySystemPermission(SUDRTGameHandle.GameQuerySystemPermissionHandle handle, 
                                   String fromJSMethod, String systemPermission, 
                                   String appId, int authStatus, boolean serviceEnabled);
}

权限处理流程

  1. 触发:游戏调用如 wx.startRecord

  2. 前置回调:Runtime 触发 beforeQuerySystemPermission

  3. App 介入权限已被拒:App 弹出对话框引导用户去设置页。 权限未申请:App 弹出自定义说明,点击确定后通知 Runtime 继续。

  4. 继续流程:App 调用 handle.continueQuerySystemPermission(permission),Runtime 随后执行真正的系统 requestPermissions


代码示例

java
gameHandle.setGameQuerySystemPermissionListener(new SUDRTGameHandle.GameQuerySystemPermissionListener() {
    @Override
    public void beforeQuerySystemPermission(SUDRTGameHandle.GameQuerySystemPermissionHandle handle, 
                                         String fromJSMethod, String systemPermission, 
                                         String appId, int authStatus, boolean serviceEnabled) {
        
        // 1. 如果用户之前永久拒绝了权限
        if (authStatus == SUDRTGameHandle.PERMISSION_AUTH_STATUS_DENIED) {
            showGoToSettingsDialog(systemPermission);
            // 此时可以不调用 handle,或者根据业务逻辑决定是否中断
            return;
        }

        // 2. 如果是录音权限,且系统 GPS/录音服务未开启
        if (Manifest.permission.RECORD_AUDIO.equals(systemPermission) && !serviceEnabled) {
            showToast("请先开启手机录音服务");
            return;
        }

        // 3. 正常流程:告知 Runtime 可以继续执行系统层面的权限申请
        handle.continueQuerySystemPermission(systemPermission);
    }
});

注意事项

  • 权限声明:此监听器仅负责“逻辑确认”,所有需要的系统权限依然必须在 App 的 AndroidManifest.xml 中静态声明。

  • 状态常量

  • PERMISSION_AUTH_STATUS_GRANTED (1): 已获得授权。

  • PERMISSION_AUTH_STATUS_DENIED (2): 已拒绝授权。

  • UI 线程安全:涉及到弹窗引导时,请确保在 UI 线程执行。

  • 必须回调:如果业务逻辑允许继续申请,**必须调用 handle.continueQuerySystemPermission**,否则 Runtime 会一直挂起等待,导致 JS API 无法得到响应。