Разбираемся с FileProviderБанальная вещь, но сэкномит вам время
👉 Базово в манифесте определяем провайдер. Решаем нужно ли давать разрешениями на пользование нашими данными другим приложениям (
grantUriPermissions
,
exported
)
👉 Определяем
<paths>
:
<files-path>
Для файлов внутреннего хранилища ([pm]/files/)
<cache-path>
Для кэша ([pm]/cache/)
<external-path>
Внешнее хранилище (/storage/emulated/0/). Учитывайте, что доступ сюда будет иметь любое приложение и без вашего ведома
<external-files-path>
Внешнее приватное хранилище (/storage/emulated/0/Android/data/[package_name]/files/)
<external-cache-path>
Внешний приватный кэш (/storage/emulated/0/Android/data/[package_name]/cache/)
<root-path>
Доступ напрямую из корня. Тут надо осторожно, у вашего приложения может не быть прав на запись
👉 Не забываем про permissions. Можно обойтись без прямого доступа к файловой системе:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Пример использования для того чтобы пошарить картинку из кэша в email без выгрузки bitmap:
val imagePath = File(context.getCacheDir(), "images")
val newFile = File(imagePath, "image.png")
val contentUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", newFile)
if (contentUri != null) {
val shareIntent = Intent()
shareIntent.setAction(Intent.ACTION_SEND)
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
shareIntent.setDataAndType(contentUri, context.getContentResolver().getType(contentUri))
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri)
startActivity(Intent.createChooser(shareIntent, "Choose an app"))
}