Ich habe Bild-Uri extrahiert, jetzt möchte ich das Bild mit dem Standard-Bildbetrachter von Android öffnen. Oder noch besser, der Benutzer kann auswählen, mit welchem Programm das Bild geöffnet werden soll. So etwas wie File Explorer bieten Ihnen, wenn Sie versuchen, eine Datei zu öffnen.
android
android-image
Badr Hari
quelle
quelle
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...
- ist das beabsichtigt?Wenn Ihre App auf Android N (7.0) und höher ausgerichtet ist, sollten Sie die obigen Antworten (der Methode "Uri.fromFile") nicht verwenden, da dies für Sie nicht funktioniert.
Verwenden Sie stattdessen einen ContentProvider.
Wenn sich Ihre Bilddatei beispielsweise in einem externen Ordner befindet, können Sie dies verwenden (ähnlich dem Code, den ich hier erstellt habe ):
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);
Manifest:
<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>
Wenn sich Ihr Bild im privaten Pfad der App befindet, sollten Sie Ihren eigenen ContentProvider erstellen, da ich über den Link "OpenFileProvider" erstellt habe.
quelle
Fragen Sie sich, antworten Sie mir auch:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("content://media/external/images/media/16"))); /** replace with your own uri */
Sie werden auch gefragt, mit welchem Programm die Datei angezeigt werden soll.
quelle
intent.setDataAndType(uri, "image/*");
Android zwingen, eine App zum Anzeigen von Bildern zu verwenden.Versuchen Sie es:
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);
quelle
Basierend auf der Antwort von Vikas, jedoch mit einer geringfügigen Änderung: Der Uri wird per Parameter empfangen:
private void showPhoto(Uri photoUri){ Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(photoUri, "image/*"); startActivity(intent); }
quelle
Diese Sache könnte helfen, wenn Sie mit Android N und darunter arbeiten
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
quelle
Eine viel sauberere und sicherere Antwort auf dieses Problem (Sie sollten Strings wirklich nicht hart codieren):
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); }
Sie müssen lediglich die Bild-ID an das Ende des Pfads für EXTERNAL_CONTENT_URI anhängen . Starten Sie dann eine Absicht mit der Aktion Anzeigen und dem Uri.
Die Bild-ID stammt aus der Abfrage des Inhaltsauflösers.
quelle
Alle obigen Antworten öffnen das Bild nicht. Wenn ich das zweite Mal versuche, es zu öffnen, zeigt die Galerie kein Bild.
Ich habe eine Lösung aus einer Mischung verschiedener SO-Antworten erhalten.
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);
Dieser hat nur für mich funktioniert ..
quelle
Das Problem beim Anzeigen einer Datei mit besteht darin
Intent.ACTION_VIEW
, dass SieUri
den Pfad beim Parsen übergeben. Funktioniert nicht in allen Fällen. Um dieses Problem zu beheben, müssen Sie Folgendes verwenden:Uri.fromFile(new File(filePath));
Anstatt:
Uri.parse(filePath);
Bearbeiten
Hier ist mein vollständiger Code:
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);
Die Info
MediaFile
ist meine Domänenklasse zum Umschließen von Dateien aus der Datenbank in Objekte.MediaFile.getExtension()
Gibt einString
withMimetype
für die Dateierweiterung zurück. Beispiel:"image/png"
Zusätzlicher Code: Wird zum Anzeigen einer Datei (Erweiterung) benötigt.
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(); } }
Lassen Sie mich wissen, wenn Sie mehr Code benötigen.
quelle
Ich benutze das, es funktioniert für mich
Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), 1);
quelle
Meine Lösung mit File Provider
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); }
quelle
Fast KEINE Möglichkeit, eine Foto- oder Galerieanwendung (möglicherweise vorhanden) zu verwenden, aber Sie können den Content-Viewer ausprobieren.
Bitte Kasse eine andere Antwort auf ähnliche Frage hier
quelle
Meine Lösung
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);
quelle