【问题标题】:Copying files in android from uri to app's private folder将android中的文件从uri复制到应用程序的私人文件夹
【发布时间】:2021-10-12 17:36:49
【问题描述】:

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

收到图片URI后:

copyFile(new File(mImageUri.getPath()), getFilesDir());

copyFile 方法:

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 异常,我该如何解决?

【问题讨论】:

  • Uri 不是文件。使用ContentResolveropenInputStream() 在您的Uri 标识的内容上获得InputStream
  • 我用这个InputStream in = getContentResolver().openInputStream(src) 替换了文件inputStream,但它仍然不起作用。 @CommonsWare

标签: android inputstream file-management


【解决方案1】:

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

private fun openFile() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/pdf"
    }

    fileRequest.launch(intent)
}

文件请求:

    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

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2012-01-03
    • 2021-05-06
    • 1970-01-01
    • 2013-06-30
    • 2016-09-04
    相关资源
    最近更新 更多