首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将android中的文件从uri复制到app的私有文件夹

将android中的文件从uri复制到app的私有文件夹
EN

Stack Overflow用户
提问于 2021-08-08 21:59:50
回答 1查看 563关注 0票数 1

我的应用程序应该从图片库获取一张图像,并将其放入app数据目录中。我的实现是尝试将图库中的图像直接共享到应用程序中,并使用它的uri将其从源位置复制到android应用程序目录中。

接收图像URI后的

代码语言:javascript
运行
复制
copyFile(new File(mImageUri.getPath()), getFilesDir());

copyFile方法:

代码语言:javascript
运行
复制
public void copy(File src, File dst) throws IOException {
         try (InputStream in = new FileInputStream(src)) {
             try (OutputStream out = new FileOutputStream(dst)) {
                 // Transfer bytes from in to out
                 byte[] buf = new byte[1024];
                 int len;
                 while ((len = in.read(buf)) > 0) {
                     out.write(buf, 0, len);
                 }
             }
         }
     }

问题是,我得到了一个FileNotFound异常,如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 10:14:35

首先,使用这个获取文件:

代码语言:javascript
运行
复制
private fun openFile() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/pdf"
    }

    fileRequest.launch(intent)
}

fileRequest:

代码语言:javascript
运行
复制
    private val fileRequest =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { resultData ->
        resultData?.data?.also { data ->
            val myFile = File(
                requireContext().filesDir,
                "test_file.pdf"
            ) // filesDir - Your app's ordinary, persistent files reside directory
            val inputStream: InputStream =
                requireActivity().contentResolver.openInputStream(data.data!!)!!
            val outputStream: OutputStream = FileOutputStream(myFile)
            val buf = ByteArray(1024)
            var len: Int
            while (inputStream.read(buf).also { len = it } > 0) {
                outputStream.write(buf, 0, len)
            }
            outputStream.close()
            inputStream.close()
        }
    }

将行type = "application/pdf"更改为指定,您希望复制哪个文件之王?

另外,fileRequest是在片段范围内声明的(如果您不喜欢它,旧的"startActivityForResult“),它会很好地工作。

此外,openInputStream(data.data!!)data.data!!是已挑选文件的uri

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68705059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档