内置安装器实现说明.md 5.7 KB

内置安装器实现说明

📋 实现概述

实现了基于 PackageInstaller API 的内置安装器,支持 Android 8.0 及以下版本。同时保留了原有的系统安装器方式,用于 Android 8.1 及以上版本。

✅ 已完成的修改

1. 创建 InstallModule.java 原生插件

文件路径: bBeng-HeartRate-4.66-pad/uniplugin_module/src/main/java/io/dcloud/uniplugin/InstallModule.java

功能:

  • ✅ 使用 PackageInstaller API 实现内置安装器
  • ✅ 支持 Android 5.0+ (API 21+)
  • ✅ 自动监听安装结果
  • ✅ 提供安装进度反馈(日志)
  • ✅ 兼容 Android 8.0 和 Android 12+ 的 PendingIntent 标志

主要方法:

  • installApkWithPackageInstaller(String apkPath, UniJSCallback callback): 使用内置安装器安装 APK
  • getAndroidVersion(): 获取当前 Android 版本号
  • isPackageInstallerSupported(): 检查是否支持 PackageInstaller

2. 注册插件到 dcloud_uniplugins.json

文件路径: bBeng-HeartRate-4.66-pad/app/src/main/assets/dcloud_uniplugins.json

修改内容:

{
  "type": "module",
  "name": "InstallModule",
  "class": "io.dcloud.uniplugin.InstallModule"
}

3. 修改 app-info.vue

文件路径: heart-app-hbuilder-x/pages/platform-page/app-info/app-info.vue

主要修改:

  1. 添加版本判断逻辑:

    • Android 8.0 (API 26) 及以下:使用 PackageInstaller(内置安装器)
    • Android 8.1 (API 27) 及以上:使用 plus.runtime.install(系统安装器)
  2. 新增方法:

    • checkAndroidVersionAndInstall(): 检查版本并选择安装方式
    • installApkWithPackageInstaller(): 使用内置安装器安装(无需退出 Kiosk)
    • installApkWithSystemInstaller(): 使用系统安装器安装(普通安装,不涉及 Kiosk)
  3. 移除的方法:

    • 移除了 temporaryExitKioskAndInstall() 方法(不再需要临时退出 Kiosk)
  4. 修复:

    • 添加了缺失的 showOpenFolder 数据属性

🔄 工作流程

Android 8.0 及以下(内置安装器)

用户点击下载/安装
    ↓
下载完成
    ↓
checkAndroidVersionAndInstall()
    ↓
检测到 API ≤ 26
    ↓
installApkWithPackageInstaller()
    ├─ 使用 PackageInstaller API
    ├─ 无需退出 Kiosk 模式 ✅
    ├─ 显示安装进度
    └─ 监听安装结果
    ↓
安装完成/失败
    ↓
显示结果提示

Android 8.1 及以上(系统安装器)

用户点击下载/安装
    ↓
下载完成
    ↓
checkAndroidVersionAndInstall()
    ↓
检测到 API > 26
    ↓
installApkWithSystemInstaller()
    ├─ 使用 plus.runtime.install
    ├─ 普通安装,不涉及 Kiosk ✅
    └─ 系统处理安装流程
    ↓
安装完成/失败
    ↓
显示结果提示

🎯 核心优势

内置安装器(Android 8.0 及以下)

  1. 无需退出 Kiosk 模式

    • 安装过程完全在应用内完成
    • 不会触发系统安装界面
    • 保持 Kiosk 模式锁定状态
  2. 完全控制

    • 可以显示自定义安装进度
    • 可以监听安装结果
    • 可以处理安装错误
  3. 用户体验

    • 无缝安装体验
    • 不会中断应用使用
    • 安装完成后自动处理

系统安装器(Android 8.1 及以上)

  1. 简单可靠

    • 使用系统原生安装器
    • 符合 Android 安全策略
    • 用户熟悉的安装界面
  2. 无需特殊处理

    • 不涉及 Kiosk 操作
    • 系统自动处理权限
    • 安装完成后自动重启

📝 代码示例

Vue 层调用

// 检查版本并安装
this.checkAndroidVersionAndInstall();

// 或直接调用内置安装器
this.installApkWithPackageInstaller();

// 或直接调用系统安装器
this.installApkWithSystemInstaller();

原生层调用

// 获取 Android 版本
int version = InstallModule.getAndroidVersion();

// 检查是否支持
boolean supported = InstallModule.isPackageInstallerSupported();

// 安装 APK
InstallModule.installApkWithPackageInstaller(apkPath, callback);

⚠️ 注意事项

1. 权限要求

AndroidManifest.xml 中已配置:

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2. Android 8.0 特殊处理

  • Android 8.0 引入了 REQUEST_INSTALL_PACKAGES 权限
  • 如果应用不是 Device Owner,可能需要用户授权"安装未知应用"
  • 作为 Device Owner 应用,可以绕过部分限制

3. 安装结果监听

  • 使用 BroadcastReceiver 动态注册监听安装结果
  • 安装完成后自动取消注册
  • 支持多个安装会话(通过 sessionId 区分)

4. 错误处理

  • 文件不存在:返回错误信息
  • 权限不足:返回错误信息
  • 安装失败:返回系统错误信息

🧪 测试要点

  1. ✅ Android 8.0 设备:测试内置安装器功能
  2. ✅ Android 8.1+ 设备:测试系统安装器功能
  3. ✅ 安装成功场景:验证安装流程和结果提示
  4. ✅ 安装失败场景:验证错误处理和提示
  5. ✅ Kiosk 模式:验证 Android 8.0 下无需退出 Kiosk
  6. ✅ 权限处理:验证权限申请和授权流程

📚 相关文件

  • InstallModule.java: 内置安装器实现
  • app-info.vue: 前端安装逻辑
  • dcloud_uniplugins.json: 插件注册配置
  • 内置安装器方案分析.md: 方案分析文档

🔗 参考资源