123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- import {ref} from "vue"
- export function useVersionUpdate() {
- const progress = ref(0);
- let downloadTask = null;
- function checkInstallPermission() {
- // 获取主Activity对象
- const mainActivity = plus.android.runtimeMainActivity();
- // 获取PackageManager对象
- const packageManager = mainActivity.getPackageManager();
- // 正确方式:使用plus.android.invoke调用方法
- const canRequest = plus.android.invoke(packageManager, "canRequestPackageInstalls");
- if (canRequest) {
- console.log("应用有安装权限");
- return true;
- } else {
- console.log("应用无安装权限,需要请求");
- return false;
- }
- }
- function requestInstallPermission() {
- return new Promise((resolve) => {
- // 跳转到允许安装未知来源应用的设置界面
- const Intent = plus.android.importClass("android.content.Intent");
- const Settings = plus.android.importClass("android.provider.Settings");
- const mainActivity = plus.android.runtimeMainActivity();
- const intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
- // 设置应用的包名
- const uri = plus.android.invoke(
- plus.android.invoke("android.net.Uri", "parse", "package:" + plus.runtime.appid)
- );
- intent.setData(uri);
- // 启动Activity并处理结果
- mainActivity.startActivityForResult(intent, 1001);
- // 监听Activity结果(需要在App.vue的onActivityResult中全局监听)
- plus.globalEvent.addEventListener("onActivityResult", (result) => {
- if (result.requestCode === 1001) {
- // 再次检查权限状态
- checkInstallPermission().then(hasPermission => {
- resolve(hasPermission);
- });
- }
- });
- });
- }
- function downloadAndInstallApk(apkUrl) {
- return new Promise((resolve, reject) => {
- uni.showLoading({ title: '下载中...', mask: true });
- uni.downloadFile({
- url: apkUrl,
- success: (downloadResult) => {
- uni.hideLoading();
- if (downloadResult.statusCode === 200) {
- const tempFilePath = downloadResult.tempFilePath;
- // 安装APK
- plus.runtime.install(tempFilePath, { force: true }, () => {
- uni.showToast({ title: '安装成功', icon: 'success' });
- setTimeout(() => {
- plus.runtime.restart(); // 重启应用
- }, 1500);
- resolve();
- }, (err) => {
- console.error('安装失败: ', err);
- uni.showToast({ title: '安装失败', icon: 'none' });
- reject(err);
- });
- }
- },
- fail: (error) => {
- uni.hideLoading();
- console.error('下载失败: ', error);
- uni.showToast({ title: '下载失败', icon: 'none' });
- reject(error);
- }
- });
- });
- }
- async function initDownload(url) {
- console.log('url下载', url)
- try {
- // 1. 检查安装权限
- const hasPermission = await checkInstallPermission();
- console.log('权限', hasPermission)
- if (!hasPermission) {
- // 2. 如果没有权限,请求权限
- uni.showModal({
- title: '权限申请',
- content: '需要您允许应用安装权限,以便完成版本更新。',
- confirmText: '去设置',
- success: async (res) => {
- if (res.confirm) {
- const permissionGranted = await requestInstallPermission();
- if (permissionGranted) {
- // 3. 权限获取成功,开始下载安装
- await downloadAndInstallApk(url);
- } else {
- uni.showToast({ title: '权限获取失败', icon: 'none' });
- }
- }
- }
- });
- } else {
- // 已经有权限,直接下载安装
- await downloadAndInstallApk(url);
- }
- } catch (error) {
- console.error('更新流程出错: ', error);
- uni.showToast({ title: '更新失败', icon: 'none' });
- }
- }
- return {
- requestInstallPermission,
- initDownload,
- progress
- }
- }
|