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);
}运行行为
- 业务逻辑拦截:不同于相机、麦克风等 Android 系统权限,此监听器主要处理的是“虚拟权限”或“社交权限”。
- 异步处理:App 在收到回调后,可以跳转到自己的登录界面、弹出原生授权弹窗,或者直接查询数据库后决定。
- 双向闭环:必须调用
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 线程。