uni-app uni.chooseFile 安卓手机调用问题

发布于 1周前 作者 caililin 来自 Uni-App

uni-app uni.chooseFile 安卓手机调用问题

开发环境 版本号 项目创建方式
Windows win10 HBuilderX

产品分类:uniapp/H5


示例代码:

uni.chooseFile({
count: 1, // 限制选择文件数量为1
extension: extension, // 限制选择文件类型为音频文件
// type: 'all',
accept: '.mp3,.wav,.m4a,.wma,.aac,.ogg,.amr,.flac,.docx,.txt,.md',
success: (res: any) => {
const tempFiles = res.tempFiles;
console.log('[tempFiles]', tempFiles);  

// 选择文件成功  
let isAudio = false;//是否音频  
let isFile = false;//是否文档  
audioExtension.forEach((item: any) => {  
if (tempFiles[0].name.indexOf(item) > -1) {  
  isAudio = true;  
}  
})  
fileExtension.forEach((item: any) => {  
if (tempFiles[0].name.indexOf(item) > -1) {  
  isFile = true;  
}  
})  

if (!isAudio && !isFile) {  
uni.showToast({  
icon: 'none',  
title: '请上传支持的文件',  
})  
return  
}  

if (isAudio && tempFiles[0].size / 1024 / 1024 > 500) {  
uni.showToast({  
icon: 'none',  
title: '音频最大不能超过500M',  
})  
return  
}  

if (isFile && tempFiles[0].size / 1024 / 1024 > 10) {  
uni.showToast({  
icon: 'none',  
title: '文档最大不能超过10M',  
})  
return  
}  
fileName.value = tempFiles[0].name;  
fileType.value = fileName.value.substring(fileName.value.lastIndexOf('.'));  
const tempFilePaths = res.tempFilePaths;  
console.log('[res]', res);  
filePath.value = tempFilePaths;  
let pass = false;  
extension.forEach((item) => {  
if (fileName.value.indexOf(item) > -1) {  
  pass = true;  
}  
})  
if (!pass) {  
uni.showToast({  
icon: 'none',  
title: '请上传支持的文件'  
})  
return  
}  
uploadFile(tempFilePaths[0]);  
},
complete: () => {  
console.log('不进来了');  
disabled.value = false;  
},
fail: (err) => {  
console.log("[err]", err);  
},  
});

操作步骤:

安卓手机嵌套uniapp写的h5网页,但是安卓手机使用官网api打不开手机文件,也不报错,一直没有反应

预期结果:

uni.chooseFile({
count: 1, // 限制选择文件数量为1
extension: extension, // 限制选择文件类型为音频文件
// type: 'all',
accept: '.mp3,.wav,.m4a,.wma,.aac,.ogg,.amr,.flac,.docx,.txt,.md',
success: (res: any) => {
const tempFiles = res.tempFiles;
console.log('[tempFiles]', tempFiles);  

// 选择文件成功  
let isAudio = false;//是否音频  
let isFile = false;//是否文档  
audioExtension.forEach((item: any) => {  
if (tempFiles[0].name.indexOf(item) > -1) {  
  isAudio = true;  
}  
})  
fileExtension.forEach((item: any) => {  
if (tempFiles[0].name.indexOf(item) > -1) {  
  isFile = true;  
}  
})  

if (!isAudio && !isFile) {  
uni.showToast({  
icon: 'none',  
title: '请上传支持的文件',  
})  
return  
}  

if (isAudio && tempFiles[0].size / 1024 / 1024 > 500) {  
uni.showToast({  
icon: 'none',  
title: '音频最大不能超过500M',  
})  
return  
}  

if (isFile && tempFiles[0].size / 1024 / 1024 > 10) {  
uni.showToast({  
icon: 'none',  
title: '文档最大不能超过10M',  
})  
return  
}  
fileName.value = tempFiles[0].name;  
fileType.value = fileName.value.substring(fileName.value.lastIndexOf('.'));  
const tempFilePaths = res.tempFilePaths;  
console.log('[res]', res);  
filePath.value = tempFilePaths;  
let pass = false;  
extension.forEach((item) => {  
if (fileName.value.indexOf(item) > -1) {  
  pass = true;  
}  
})  
if (!pass) {  
uni.showToast({  
icon: 'none',  
title: '请上传支持的文件'  
})  
return  
}  
uploadFile(tempFilePaths[0]);  
},
complete: () => {  
console.log('不进来了');  
disabled.value = false;  
},
fail: (err) => {  
console.log("[err]", err);  
},  
});

