166 lines
5.3 KiB
JavaScript
166 lines
5.3 KiB
JavaScript
/**
|
||
* 检查当前平台是否为安卓
|
||
*/
|
||
export function isAndroid() {
|
||
return uni.getSystemInfoSync().platform === 'android'
|
||
}
|
||
|
||
/**
|
||
* 确保 setTimeout 函数可用
|
||
*/
|
||
if (typeof setTimeout === 'undefined') {
|
||
console.log('setTimeout 未定义,添加 polyfill')
|
||
global.setTimeout = function(callback, delay) {
|
||
// 简单的同步实现,适用于不需要真正延迟的情况
|
||
callback()
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 检查是否已安装Chrome
|
||
*/
|
||
export async function checkChromeInstalled() {
|
||
return new Promise((resolve) => {
|
||
if (isAndroid()) {
|
||
try {
|
||
const main = plus.android.runtimeMainActivity()
|
||
const PackageManager = plus.android.importClass('android.content.pm.PackageManager')
|
||
const pm = main.getPackageManager()
|
||
|
||
pm.getPackageInfo("com.android.chrome", PackageManager.GET_ACTIVITIES)
|
||
resolve(true)
|
||
} catch (e) {
|
||
resolve(false)
|
||
}
|
||
} else {
|
||
resolve(false)
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 移动APK并返回结果
|
||
*/
|
||
export async function moveChromeApkToDevice(options = {}) {
|
||
const config = {
|
||
sourcePath: '/static/apk/com.android.chrome.apk',
|
||
targetDir: 'yxd',
|
||
targetFileName: 'com.android.chrome.apk',
|
||
...options
|
||
}
|
||
|
||
console.log('开始移动APK文件,配置:', config)
|
||
|
||
return new Promise((resolve, reject) => {
|
||
try {
|
||
// 直接使用 plus.io 的文件系统 API
|
||
// const srcPath = `_www${config.sourcePath}`
|
||
const srcPath = plus.io.convertLocalFileSystemURL(config.sourcePath)
|
||
const targetDirPath = '_downloads/'
|
||
console.log('源文件路径:', srcPath)
|
||
|
||
// 使用内部存储根目录
|
||
const internalStoragePath = 'file:///storage/emulated/0/'
|
||
console.log('尝试使用内部存储目录:', internalStoragePath)
|
||
|
||
plus.io.resolveLocalFileSystemURL(srcPath, (srcEntry) => {
|
||
console.log('找到源文件:', srcEntry.fullPath)
|
||
|
||
// plus.io.resolveLocalFileSystemURL(internalStoragePath, (rootEntry) => {
|
||
// console.log('找到内部存储根目录:', rootEntry.fullPath)
|
||
|
||
// rootEntry.getDirectory(config.targetDir, {
|
||
// create: true
|
||
// }, (targetDirEntry) => {
|
||
// console.log('创建/找到目标目录:', targetDirEntry.fullPath)
|
||
|
||
// // 先检查是否已有同名文件
|
||
// targetDirEntry.getFile(config.targetFileName, {}, (
|
||
// existingFile) => {
|
||
// console.log('找到同名文件,直接返回:', existingFile
|
||
// .fullPath)
|
||
// // 通知系统扫描文件
|
||
// scanFile(existingFile.fullPath)
|
||
// resolve(existingFile)
|
||
// }, () => {
|
||
// // 没有同名文件,执行复制
|
||
// srcEntry.copyTo(targetDirEntry, config
|
||
// .targetFileName, (newEntry) => {
|
||
// console.log('文件复制成功:', newEntry
|
||
// .fullPath)
|
||
// // 通知系统扫描新文件
|
||
// scanFile(newEntry.fullPath)
|
||
// resolve(newEntry)
|
||
// }, (copyErr) => {
|
||
// console.error('复制失败:', copyErr)
|
||
// reject(
|
||
// `复制失败: ${JSON.stringify(copyErr)}`)
|
||
// })
|
||
// })
|
||
// }, (dirErr) => {
|
||
// console.error('创建目标目录失败:', dirErr)
|
||
// reject(`创建目标目录失败: ${JSON.stringify(dirErr)}`)
|
||
// })
|
||
// }, (rootErr) => {
|
||
// console.error('访问内部存储根目录失败:', rootErr)
|
||
// reject(`访问内部存储根目录失败: ${JSON.stringify(rootErr)}`)
|
||
// })
|
||
// 3. 直接解析下载目录
|
||
plus.io.resolveLocalFileSystemURL(targetDirPath, (downloadDirEntry) => {
|
||
console.log('找到下载目录:', downloadDirEntry.fullPath)
|
||
|
||
// 4. 检查是否已有同名文件
|
||
downloadDirEntry.getFile(config.targetFileName, {}, (existingFile) => {
|
||
console.log('找到已存在的 APK:', existingFile.fullPath)
|
||
scanFile(existingFile.fullPath)
|
||
resolve(existingFile)
|
||
}, () => {
|
||
// 5. 不存在则进行复制
|
||
srcEntry.copyTo(downloadDirEntry, config.targetFileName, (
|
||
newEntry) => {
|
||
console.log('APK 复制成功:', newEntry.fullPath)
|
||
scanFile(newEntry.fullPath)
|
||
resolve(newEntry)
|
||
}, (copyErr) => {
|
||
console.error('复制失败:', copyErr)
|
||
reject(`复制失败: ${JSON.stringify(copyErr)}`)
|
||
})
|
||
})
|
||
}, (dirErr) => {
|
||
// 兼容处理:如果获取下载目录也失败,尝试使用应用私有目录 (_doc)
|
||
console.error('获取公共下载目录失败,尝试应用私有目录:', dirErr)
|
||
saveToPrivateDir(srcEntry, config, resolve, reject)
|
||
})
|
||
}, (srcErr) => {
|
||
console.error('访问源文件失败:', srcErr)
|
||
reject(`访问源文件失败: ${JSON.stringify(srcErr)}`)
|
||
})
|
||
} catch (e) {
|
||
console.error('执行过程中发生异常:', e)
|
||
reject(`执行过程中发生异常: ${e}`)
|
||
}
|
||
})
|
||
}
|
||
|
||
function scanFile(filePath) {
|
||
if (!isAndroid()) return
|
||
try {
|
||
console.log('开始扫描文件:', filePath)
|
||
const Intent = plus.android.importClass('android.content.Intent')
|
||
const Uri = plus.android.importClass('android.net.Uri')
|
||
const File = plus.android.importClass('java.io.File')
|
||
const main = plus.android.runtimeMainActivity()
|
||
const intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
|
||
intent.setData(Uri.fromFile(new File(filePath)))
|
||
main.sendBroadcast(intent)
|
||
console.log('文件扫描成功')
|
||
} catch (e) {
|
||
console.error('文件扫描失败:', e)
|
||
}
|
||
}
|
||
|
||
export default {
|
||
isAndroid,
|
||
checkChromeInstalled,
|
||
moveChromeApkToDevice
|
||
} |