android - 使用 Uri 从 SD 卡获取文件

标签 android file filenotfoundexception

我让用户从 sdcard 中选择一个文件上传到我的服务器,并将返回给我的 Uri 保存在 onActivityResult

例子:

file:///storage/emulated/0/Download/menu-4.27.13.pdf

当我尝试将其转换为字节数组以发送到服务器时,我得到了 FileNotFoundException

if(!fileURI.equals("")){
    File pdf = new File(fileURI);
    try 
    {
        FileInputStream fin = new FileInputStream(pdf);

        byte fileContent[] = new byte[(int)pdf.length()];
        fin.read(fileContent);
        fin.close();

        String pdfString = Base64.encode(fileContent);
        sb.append(pdfString);
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();                      
    }
}

}

堆栈跟踪

11-04 11:57:30.597: W/System.err(13531): java.io.FileNotFoundException: /file:/storage/emulated/0/Download/menu-4.27.13.pdf: open failed: ENOENT (No such file or directory)
11-04 11:57:30.597: W/System.err(13531):    at libcore.io.IoBridge.open(IoBridge.java:409)
11-04 11:57:30.607: W/System.err(13531):    at java.io.FileInputStream.<init>(FileInputStream.java:78)
11-04 11:57:30.607: W/System.err(13531):    at com.ecm2.mobilemap.services.MessageService.getModifiedElements(MessageService.java:2755)
11-04 11:57:30.617: W/System.err(13531):    at com.ecm2.mobilemap.services.MessageService.callSync(MessageService.java:2433)
11-04 11:57:30.617: W/System.err(13531):    at com.ecm2.mobilemap.services.MessageService.onHandleIntent(MessageService.java:190)
11-04 11:57:30.627: W/System.err(13531):    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
11-04 11:57:30.627: W/System.err(13531):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-04 11:57:30.637: W/System.err(13531):    at android.os.Looper.loop(Looper.java:137)
11-04 11:57:30.637: W/System.err(13531):    at android.os.HandlerThread.run(HandlerThread.java:61)
11-04 11:57:30.637: W/System.err(13531): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
11-04 11:57:30.647: W/System.err(13531):    at libcore.io.Posix.open(Native Method)
11-04 11:57:30.657: W/System.err(13531):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
11-04 11:57:30.657: W/System.err(13531):    at libcore.io.IoBridge.open(IoBridge.java:393)

这不是 File 初始化时作为字符串对象的内容吗?当用户选择文件时返回给我的 Uri 为什么我会收到 FileNotFoundException

最佳答案

您的 Uri 包含您需要删除的 file: 方案。使用 Uri.parse,您计算出字符串中包含的 Uri,使用 uri.getPath(),您从 uri 中提取文件路径:

Uri uri = Uri.parse(fileURI);
File pdf = new File(uri.getPath());

关于android - 使用 Uri 从 SD 卡获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772856/

相关文章:

file - 如何重命名文件对象方法

C - 'file' 错误的冲突类型

java - 扫描仪不断抛出 FileNotFoundException

java - 将结果记录到 Excel 文件(apache poi),如果我在程序仍在运行时打开文件,则会出现错误

jar 文件中的 Java Filenotfound 异常

android - 从云中列出/流/下载文件的方法是什么?

android - 在android中获取包卸载通知

android - 如何处理硬件搜索按钮android?

android - 无法在 Wear OS Samsung Galaxy Watch 4 上请求蓝牙权限

python - 在 python 中以读取模式打开文件时到底发生了什么