如何在Android中使用其他应用Intent中的文件Uri

laik7k3q  于 11个月前  发布在  Android
关注(0)|答案(2)|浏览(129)

在我的应用程序中,我从任何其他可以共享PDF的应用程序中收到了一个PDF文件的URI。

Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);

无论如何,我不能完全使用这个Uri,我的形象,因为它是从一个FileProvider外部到我的应用程序。例如,当我尝试创建FileDescriptor时:

ParcelFileDescriptor fd = context.getContentResolver().openFileDescriptor(uri, "r");

我得到这个错误:

W/System.err: java.lang.SecurityException: Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord{...} (pid=23606, uid=10525) that is not exported from UID 10123

真的有必要获取文件路径,复制文件,并获取新的URI吗?或者我可以简单地以某种方式管理原始Uri?

oug3syen

oug3syen1#

据我所知,最好的办法是立即从内容提供商那里读取/复制数据,然后使用这些数据做任何你想做的事情。所以不要浪费时间去管理原来的那个。希望对你有帮助

nhaq1z21

nhaq1z212#

真的有必要获取文件路径,复制文件,并获取新的URI吗?或者我可以简单地以某种方式管理原始Uri?答案是否定的。像这样使用

if(SDK_INT >= Build.VERSION_CODES.TIRAMISU){
  intent.getParcelableExtra(EXTRA_STREAM, Uri::class.java)?.let {
    context.contentResolver.openInputStream(it).use { inputStream ->
      saveFile(
        inputStream = inputStream,
        fileName = "fileName.jpg",
        destination = context.getExternalFilesDir("/")
      )
    }
  }
}else{
  (intent.getParcelableExtra<Parcelable>(EXTRA_STREAM) as Uri).let {
    context.contentResolver.openInputStream(it).use { inputStream ->
      //save or do something with the input stream
    }
  }
}

fun saveFile(
  inputStream: InputStream,
  fileName: String,
  destination: File
        ){
  FileOutputStream(File(destination, fileName)).use { os ->
    val buffer = ByteArray(4096)
    var length: Int
      while (inputStream.read(buffer).also { length = it } > 0) {
        os.write(buffer, 0, length)
      }
   os.flush()
  }
}

相关问题