Skip to content

setGameQueryPermissionListener

设置小游戏权限请求监听器

setGameQueryPermissionListener 用于处理小游戏在业务逻辑层面发起的非系统级权限申请

当小游戏需要访问敏感信息(如获取用户的昵称、头像、获取特定的业务授权或访问虚拟钱包)时,会调用相关的 JS API。由于 SDK 无法直接决定是否授权,它会将该请求回调给宿主 App,由 App 根据自身的账号体系或业务逻辑来决定是否通过。


方法声明

java
/**
 * 设置小游戏权限请求监听器
 *
 * @param listener 权限申请监听器
 */
void setGameQueryPermissionListener(SUDRTGameHandle.GameQueryPermissionListener listener);

内部接口与 Handle

java
public interface GameQueryPermissionListener {
    /**
     * 小游戏权限申请时调用
     *
     * @param handle     用于处理并回传权限申请结果的句柄
     * @param permission 申请的权限标识(如 "scope.userInfo", "scope.userLocation")
     * @param appId      当前小游戏的 ID
     */
    void onQueryPermission(SUDRTGameHandle.GameQueryPermissionHandle handle, String permission, String appId);
}

public interface GameQueryPermissionHandle {
    /**
     * 回传处理结果
     * @param permission 对应的权限标识
     * @param isGranted  是否同意授权
     */
    void complete(String permission, boolean isGranted);
}

运行行为

  1. 业务逻辑拦截:不同于相机、麦克风等 Android 系统权限,此监听器主要处理的是“虚拟权限”或“社交权限”。
  2. 异步处理:App 在收到回调后,可以跳转到自己的登录界面、弹出原生授权弹窗,或者直接查询数据库后决定。
  3. 双向闭环:必须调用 handle.complete() 才能解除 JS 层的等待状态,否则游戏中的 success/fail 回调将永远不会触发。

代码示例

java
gameHandle.setGameQueryPermissionListener(new SUDRTGameHandle.GameQueryPermissionListener() {
    @Override
    public void onQueryPermission(SUDRTGameHandle.GameQueryPermissionHandle handle, String permission, String appId) {
        // 1. 识别权限标识
        if ("scope.userInfo".equals(permission)) {
            // 2. 弹出原生授权对话框
            showMyAuthDialog(appId, "游戏申请获取您的公开信息(昵称、头像等)", new AuthCallback() {
                @Override
                public void onConfirm() {
                    // 3. 用户同意,通知引擎
                    handle.complete(permission, true);
                }

                @Override
                public void onCancel() {
                    // 4. 用户拒绝,通知引擎
                    handle.complete(permission, false);
                }
            });
        } else {
            // 对于未定义的权限,默认拒绝或忽略
            handle.complete(permission, false);
        }
    }
});

注意事项

  • 区分系统权限:如果游戏请求的是硬件权限(如摄像头),应使用 setGameQuerySystemPermissionListener。本接口仅用于业务/社交范围的权限。
  • 权限持久化:App 开发者通常需要自己记录用户的授权选择。如果用户已经同意过,在 onQueryPermission 中可以直接调用 handle.complete(permission, true) 而无需再次弹窗。
  • 线程切换:弹出对话框时需确保在 UI 线程。