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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Если ваше приложение предназначено для 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="external_files" path="."/>-->
    <external-path
        name="files_root"
        path="Android/data/${applicationId}"/>
    <external-path
        name="external_storage_root"
        path="."/>
</paths>

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

Ответ 4

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

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

Ответ 5

На основе Ответы Vikas, но с небольшой модификацией: Uri получен параметром:

private void showPhoto(Uri photoUri){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(photoUri, "image/*");
    startActivity(intent);
}

Ответ 6

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

Ответ 7

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

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.

Идентификатор изображения происходит от запроса распознавателя контента.

Ответ 8

Все приведенные выше ответы не открывают изображение.. когда второй раз я пытаюсь открыть его, покажите галерею не изображение.

Я получил решение из различных ответов 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);

Этот только работал у меня.

Ответ 9

Проблема с отображением файла с помощью Intent.ACTION_VIEW заключается в том, что если вы передаете Uri синтаксический анализ пути. Не работает во всех случаях. Чтобы устранить эту проблему, вам необходимо использовать:

Uri.fromFile(new File(filePath));

Вместо:

Uri.parse(filePath);

Edit

Вот мой полный код:

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

Info

MediaFile - мой класс домена для переноса файлов из базы данных в объекты. MediaFile.getExtension() возвращает a 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();
    }
}

Сообщите мне, если вам нужно больше кода.

Ответ 10

Я использую это, это работает для меня

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);

Ответ 11

Почти НЕТ возможность использовать приложение для фото или галереи (может существовать одно), но вы можете попробовать просмотрщик контента.

Пожалуйста, проверьте другой ответ на аналогичный вопрос здесь

Ответ 12

Мое решение

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

Ответ 13

Мое решение с использованием провайдера файлов

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