实现了基于 PackageInstaller API 的内置安装器,支持 Android 8.0 及以下版本。同时保留了原有的系统安装器方式,用于 Android 8.1 及以上版本。
文件路径: bBeng-HeartRate-4.66-pad/uniplugin_module/src/main/java/io/dcloud/uniplugin/InstallModule.java
功能:
主要方法:
installApkWithPackageInstaller(String apkPath, UniJSCallback callback): 使用内置安装器安装 APKgetAndroidVersion(): 获取当前 Android 版本号isPackageInstallerSupported(): 检查是否支持 PackageInstaller文件路径: bBeng-HeartRate-4.66-pad/app/src/main/assets/dcloud_uniplugins.json
修改内容:
{
"type": "module",
"name": "InstallModule",
"class": "io.dcloud.uniplugin.InstallModule"
}
文件路径: heart-app-hbuilder-x/pages/platform-page/app-info/app-info.vue
主要修改:
添加版本判断逻辑:
plus.runtime.install(系统安装器)新增方法:
checkAndroidVersionAndInstall(): 检查版本并选择安装方式installApkWithPackageInstaller(): 使用内置安装器安装(无需退出 Kiosk)installApkWithSystemInstaller(): 使用系统安装器安装(普通安装,不涉及 Kiosk)移除的方法:
temporaryExitKioskAndInstall() 方法(不再需要临时退出 Kiosk)修复:
showOpenFolder 数据属性用户点击下载/安装
↓
下载完成
↓
checkAndroidVersionAndInstall()
↓
检测到 API ≤ 26
↓
installApkWithPackageInstaller()
├─ 使用 PackageInstaller API
├─ 无需退出 Kiosk 模式 ✅
├─ 显示安装进度
└─ 监听安装结果
↓
安装完成/失败
↓
显示结果提示
用户点击下载/安装
↓
下载完成
↓
checkAndroidVersionAndInstall()
↓
检测到 API > 26
↓
installApkWithSystemInstaller()
├─ 使用 plus.runtime.install
├─ 普通安装,不涉及 Kiosk ✅
└─ 系统处理安装流程
↓
安装完成/失败
↓
显示结果提示
无需退出 Kiosk 模式
完全控制
用户体验
简单可靠
无需特殊处理
// 检查版本并安装
this.checkAndroidVersionAndInstall();
// 或直接调用内置安装器
this.installApkWithPackageInstaller();
// 或直接调用系统安装器
this.installApkWithSystemInstaller();
// 获取 Android 版本
int version = InstallModule.getAndroidVersion();
// 检查是否支持
boolean supported = InstallModule.isPackageInstallerSupported();
// 安装 APK
InstallModule.installApkWithPackageInstaller(apkPath, callback);
AndroidManifest.xml 中已配置:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
REQUEST_INSTALL_PACKAGES 权限InstallModule.java: 内置安装器实现app-info.vue: 前端安装逻辑dcloud_uniplugins.json: 插件注册配置内置安装器方案分析.md: 方案分析文档