Откройте изображение с помощью URI в программе просмотра изображений галереи Android по умолчанию - PullRequest
74 голосов
/ 22 марта 2011

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

Ответы [ 13 ]

155 голосов
/ 21 июля 2011

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

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

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + "/sdcard/test.jpg"), "image/*");
startActivity(intent);
27 голосов
/ 22 марта 2011

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

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

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

23 голосов
/ 31 декабря 2016

Если ваше приложение предназначено для 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» по ссылке.

19 голосов
/ 29 сентября 2012

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

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);
17 голосов
/ 18 мая 2015

На основании ответа Викаса , но с небольшим изменением: Uri получен параметром:

private void showPhoto(Uri photoUri){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(photoUri, "image/*");
    startActivity(intent);
}
8 голосов
/ 09 февраля 2017

Эта вещь может помочь, если вы работаете с 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
5 голосов
/ 15 марта 2013

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

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.

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

4 голосов
/ 17 ноября 2017

Проблема с отображением файла с помощью 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();
    }
}

Дайте мне знать, если вам нужно больше кода.

4 голосов
/ 31 октября 2016

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

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

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

3 голосов
/ 19 марта 2014

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

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,
"Select Picture"), 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...