听说 TBS x5 Webview 加载 H5 游戏提示申请相机权限

文章讲述了在将原生WebView替换为X5WebView以提升H5游戏加载速度后,遇到权限申请问题,特别是相机和录音权限。通过排查,发现问题是由于H5代码中某个函数enumerateMediaDeviceList导致的权限请求。注释掉该函数后,问题得到解决,游戏正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现如今,渠道上架应用或游戏,对敏感信息合规检测还是比较严格的,一般都会采用自动化 + 人工检测。

比如上架审核一个无需相机和录音权限的包体,绝大部分会遭到拒审(除非漏检?)!

本次遇到的就是类似情况,内嵌 H5 的 Unity 游戏,之前是使用原生的 WebView 加载 H5 游戏,

可是实际运行发现加载速度未达到预期效果,调研发现 X5 WebView 据说还可以(有质的提升?)!

腾讯浏览服务 —— 官网

在这里插入图片描述
(图:来自官方)

好了!!!

加载速度问题找到了解决方案

原生 WebView 替换为 X5 WebView

具体实施很清晰方便,按照官方文档接入即可。

官方文档指出的是 在线下载内核 完成内核加载等操作,这是使用方式一

聪明的你们肯定略知还有方式二离线安装内核

嗯,总结出来了,x5 内核使用的两种方式:

  • 在线安装
  • 离线安装

在线安装是大概像这样

HashMap map = new HashMap();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);

QbSdk.setDownloadWithoutWifi(true);
QbSdk.initTbsSettings(map);
QbSdk.setTbsListener(new TbsListener());

boolean need = TbsDownloader.needDownload(context, false);
QbSdk.initX5Environment(context, mPreInitCallback);
private static QbSdk.PreInitCallback mPreInitCallback = new QbSdk.PreInitCallback() {
        @Override
        public void onCoreInitFinished() {
            Log.d(TAG, "tbs init finished");
        }

        @Override
        public void onViewInitFinished(boolean isSupportX5) {
            if (isSupportX5) {
            	//已经有可用的内核,无需下载
                Log.d(TAG, "support x5");
            } else {
                Log.d(TAG, "not support x5");
                //重置并清除缓存等,开始下载线上内核
                QbSdk.reset(mContext);
                TbsDownloader.startDownload(mContext);
            }
        }
    };

离线安装大概是这样

离线安装重点就是 installLocalTbsCore本地内核安装包

isInitTbs = QbSdk.canLoadX5(context);
if(!isInitTbs){
	//拷贝内核文件到自定义外部存储目录 (一个 apk)
	FileUtils.copyAssets(assetsTbsApkPath,externalPath);
}

HashMap<String, Object> map = new HashMap<>(2);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
QbSdk.initTbsSettings(map);

//最新版本说 canLoadX5 过时,不过当前没有使用最先版本,有兴趣自行查阅
//当前使用版本是:tbs_sdk_thirdapp_v4.3.0.253_44153.jar
boolean canLoadX5 = QbSdk.canLoadX5(context);
if (canLoadX5) {
	//已有可用内核,无需安装本地内核,直接初始化
    preInit(context);
    return;
}

//开始安装本地内核
beginInstallLocalApk(context);
private void beginInstallLocalApk(final Context context) {
        QbSdk.reset(context);
        QbSdk.setTbsListener(new TbsListener() {
            @Override
            public void onDownloadFinish(int i) {
                LogUtil.d(TAG, "onDownloadFinish code = " + i);
            }

            @Override
            public void onInstallFinish(int code) {
                LogUtil.d(TAG, "onInstallFinish code = " + i);
                int tbsVersion = QbSdk.getTbsVersion(context);
                //这里是关注重点,本地安装成功之后是需要初始化的,切记
                preInit(context);
            }

            @Override
            public void onDownloadProgress(int i) {
                LogUtil.d(TAG, "onDownloadProgress code = " + i);
            }
        });

        //getTBSFileDir: 这个路径是你之前从 assets 拷贝内核到外部存储目录的位置
        QbSdk.installLocalTbsCore(context, 46007, FileUtils.getTBSFileDir(context).getPath() + File.separator + APK_NAME);
       
        //读写权限还是要的
        String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        boolean hasPermission = PermissionUtils.checkPermissions(context, permissions);
        if (!hasPermission) {
            LogUtil.d(TAG, "requestPermissions");
            Activity activity = CoreManager.getInstance().getActivity();
            PermissionUtils.requestPermissions(activity, permissions);
        }
    }

如何获取内核安装包,可看看某乎文章 呼呼呼呼呼呼呼呼~~

回归标题内容

上述一番操作之后,估计已能成功通过两种方式接入 x5!

兴高采烈,运行 Demo,加载 H5 游戏,一番操作惊呆了 😂

1、弹出权限申请提示

2、点击允许

3、继续弹出权限申请 Toast

4、卡在加载中无法进入游戏

测试: 卡住了,别动,叫人,快(图先欠着)

产品: 什么卡住了,进不去游戏,那还玩个球 😡

测试: 需要相机和录音权限就能进入游戏

产品: 什么,需要允许相机权限(和录音权限),那我还怎么过审 🤬

在这里插入图片描述
在这里插入图片描述
(堆栈信息是另外一个权限提示 dialog 弹窗)

经测试发现:

使用 045912 x5 内核:没有相机和录音权限申请问题,但是游戏加载提速未达到预期

使用 046007 x5 内核:可以达到预期的加载提速,但是存在权限问题

在这里插入图片描述

所以当时有两种问题排查方向是:

  • 修改内核 jar java 代码,不进行权限检测(代码修改之后运行初始化一直失败,似乎不可行?)
  • 寻找一个介于 045912~046007 的中间满足提速且没有权限问题的版本(有点大海捞针?)

仔细想想,使用 x5 webview 打开一个网页链接是不会弹出权限提示的,换到加载 h5 游戏就出现了,莫非问题和 h5 项目有强关联🤔

经过一番挣扎 。。。 。。。

我: 我们有没有检查过自己项目是否申请了相关权限?

技术 A: 没有

我: 那有没有使用过工具检测我们的代码,看看是否有权限先关(类似代码静态检测,js 代码我是不太懂的)

技术 B: 忽然间,我记得某某 js 文件存在 camera 先关代码,删除重新打包看看

一切正常了

😂 罪魁祸首竟然是它,注释掉关于 enumerateMediaDeviceList 的调用相关代码一切正常了!!!

function enumerateMediaDeviceList() {}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值