Откройте изображение с помощью URI в программе просмотра изображений галереи Android по умолчанию
Я извлек Uri изображения, теперь я хотел бы открыть изображение с помощью программы просмотра изображений Android по умолчанию. Или, что еще лучше, пользователь может выбрать, какую программу использовать для открытия изображения. Что-то вроде File Explorer предлагает вам, если вы попытаетесь открыть файл.
14 ответов
Спроси себя, ответь себе тоже:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */
Он также спросит, какую программу использовать для просмотра файла.
Принятый ответ не работал для меня,
Что сработало:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*");
startActivity(intent);
Если ваше приложение предназначено для Android N (7.0) и выше, вы не должны использовать ответы выше (метода "Uri.fromFile"), потому что оно не будет работать для вас.
Вместо этого вы должны использовать ContentProvider.
Например, если ваш файл изображения находится во внешней папке, вы можете использовать это (подобно коду, который я сделал здесь):
File file = ...;
final Intent intent = new Intent(Intent.ACTION_VIEW)//
.setDataAndType(VERSION.SDK_INT >= VERSION_CODES.N ?
android.support.v4.content.FileProvider.getUriForFile(this,getPackageName() + ".provider", file) : Uri.fromFile(file),
"image/*").addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
проявляются:
<provider
android:name="android.support.v4.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="external_files" path="."/>-->
<external-path
name="files_root"
path="Android/data/${applicationId}"/>
<external-path
name="external_storage_root"
path="."/>
</paths>
Если ваше изображение находится в закрытом пути приложения, вы должны создать свой собственный ContentProvider, как я создал "OpenFileProvider" по ссылке.
Попробуйте использовать это:
Uri uri = Uri.fromFile(entry);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
String mime = "*/*";
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
if (mimeTypeMap.hasExtension(
mimeTypeMap.getFileExtensionFromUrl(uri.toString())))
mime = mimeTypeMap.getMimeTypeFromExtension(
mimeTypeMap.getFileExtensionFromUrl(uri.toString()));
intent.setDataAndType(uri,mime);
startActivity(intent);
На основании ответа Vikas, но с небольшой модификацией: Uri получен параметром:
private void showPhoto(Uri photoUri){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(photoUri, "image/*");
startActivity(intent);
}
Эта вещь может помочь, если вы работаете с Android N и ниже
File file=new File(Environment.getExternalStorageDirectory()+"/directoryname/"+filename);
Uri path= FileProvider.getUriForFile(MainActivity.this,BuildConfig.APPLICATION_ID + ".provider",file);
Intent intent=new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path,"image/*");
intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory
Гораздо более чистый и безопасный ответ на эту проблему (вам действительно не следует жестко кодировать строки):
public void openInGallery(String imageId) {
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendPath(imageId).build();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
Все, что вам нужно сделать, это добавить идентификатор изображения в конец пути для EXTERNAL_CONTENT_URI. Затем запустите Intent с действием View и Uri.
Идентификатор изображения происходит от запроса распознавателя контента.
Все вышеперечисленные ответы не открывают изображение.. когда я пытаюсь открыть его во второй раз, покажи галерею, а не картинку.
Я получил решение из смеси различных ответов SO..
Intent galleryIntent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setDataAndType(Uri.fromFile(mImsgeFileName), "image/*");
galleryIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(galleryIntent);
Этот работал только для меня..
Проблема с отображением файла с помощью Intent.ACTION_VIEW
Это если вы передадите Uri
Разбор пути. Не работает во всех случаях. Чтобы решить эту проблему, вам нужно использовать:
Uri.fromFile(new File(filePath));
Вместо:
Uri.parse(filePath);
редактировать
Вот мой полный код:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(mediaFile.filePath)), mediaFile.getExtension());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Информация
MediaFile
мой класс домена, чтобы обернуть файлы из базы данных в объекты.MediaFile.getExtension()
возвращает String
с Mimetype
для расширения файла. Пример: "image/png"
Дополнительный код: необходим для отображения любого файла (расширение)
import android.webkit.MimeTypeMap;
public String getExtension () {
MimeTypeMap myMime = MimeTypeMap.getSingleton();
return myMime.getMimeTypeFromExtension(MediaFile.fileExtension(filePath));
}
public static String fileExtension(String path) {
if (path.indexOf("?") > -1) {
path = path.substring(0, path.indexOf("?"));
}
if (path.lastIndexOf(".") == -1) {
return null;
} else {
String ext = path.substring(path.lastIndexOf(".") + 1);
if (ext.indexOf("%") > -1) {
ext = ext.substring(0, ext.indexOf("%"));
}
if (ext.indexOf("/") > -1) {
ext = ext.substring(0, ext.indexOf("/"));
}
return ext.toLowerCase();
}
}
Дайте мне знать, если вам нужно больше кода.
Я использую это, это работает для меня
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);
Мое решение с использованием поставщика файлов
private void viewGallery(File file) {
Uri mImageCaptureUri = FileProvider.getUriForFile(
mContext,
mContext.getApplicationContext()
.getPackageName() + ".provider", file);
Intent view = new Intent();
view.setAction(Intent.ACTION_VIEW);
view.setData(mImageCaptureUri);
List < ResolveInfo > resInfoList =
mContext.getPackageManager()
.queryIntentActivities(view, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo: resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
mContext.grantUriPermission(packageName, mImageCaptureUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
view.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(mImageCaptureUri, "image/*");
mContext.startActivity(intent);
}
Мое решение
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath()+"/your_app_folder/"+"your_picture_saved_name"+".png")), "image/*");
context.startActivity(intent);
URI должен быть URI содержимого, а не URI файла. Вы можете получить contentUri от FileProvider как
Uri contentUri = FileProvider.getUriForFile(getContext(),"com.github.myApp",curFile);
Не забудьте добавить провайдера в файл манифеста.
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.github.myApp"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
Практически НЕТ шансов использовать приложение для фотографий или галерей (возможно, существует), но вы можете попробовать просмотрщик контента.
Пожалуйста, проверьте другой ответ на подобный вопрос здесь