Ich möchte ein Modul schreiben, in dem die Kamera auf Knopfdruck geöffnet wird und ich auf ein Bild klicken und es aufnehmen kann. Wenn mir das Bild nicht gefällt, kann ich es löschen und auf ein weiteres Bild klicken und dann das Bild auswählen. Es sollte zurückkehren und das Bild in der Aktivität anzeigen.
278
Antworten:
Hier ist eine Beispielaktivität, mit der die Kamera-App gestartet, das Bild abgerufen und angezeigt wird.
Beachten Sie, dass Sie mit der Kamera-App selbst das Bild überprüfen / erneut aufnehmen können. Sobald ein Bild akzeptiert wurde, wird es in der Aktivität angezeigt.
Hier ist das Layout, das in der obigen Aktivität verwendet wird. Es ist einfach ein LinearLayout, das eine Schaltfläche mit der ID button1 und eine ImageView mit der ID imageview1 enthält:
Und noch ein letztes Detail:
und wenn die Kamera für Ihre App-Funktionalität optional ist. Stellen Sie sicher, dass require in der Berechtigung auf false gesetzt ist. so was
zu Ihrer manifest.xml.
quelle
<uses-feature/>
mit demandroid:required="false"
Attribut hinzufügen :<uses-feature android:name="android.hardware.camera" android:required="false"></uses-feature>
Bitmap photo = (Bitmap) data.getExtras().get("data");
das aufgenommene Bild nicht erfasst wird. Es wird eine Miniaturansicht des aufgenommenen Bildes angezeigt.Update (2020)
Google hat eine neue
ActivityResultRegistry
API hinzugefügt , mit der Sie "sowohl diestartActivityForResult()
+onActivityResult()
als auch dierequestPermissions()
+onRequestPermissionsResult()
Flows verarbeiten können, ohne die Methoden in Ihrer Aktivität oder Ihrem Fragment zu überschreiben, die Typensicherheit erhöhenActivityResultContract
und Hooks zum Testen dieser Flows bereitstellen" - Quelle .Die API wurde in androidx.activity 1.2.0-alpha02 und androidx.fragment 1.3.0-alpha02 hinzugefügt .
So können Sie jetzt Folgendes tun:
In der Dokumentation erfahren Sie, wie Sie die neue Aktivitätsergebnis-API verwenden: https://developer.android.com/training/basics/intents/result#kotlin
Es gibt viele integrierte ActivityResultContracts , mit denen Sie verschiedene Aufgaben ausführen können, z. B. Kontakte auswählen, Berechtigungen anfordern, Bilder aufnehmen oder Videos aufnehmen. Sie interessieren sich wahrscheinlich für das oben gezeigte ActivityResultContracts.TakePicture .
Beachten Sie, dass androidx.fragment 1.3.0-alpha04 die APIs
startActivityForResult()
+onActivityResult()
undrequestPermissions()
+onRequestPermissionsResult()
für Fragment nicht mehr unterstützt. Daher scheintActivityResultContracts
dies von nun an die neue Art zu sein, Dinge zu tun.Ursprüngliche Antwort (2015)
Ich habe einige Stunden gebraucht, um das zum Laufen zu bringen. Der Code ist fast ein Copy-Paste von developer.android.com , mit einem kleinen Unterschied.
Fordern Sie diese Erlaubnis an
AndroidManifest.xml
:Auf dem
Activity
Starten dies durch die Definition:Dann feuere dies
Intent
in einemonClick
:Fügen Sie die folgende Unterstützungsmethode hinzu:
Dann erhalten Sie das Ergebnis:
Was es zum Laufen gebracht hat, ist das
MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath))
, was sich vom Code von developer.android.com unterscheidet . Der ursprüngliche Code gab mir eineFileNotFoundException
.quelle
android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/JPEG_20180823_102340_722874009725833047.jpg exposed beyond app through ClipData.Item.getUri()
. Irgendeine Idee, wie man das behebt? @ AlbertVilaCalvostorageDir = Context.getFilesDir();
anstelle von File verwendenstorageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES);
. Ansonsten wurde mir ein Fehler mit der Berechtigung verweigert.Foto aufnehmen + Aus Galerie auswählen:
quelle
ResultCode == 1
drinnenResultCode == RESULT_OK
?requestCode==1
hilft zu identifizieren, wer die Anfrage initiiert hat.Ich weiß, dass es ein ziemlich alter Thread ist, aber alle diese Lösungen sind nicht abgeschlossen und funktionieren auf einigen Geräten nicht, wenn der Benutzer die Kamera dreht, da die Daten in onActivityResult null sind. Hier ist also eine Lösung, die ich auf vielen Geräten getestet habe und bisher keine Probleme hatte.
Deklarieren Sie zuerst Ihre Uri-Variable in Ihrer Aktivität:
Erstellen Sie dann Ihren temporären Ordner zum Speichern des aufgenommenen Bildes und beabsichtigen Sie, das Bild mit der Kamera aufzunehmen:
Und jetzt kommt eines der wichtigsten Dinge: Sie müssen Ihren uriFilePath in onSaveInstanceState speichern, denn wenn Sie dies nicht getan hätten und der Benutzer sein Gerät während der Verwendung der Kamera gedreht hätte, wäre Ihr uri null.
Danach sollten Sie Ihre URL immer in Ihrer onCreate-Methode wiederherstellen:
Und hier kommt der letzte Teil, um Ihren Uri in onActivityResult zu bringen:
PS Vergessen Sie nicht, Berechtigungen für Camera und Ext hinzuzufügen. Speicher schreiben in Ihr Manifest.
quelle
Hier können Sie die Kamera oder Galerie öffnen und das ausgewählte Bild in die Bildansicht versetzen
Fügen Sie Berechtigungen im Manifest hinzu
In onCreate ()
Dialogfeld "Optionen anzeigen" (um ein Bild von der Kamera oder Galerie auszuwählen)
Holen Sie sich ein Foto aus der Galerie
Holen Sie sich ein Foto von der Kamera
Sobald das Bild ausgewählt oder aufgenommen wurde,
Jetzt ist es Zeit, das Bild zu speichern
Um Erlaubnis bitten
quelle
Sie müssen sich über die Kamera informieren . (Ich denke, um zu tun, was Sie wollen, müssten Sie das aktuelle Bild in Ihrer App speichern, dort auswählen / löschen und dann die Kamera zurückrufen, um es erneut zu versuchen, anstatt den Wiederholungsversuch direkt in der Kamera durchzuführen.)
quelle
Hier ist der Code, den ich zum Erfassen und Speichern von Kamerabildern verwendet habe, um ihn dann in der Bildansicht anzuzeigen. Sie können nach Bedarf verwenden.
Sie müssen das Kamerabild an einem bestimmten Ort speichern, von diesem Ort abrufen und dann in ein Byte-Array konvertieren.
Hier ist eine Methode zum Öffnen der Kamerabildaktivität.
dann sollte Ihre onActivityResult () -Methode so sein.
Hier ist die in onActivityResult () verwendete Methode getBitmap (). Ich habe alle möglichen Leistungsverbesserungen vorgenommen, die beim Abrufen der Bitmap für die Kameraaufnahme möglich sind.
Ich hoffe es hilft!
quelle
Nehmen Sie ein Foto von der Kamera auf + wählen Sie ein Bild aus der Galerie aus und stellen Sie es in den Hintergrund des Layouts oder der Bildansicht. Hier ist ein Beispielcode.
quelle
In Aktivität:
in layout.xml:
in manifest.xml:
quelle
Sie können eine benutzerdefinierte Kamera mit Miniaturbild verwenden. Sie können mein Projekt sehen .
quelle
Ich habe einen Dialog mit der Option erstellt, Bild aus Galerie oder Kamera auszuwählen. mit einem Rückruf als
Zuerst müssen wir die Berechtigung in AndroidManifest definieren, da wir einen externen Speicher schreiben müssen, während wir eine Datei erstellen und Bilder aus der Galerie lesen
Erstellen Sie eine Dateipfad-XML in app / src / main / res / xml / file_paths.xml
mit Pfad
Dann müssen wir den Dateiprovider definieren, um Content Uri für den Zugriff auf Dateien zu generieren, die in einem externen Speicher gespeichert sind
Dailog Layout
ImagePicker Dailog
}}
Rufen Sie Aktivität oder Fragment wie dieses auf. Definieren Sie ImagePicker in Fragment / Aktivität
Rufen Sie dann dailog auf Knopfdruck auf
quelle
Hier ist der vollständige Code:
Denken Sie daran, auch Berechtigungen für die Kamera hinzuzufügen.
quelle
Sie können diesen Code verwenden, um auf den Listener zu klicken (Sie können ImageView oder die Schaltfläche verwenden).
Zur Anzeige in Ihrer Bildansicht
Hinweis: Fügen Sie dies in das Manifest ein
quelle
Verwenden Sie den folgenden Code, um Bilder mit Ihrer mobilen Kamera aufzunehmen. Wenn Sie Android mit einer höheren Version als Lolipop verwenden, sollten Sie auch die Berechtigungsanforderung hinzufügen.
quelle
Bitmap photo = (Bitmap) data.getExtras().get("data");
bekommt ein Vorschaubild von der Kamera. Es gibt einen Artikel darüber, wie ein Bild von der Kamera in einem externen Speicher gespeichert wird. nützlicher Linkquelle
Folgen Sie diesem Beispiel mit dieser Implementierung, indem Sie die Kotlin- und Andoirdx-Unterstützung verwenden:
Und das Aktivitätsergebnis:
Weitere Informationen finden Sie unter https://github.com/joelmmx/take_photo_kotlin.git
Ich hoffe es hilft dir!
quelle