Класс FileUriExposedException
Класс FileUriExposedException
срабатывает на Android 7 и выше,
когда intent или chooser получает
Uri со схемой file
на файл вашего приложения.
Прямой путь нельзя отдавать чужим процессам.
Вместо этого строят content://
через FileProvider
и флаг FLAG_GRANT_READ_URI_PERMISSION.
Пример
Давайте отдадим файл через FileProvider, а не file URI:
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.core.content.FileProvider
import java.io.File
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val file = File(cacheDir, "abcde.txt")
file.writeText("12345")
val uri = FileProvider.getUriForFile(
this,
"${packageName}.fileprovider",
file,
)
val share = Intent(Intent.ACTION_SEND).apply {
type = "text/plain"
putExtra(Intent.EXTRA_STREAM, uri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
setContent {
Text(text = uri.scheme ?: "abcde")
}
}
}
С content URI система не бросает
FileUriExposedException. Схема file
в intent к другому приложению приведёт к падению.
Смотрите также
-
класс
FileProvider,
который выдаёт безопасный content URI -
класс
SecurityException,
если нет прав на URI -
класс
Intent,
куда кладут EXTRA_STREAM -
класс
ActivityNotFoundException,
если некому принять intent