Я извлек изображение uri, теперь я хотел бы открыть изображение с помощью программы просмотра изображений Android по умолчанию. Или, что еще лучше, пользователь мог выбрать, какую программу использовать для открытия изображения. Что-то вроде File Explorer предлагает вам, если вы попытаетесь открыть файл.
android
android-image
Бадр Хари
источник
источник
File f = new File(..., ...); if (f.isFile()) { MediaScannerConnection.scanFile(SchedaActivity.this, new String[] { f.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { @Override public void onScanCompleted(String path, Uri uri) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "image/*"); SchedaActivity.this.startActivityForResult(intent, SchedaActivity.this.ACTIVITY_CODE); } });
file:///sdcard...
- это намеренно?Если ваше приложение нацелено на 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» по ссылке.
источник
Спросите себя, ответьте и себе:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */
Он также спросит, какую программу использовать для просмотра файла.
источник
intent.setDataAndType(uri, "image/*");
чтобы заставить Android использовать приложение для просмотра изображений.Попробуйте использовать это:
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 и ниже
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);
Этот работал только у меня ..
источник
Проблема с отображением файла using
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);
источник