Ich habe eine Android-Anwendung, die mehrere Aktivitäten enthält.
In einem von ihnen verwende ich eine Taste, die die Gerätekamera aufruft:
public void onClick(View view) {
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(photoIntent, IMAGE_CAPTURE);
}
In derselben Aktivität rufe ich die OnActivityResult
Methode für das Bildergebnis auf:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.pic);
imageview.setImageBitmap(image);
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
}
}
}
Das Problem ist, dass die Absicht data
null ist und sich die OnActivityResult
Methode direkt an die wendet (resultCode == RESULT_CANCELED)
und die Anwendung zur vorherigen Aktivität zurückkehrt.
Wie kann ich dieses Problem beheben und nach dem Aufrufen der Kamera kehrt die Anwendung zur aktuellen Aktivität zurück, die eine ImageView
enthält, die das aufgenommene Bild enthält?
Vielen Dank
android
android-camera
android-imageview
soft_developer
quelle
quelle
Antworten:
Die Standardanwendung für Android-Kameras gibt nur dann eine Nicht-Null-Absicht zurück, wenn eine Miniaturansicht in der zurückgegebenen Absicht zurückgegeben wird. Wenn Sie
EXTRA_OUTPUT
mit einer URI übergeben, an die geschrieben werden soll, wird einenull
Absicht zurückgegeben, und das Bild befindet sich in der URI, die Sie übergeben haben.Sie können dies überprüfen, indem Sie sich den Quellcode der Kamera-App auf GitHub ansehen:
https://github.com/android/platform_packages_apps_camera/blob/gingerbread-release/src/com/android/camera/Camera.java#L1186
Ich würde vermuten, dass Sie entweder
EXTRA_OUTPUT
irgendwie vorbeikommen oder die Kamera-App auf Ihrem Telefon anders funktioniert.quelle
Ich fand eine einfache Antwort. Es klappt!!
Wenn Sie dieses Bild zuschneiden und skalieren möchten
quelle
FileUriExposedException
auf moderne SDK-Versionen.Ich habe dieses Problem erlebt, das
intent
ist nicht null, aber die darüber gesendeten Informationen werdenintent
nicht in empfangenonActionActivit()
Dies ist eine bessere Lösung mit getContentResolver () :
die
onActivityResult()
von getContentResolver () gespeicherte Bitmap abrufen :Überprüfen Sie mein Beispiel in Github:
https://github.com/Jorgesys/TakePicture
quelle
Einfache funktionierende Kamera-App, die das Null-Intent-Problem vermeidet
- alle geänderten Codes, die in dieser Antwort enthalten sind; in der Nähe von Android Tutorial
Ich habe viel Zeit mit diesem Thema verbracht, daher habe ich beschlossen, ein Konto zu erstellen und meine Ergebnisse mit Ihnen zu teilen.
Das offizielle Android-Tutorial "Taking Photos Simply" hat nicht ganz das gehalten, was es versprochen hatte. Der dort bereitgestellte Code funktionierte auf meinem Gerät nicht: ein Samsung Galaxy S4 Mini GT-I9195 mit Android Version 4.4.2 / KitKat / API Level 19.
Ich fand heraus, dass das Hauptproblem die folgende Zeile in der Methode war, die beim Aufnehmen des Fotos aufgerufen wurde (
dispatchTakePictureIntent
im Tutorial):Dies führte dazu
onActivityResult
, dass die Absicht später durch Null erfasst wurde .Um dieses Problem zu lösen, habe ich mich von früheren Antworten hier und einigen hilfreichen Beiträgen zu Github inspirieren lassen (meistens von Deepwinter - ein großes Dankeschön an ihn; vielleicht möchten Sie auch seine Antwort auf einen eng verwandten Beitrag lesen ).
Nach diesen angenehmen Ratschlägen entschied ich mich für die Strategie, die erwähnte
putExtra
Zeile zu löschen und stattdessen das aufgenommene Bild von der Kamera innerhalb der onActivityResult () -Methode zurückzugewinnen. Die entscheidenden Codezeilen, um die dem Bild zugeordnete Bitmap wiederherzustellen, sind:Ich habe eine beispielhafte App erstellt, mit der Sie einfach ein Bild aufnehmen, auf der SD-Karte speichern und anzeigen können. Ich denke, dies könnte für Leute in der gleichen Situation wie ich hilfreich sein, als ich über dieses Problem gestolpert bin, da sich die aktuellen Hilfevorschläge meist auf ziemlich umfangreiche Github-Posts beziehen, die die fragliche Sache tun, aber für Neulinge wie nicht allzu leicht zu überwachen sind mich. In Bezug auf das Dateisystem, das Android Studio beim Erstellen eines neuen Projekts standardmäßig erstellt, musste ich nur drei Dateien für meinen Zweck ändern:
activity_main.xml:
MainActivity.java:
AndroidManifest.xml:
Beachten Sie, dass die Lösung, die ich für das Problem gefunden habe, auch zu einer Vereinfachung der Android-Manifest-Datei geführt hat: Die im Android-Tutorial vorgeschlagenen Änderungen zum Hinzufügen eines Anbieters werden nicht mehr benötigt, da ich in meinem Java-Code keine mehr verwende. Daher mussten der Manifestdatei nur wenige Standardzeilen hinzugefügt werden - hauptsächlich in Bezug auf Berechtigungen.
Es kann außerdem hilfreich sein, darauf hinzuweisen, dass der Autoimport von Android Studio möglicherweise nicht in der Lage ist,
java.text.SimpleDateFormat
und zu verarbeitenjava.util.Date
. Ich musste beide manuell importieren.quelle
Wahrscheinlich, weil du so etwas hattest?
Sie dürfen die zusätzliche Ausgabe jedoch nicht in die Absicht einfügen, da die Daten dann anstelle der Datenvariablen in den URI eingegeben werden. Aus diesem Grund müssen Sie die beiden Zeilen in der Mitte herausnehmen, damit Sie haben
Das hat das Problem für mich verursacht, hoffe das hat geholfen.
quelle
Der folgende Code funktioniert für mich:
Und hier ist das Ergebnis:
quelle
imageReturnedIntent.getData()
Wert null. Ich erschaffe die gleiche Absicht wie deine. Putt keine zusätzlichen Parameter.So greifen Sie auf die Kamera zu, nehmen Bilder auf und stellen ImageView auf Android ein
Sie müssen
Uri file = Uri.fromFile(getOutputMediaFile());
für Marshmallow verwenden.Verwenden Sie den folgenden Link, um den Pfad zu erhalten
https://androidkennel.org/android-camera-access-tutorial/
quelle
Kotlin-Code, der für mich funktioniert:
Und Ergebnis erhalten:
und vergessen Sie nicht, den Anforderungscode anzugeben:
quelle
Nach vielen Versuchen und Studien konnte ich es herausfinden. Erstens sind die variablen Daten von Intent immer null.
!null
Wenn Sie also nach prüfen , stürzt Ihre App ab, solange Sie einen URI an startActivityForResult übergeben. Befolgen Sie das folgende Beispiel. Ich werde Kotlin benutzen.Öffnen Sie die Kameraabsicht
} `
Erstellen Sie die Datei createImageFile (). Sie MÜSSEN jedoch die Variable imageFilePath global machen. Ein Beispiel für die Erstellung finden Sie in der offiziellen Android-Dokumentation und sind recht unkompliziert
Holen Sie sich die Absicht
Die Methode getBytesFromBitmap
Ich hoffe das hilft.
quelle
Wenn wir das Bild von der Kamera in Android aufnehmen, dann ist Uri oder
data.getdata()
null. Wir haben zwei Lösungen, um dieses Problem zu beheben.Ich werde alle Methoden hier implementieren. Bitte beachten und lesen Sie diese sorgfältig: -
Zuerst werde ich erzählen, wie man Uri von Bitmap erhält. Bild: Der vollständige Code lautet:
Zuerst werden wir ein Bild durch Intent aufnehmen, das für beide Methoden gleich ist, so dass ich diesen Code nur einmal hier schreibe:
Jetzt implementieren wir OnActivityResult :-( Dies ist für beide oben genannten 2 Methoden gleich): -
Jetzt werden wir alle oben genannten Methoden erstellen, um Uri aus Bild- und Cursormethoden über Klassen zu erstellen:
Jetzt URI-Pfad von Bitmap Image
\ Uri vom realen Pfad des gespeicherten Bildes
quelle
Wenn wir das Bild von der Kamera in Android aufnehmen, wird es
Uri
oderdata.getdata()
wird null. Wir haben zwei Lösungen, um dieses Problem zu beheben.So rufen Sie den Uri aus dem Bitmap-Image ab. Nehmen Sie zuerst ein Bild über Intent auf, das für beide Methoden gleich ist:
Implementieren Sie nun
OnActivityResult
, was für beide Methoden gleich ist:Erstellen Sie nun alle oben genannten Methoden, um den Uri aus den Bild- und Cursormethoden zu erstellen:
Uri-Pfad von Bitmap Bild:
Uri vom realen Pfad des gespeicherten Bildes:
quelle