在我的应用程序中,我从任何其他可以共享 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 ?
据我所知,最好的办法是立即从内容提供商读取/复制数据,然后使用该数据做任何你想做的事情。因此,不要浪费时间尝试管理原始的。希望对你有帮助
真的有必要获取文件路径、复制文件并获取新的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()
}
}