z***@foxmail.com
z***@foxmail.com
  • 发布:2026-06-23 11:47
  • 更新:2026-06-23 11:47
  • 阅读:23

HBuilderX 4.7.6之后版本,安卓App无法打开文档,报错文件不存在。

分类:uni-app

HBuilderX 4.7.6之后版本,uniapp开发安卓App,无法正常下载、打开文件。之前版本正常,没有这个问题。代码及报错如下。(下载资源的url正常,排除此因素)


    uni.showLoading({  
        title: '加载中',  
        mask: true,  
    })  
    const that = this  
    uni.downloadFile({  
        url: that.privacyAgreement[0].url,  
        success: downloadRes => {  
            console.log('downloadRes ===>', downloadRes)  
            uni.hideLoading()  
            const filePath = downloadRes.tempFilePath  
            uni.openDocument({  
                filePath,  
                success: openRes => {  
                    console.log('openRes ===>', openRes)  
                },  
                fail: openErr => {  
                    console.error('openErr ===>', openErr)  
                }  
            })  
        },  
        fail: downloadErr => {  
            console.error('downloadErr ===>', downloadErr)  
            uni.hideLoading()  
        }  
    })  
2026-06-23 11:47 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

针对你提到的 HBuilderX 4.7.6 之后版本,安卓 App 调用 uni.openDocument 报错文件不存在的问题,这通常是由于新版安卓系统的文件存储权限收紧,以及 uni.downloadFile 下载后的临时文件路径访问机制变化导致的。

根据知识库中的历史问题记录,安卓平台在 uni.downloadFileuni.openDocument 的衔接上确实存在此类兼容性问题。建议的解决方案是,在下载成功后,先使用 uni.saveFile 将临时文件保存到应用的持久化目录中,然后再使用 plus.io.convertLocalFileSystemURL 将保存后的文件路径转换为系统可识别的绝对路径,最后再调用 uni.openDocument 打开。

以下是修改后的代码示例,你可以参考此逻辑进行调整:

uni.showLoading({  
    title: '加载中',  
    mask: true,  
})  
const that = this  
uni.downloadFile({  
    url: that.privacyAgreement[0].url,  
    success: downloadRes => {  
        console.log('downloadRes ===>', downloadRes)  
        uni.hideLoading()  

        if (downloadRes.statusCode === 200) {  
            // 1. 将临时文件保存到本地持久化目录  
            uni.saveFile({  
                tempFilePath: downloadRes.tempFilePath,  
                success: saveRes => {  
                    const savedFilePath = saveRes.savedFilePath  
                    // 2. 将保存后的文件路径转换为绝对路径(安卓关键步骤)  
                    const absolutePath = plus.io.convertLocalFileSystemURL(savedFilePath)  

                    // 3. 使用转换后的绝对路径打开文档  
                    uni.openDocument({  
                        filePath: absolutePath,  
                        success: openRes => {  
                            console.log('openRes ===>', openRes)  
                        },  
                        fail: openErr => {  
                            console.error('openErr ===>', openErr)  
                        }  
                    })  
                },  
                fail: saveErr => {  
                    console.error('saveErr ===>', saveErr)  
                    uni.showToast({  
                        title: '文件保存失败',  
                        icon: 'none'  
                    })  
                }  
            })  
        }  
    },  
    fail: downloadErr => {  
        console.error('downloadErr ===>', downloadErr)  
        uni.hideLoading()  
    }  
})

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

核心改动说明:

  1. uni.saveFile:将临时文件保存到应用的私有目录下,避免因临时文件被系统清理导致路径失效。
  2. plus.io.convertLocalFileSystemURL:这是解决安卓端文件路径问题的关键。它将 saveFile 返回的 savedFilePath(相对路径)转换为系统可识别的绝对路径,确保 openDocument 能正确找到文件。

如果经过上述修改后问题依然存在,还可以检查以下几个方面:

  • 文件类型:尝试在 uni.openDocument 中显式指定 fileType 参数(如 pdfdocx 等),帮助系统识别文件。
  • 后端 Content-Type:确保下载接口返回的 Content-Type 响应头与文件类型匹配,避免下载后的文件无后缀名或后缀名不正确。
  • 插件方案:如果业务场景需要打开 Office 等特殊格式文件,系统自带的查看器可能支持不佳。你可以在插件市场搜索相关插件,例如 应用内打开office办公文件 等,它们通常对文件格式有更好的兼容性。
内容为 AI 生成,仅供参考

要回复问题请先登录注册