Wyodrębniłem obraz uri, teraz chciałbym otworzyć obraz za pomocą domyślnej przeglądarki obrazów Androida. Lub jeszcze lepiej, użytkownik może wybrać program, którego ma użyć do otwarcia obrazu. Coś w rodzaju eksploratorów plików oferuje ci, jeśli spróbujesz otworzyć plik.
android
android-image
Badr Hari
źródło
źródło
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...
- czy to zamierzone?Jeśli Twoja aplikacja jest przeznaczona dla systemu Android N (7.0) lub nowszego, nie powinieneś używać powyższych odpowiedzi (metody „Uri.fromFile”), ponieważ to nie zadziała.
Zamiast tego należy użyć ContentProvider.
Na przykład, jeśli plik obrazu znajduje się w folderze zewnętrznym, możesz użyć tego (podobnie do kodu, który tutaj utworzyłem ):
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);
oczywisty:
<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>
Jeśli twój obraz znajduje się w prywatnej ścieżce aplikacji, powinieneś utworzyć własny ContentProvider, ponieważ utworzyłem „OpenFileProvider” w linku.
źródło
Zadaj sobie pytanie, odpowiedz sobie również:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */
Zapyta również, jakiego programu użyć do wyświetlenia pliku.
źródło
intent.setDataAndType(uri, "image/*");
aby zmusić Androida do korzystania z aplikacji do przeglądania obrazów.Spróbuj go użyć:
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);
źródło
Na podstawie odpowiedzi Vikas, ale z niewielką modyfikacją: Uri jest odbierany przez parametr:
private void showPhoto(Uri photoUri){ Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(photoUri, "image/*"); startActivity(intent); }
źródło
Ta rzecz może pomóc, jeśli pracujesz z Androidem N i starszymi
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
źródło
O wiele czystsza i bezpieczniejsza odpowiedź na ten problem (naprawdę nie powinieneś twardo kodować ciągów znaków):
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); }
Wszystko, co musisz zrobić, to dołączyć identyfikator obrazu na końcu ścieżki dla EXTERNAL_CONTENT_URI . Następnie uruchom Intent za pomocą akcji View i Uri.
Identyfikator obrazu pochodzi z zapytania o program rozpoznawania treści.
źródło
Wszystkie powyższe odpowiedzi nie otwierają obrazka ... kiedy drugi raz próbuję go otworzyć, pokaż galerię, a nie obraz.
Otrzymałem rozwiązanie z różnych odpowiedzi 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);
Ten działał tylko dla mnie.
źródło
Problem z wyświetlaniem pliku za pomocą
Intent.ACTION_VIEW
jest taki, że jeśli przejdzieszUri
parsowanie ścieżki. Nie działa we wszystkich przypadkach. Aby rozwiązać ten problem, musisz użyć:Uri.fromFile(new File(filePath));
Zamiast:
Uri.parse(filePath);
Edytować
Oto mój pełny kod:
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);
Informacje
MediaFile
to moja klasa domeny do zawijania plików z bazy danych w obiekty.MediaFile.getExtension()
zwracaString
zMimetype
jako rozszerzenie pliku. Przykład:"image/png"
Kod dodatkowy: potrzebny do pokazania dowolnego pliku (rozszerzenia)
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(); } }
Daj mi znać, jeśli potrzebujesz więcej kodu.
źródło
Używam tego, to działa dla mnie
Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), 1);
źródło
Moje rozwiązanie przy użyciu dostawcy plików
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); }
źródło
Prawie BRAK szansy na użycie aplikacji do zdjęć lub galerii (może taka istnieje), ale możesz wypróbować przeglądarkę treści.
Proszę kasy inną odpowiedź na podobne pytanie tutaj
źródło
Moje rozwiązanie
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);
źródło