1 回复

在 uni-app 中使用 uni.chooseFile 方法时,可能会遇到在安卓手机上调用时出现的一些问题。以下是一些常见问题及其解决方案:

1. 权限问题

  • 问题描述:在安卓手机上,调用 uni.chooseFile 时,可能会因为缺少必要的权限而导致无法正常选择文件。
  • 解决方案
    • 确保在 manifest.json 中配置了必要的权限,例如:
      "permission": {
        "android.permission.READ_EXTERNAL_STORAGE": {},
        "android.permission.WRITE_EXTERNAL_STORAGE": {}
      }
    • 在代码中动态请求权限:
      uni.authorize({
        scope: 'scope.writePhotosAlbum',
        success() {
          uni.chooseFile({
            count: 1,
            success(res) {
              console.log(res.tempFilePaths);
            }
          });
        },
        fail() {
          uni.showToast({
            title: '权限未授权',
            icon: 'none'
          });
        }
      });

2. 文件选择器不显示

  • 问题描述:在安卓手机上,调用 uni.chooseFile 时,文件选择器没有弹出。
  • 解决方案
    • 确保 uni.chooseFile 的调用时机正确,避免在页面加载时立即调用。
    • 检查是否有其他弹窗或操作阻塞了文件选择器的显示。
    • 确保 uni.chooseFile 的参数配置正确,例如 counttype

3. 文件类型限制

  • 问题描述:在安卓手机上,uni.chooseFile 可能无法选择某些特定类型的文件。
  • 解决方案
    • 使用 type 参数来限制文件类型,例如:
      uni.chooseFile({
        count: 1,
        type: 'image',
        success(res) {
          console.log(res.tempFilePaths);
        }
      });
    • 如果需要选择多种类型的文件,可以使用 type: 'all'

4. 文件路径问题

  • 问题描述:在安卓手机上,uni.chooseFile 返回的文件路径可能无法直接使用。
  • 解决方案
    • 使用 uni.getFileSystemManager() 来读取文件内容或进行其他操作。
    • 如果需要上传文件,可以使用 uni.uploadFile 方法。

5. 兼容性问题

  • 问题描述:在某些安卓设备或系统版本上,uni.chooseFile 可能表现不一致。
  • 解决方案
    • 确保 uni-app 的版本是最新的,以获得最新的兼容性修复。
    • 在测试时,尽量覆盖多种安卓设备和系统版本。

6. 调试与日志

  • 问题描述:在安卓手机上,调试 uni.chooseFile 时可能难以定位问题。
  • 解决方案
    • 使用 console.loguni.showToast 来输出调试信息。
    • 使用 HBuilderX 的调试工具,连接真机进行调试。

示例代码

以下是一个完整的示例代码,展示了如何在 uni-app 中使用 uni.chooseFile

<template>
  <view>
    <button @click="chooseFile">选择文件</button>
  </view>
</template>

<script>
export default {
  methods: {
    chooseFile() {
      uni.chooseFile({
        count: 1,
        type: 'all',
        success(res) {
          console.log('选择的文件路径:', res.tempFilePaths);
          // 这里可以对文件进行进一步处理,例如上传
        },
        fail(err) {
          console.error('选择文件失败:', err);
        }
      });
    }
  }
}
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!