Если ваше приложение нацелено на Android N (7.0) и выше, вам не следует использовать приведенные выше ответы (о методе «Uri.fromFile»), потому что это не сработает для вас.
Вместо этого вы должны использовать ContentProvider.
Например, если ваш файл изображения находится во внешней папке, вы можете использовать это (похоже на код, который я сделал здесь ):
File file = ...;
final Intent intent = new Intent(Intent.ACTION_VIEW)
.setDataAndType(VERSION.SDK_INT >= VERSION_CODES.N ?
FileProvider.getUriForFile(this,getPackageName() + ".provider", file) : Uri.fromFile(file),
"image/*").addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
манифест:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
res / xml / provider_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="files_root"
path="Android/data/${applicationId}"/>
<external-path
name="external_storage_root"
path="."/>
</paths>
Если ваше изображение находится на закрытом пути приложения, вам следует создать свой собственный ContentProvider, как я создал «OpenFileProvider» по ссылке.