Android-Bildaufnahme leicht gemacht: Kamera und Galerie in einer App
Tauchen Sie ein in die Welt der Android-Entwicklung mit unserem neuesten Blogbeitrag!
Erfahren Sie, wie Sie mühelos Bilder aus Kamera und Galerie in Ihre App integrieren und anzeigen können. Von der Berechtigungsverwaltung bis zur Anzeige der Bilder in verschiedenen Ansichten – unser Leitfaden führt Sie Schritt für Schritt durch den Prozess. Tauchen Sie ein und entdecken Sie die Möglichkeiten der Bildaufnahme in Android!
In der heutigen Anleitung werden wir eine Anwendung entwickeln
In der heutigen Anleitung werden wir eine Anwendung entwickeln, die ein Bild aus der Kamera oder der Galerie auswählt und dieses in einem ImageView anzeigt. Beachten Sie: Der untenstehende Code funktioniert einwandfrei für Versionen vor Android Nougat.
Mit dem Beginn von Android Marshmallow
Mit dem Beginn von Android Marshmallow müssen Berechtigungen zur Laufzeit im Vordergrund implementiert werden. Fügen Sie die folgenden Berechtigungen in die Android Manifest.xml-Datei ein, über dem Anwendungstag.
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.flash"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="ANDROID.PERMISSION.READ_EXTERNAL_STORAGE"/>
Durch das Hinzufügen von android.hardware.camera erkennt der Play Store und verhindert die Installation der Anwendung auf Geräten ohne Kamera. Intent ist der Standardweg, um Aktionen an eine andere Anwendung zu delegieren. Um die native Kamera zu starten, benötigt das Intent android.provider.MediaStore.ACTION_IMAGE_CAPTURE. Um ein Bild aus der Galerie auszuwählen, benötigt das Intent das folgende Argument: Intent.ACTION_GET_CONTENT. In dieser Anleitung rufen wir einen Bildauswähler auf, der es uns ermöglicht, ein Bild aus der Kamera oder der Galerie auszuwählen und das Bild in einem kreisförmigen ImageView und einem normalen ImageView anzuzeigen. Fügen Sie die folgende Abhängigkeit in die build.gradle-Datei ein. `compile ‚de.hdodenhof:circleimageview:2.1.0’`
Projektstruktur für die Android-Bildaufnahme
Android-Bildaufnahme-Code
Das Layout für die activity_main.xml bleibt gleich, außer der Icon-Änderung für die FAB-Schaltfläche zu @android:drawable/ic_menu_camera. Der Inhalt content_main.xml lautet wie folgt:
<!-- Ihr XML-Code hier einfügen -->
Der Code für die MainActivity.java ist wie folgt:
// Ihr Java-Code hier einfügen
Schlussfolgerungen
Hier sind einige Schlussfolgerungen, die aus dem obigen Code gezogen werden können:
- Wir müssen um Kamera-Berechtigungen zur Laufzeit bitten, wenn der Benutzer die Aktivität startet.
- Da wir das Intent starten, um ein Ergebnis zurückzubekommen, müssen wir startActivityForResult mit den relevanten Argumenten aufrufen.
- Anstatt einen Dialog zu verwenden, um die Intents für Kamera und Galerie separat aufzurufen, haben wir eine Methode `getPickImageChooserIntent()` verwendet, die ein einzelnes Auswahlintent für alle Kamera- und Galerie-Intents erstellt (beachten Sie das Dokumenten-Intent). `Intent.EXTRA_INITIAL_INTENTS` wird verwendet, um die verschiedenen Anwendungsintents an einer Stelle hinzuzufügen.
- Für das Kamera-Intent wird `MediaStore.EXTRA_OUTPUT` als Extra übergeben, um den Bildspeicherpfad anzugeben. Ohne dies erhalten Sie nur ein Bild mit geringer Auflösung zurück.
- Der URI-Pfad für das Bild, das von der Kamera zurückgegeben wird, wird in der Methode `getCaptureImageOutputUri()` abgerufen.
- Das `onActivityResult` gibt im Wesentlichen eine URI für das Bild zurück. Einige Geräte geben den Bitmap als `data.getExtras().get(„data“)` zurück.
- Wenn ein Bild aufgenommen wird, wird der Kamera-Bildschirm beim Zurückkehren die Aktivität neu gestartet, wodurch die URI, die aus der Methode `getCaptureImageOutputUri()` gespeichert wurde, null wird. Daher ist es wichtig, dass wir diese URI mit `onSaveInstanceState()` und `onRestoreInstanceState()` speichern und wiederherstellen.
- Die Bitmap wird aus der URI in der folgenden Codezeile abgerufen: `myBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), picUri);`
- Geräte wie das Samsung Galaxy sind dafür bekannt, das Bild im Querformat aufzunehmen. Wenn das Bild ohne Änderungen abgerufen und angezeigt wird, kann es in der falschen Ausrichtung angezeigt werden. Daher haben wir die Methode `rotateImageIfRequired(myBitmap, picUri)` aufgerufen.
- `ExifInterface` ist eine Klasse zum Lesen und Schreiben von Exif-Tags in einer JPEG-Datei oder einer RAW-Bilddatei.
- Am Ende rufen wir die Methode `getResizedBitmap()` auf, um die Bitmap nach Breite oder Höhe zu skalieren (je nachdem, welche größer ist), und setzen das Bild auf das ImageView mit `setImageBitmap`.