Откройте изображение с помощью URI в средстве просмотра изображений галереи по умолчанию в Android

Я извлек изображение uri, теперь я хотел бы открыть изображение с помощью программы просмотра изображений по умолчанию Android. Или даже лучше, пользователь может выбрать, какую программу использовать для открытия изображения. Что-то вроде File Explorers предлагает вам, если вы попытаетесь открыть файл.

Принятый ответ не работал для меня,

Что сработало:

Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*"); startActivity(intent); 

Спросите себя и ответьте себе:

 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */ 

Он также спросит, какую программу следует использовать для просмотра файла.

Попробуйте использовать его:

 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); 

На основании ответа Викаса, но с небольшой модификацией: Uri принимается параметром:

 private void showPhoto(Uri photoUri){ Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(photoUri, "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); 

проявляются:

    

res / xml / provider_paths.xml:

       

Если ваше изображение находится в личном пути к приложению, вы должны создать свой собственный ContentProvider, так как я создал «OpenFileProvider» в ссылке.

Более чистый, безопасный ответ на эту проблему (вы действительно не должны жестко кодировать строки):

 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 intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), 1); 

Эта вещь может помочь, если вы работаете с андроидом 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 

Проблема с отображением файла с использованием 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 – это мой class домена для MediaFile файлов из базы данных в объекты. MediaFile.getExtension() возвращает String с MediaFile.getExtension() для расширения файла. Пример: "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.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); 
  • Поворот изображения canvasа HTML5
  • Загрузите все изображения из каталога
  • Ориентация изображения - Android
  • Как сравнить один образ с другим, чтобы увидеть, похожи ли они на определенный процент, на iPhone?
  • Маскирование (обрезка) изображения в кадре
  • Изображение SVG не работает в Firefox
  • Android: загружено изображение Picasso. как показать сообщение об ошибке
  • Сохранение нескольких ggplots из ls в один и отдельные файлы в R
  • Исключения из памяти в System.Drawing.Image.FromFile ()
  • Как объединить несколько изображений в одно изображение в Android?
  • вызовите страницу aspx, чтобы вернуть изображение в случайном порядке
  • Давайте будем гением компьютера.