Ich versuche eine Android-App zu erstellen, die ein Bild aufnehmen und in irgendeiner Weise verarbeiten wird. Ich möchte, dass das Layout Google Goggles ähnlich ist. Das bedeutet, Kameravorschau oben und einige Bedienelemente unten im Hochformat.
Ich habe eine erste Version mit einem Codebeispiel von hier erstellt. Das funktioniert, aber ich möchte eine Schaltfläche an der Unterseite hinzufügen.
Ich habe meine main.xml wie folgt geändert (basierend auf den Kommentaren aus diesem Beitrag):
%Vor%Aber wenn ich diesen Code ausführe, bekomme ich die folgende Ausnahme:
%Vor%Wenn ich das obige SurfaceView durch etwas anderes, z. ein TextView, das es anzeigt, aber im Querformat.
Wie kann ich mit der Hochformatansicht eine Kamervorschau auf einen Teil des Bildschirms erhalten?
Danke
Erstens wird Ihr Layout wahrscheinlich nicht geben, was Sie wollen. Erwägen Sie die Verwendung von RelativeLayout
, wobei Button
am unteren Ende verankert ist und SurfaceView
am oberen Bildschirmrand und am oberen Rand von Button
verankert ist.
Außerdem haben Sie ein dupliziertes xmlns:android="http://schemas.android.com/apk/res/android"
auf Ihrem SurfaceView
, das Sie nicht benötigen. Die auf Ihrem Root-Element wird ausreichen.
In Bezug auf Ihre Ausnahmebedingung gibt es möglicherweise mehr Details in Ihrer Stack-Ablaufverfolgung, die Ihnen fehlen, und erklären, warum startPreview()
fehlgeschlagen ist. Suchen Sie in der Mitte des Stack-Trace nach einer "Caused by" - oder einer anderen Linie. Wenn Sie es nicht identifizieren können, bearbeiten Sie Ihre Frage und fügen Sie den gesamten Stack-Trace ein (und pingen Sie mich über einen Kommentar zu dieser Antwort an, da ich sonst nichts von der Änderung weiß).
Sie können auch mit diesem Buchbeispiel als weitere Camera
Vorschau experimentieren app, um zu sehen, ob es etwas darüber gibt, wie ich das Problem angehen, das besser für Ihre Umstände funktioniert.
Wenn ich etwas nicht vermisse, können Sie SurfaceView nicht einfach so verwenden, wie es ist. Sie benötigen eine eigene abgeleitete Klasse. Normalerweise erstelle ich diese Ansicht programmgesteuert und gebe ihr den ganzen Bildschirm. Aber Sie können Teile davon mit anderen Ansichten abdecken, einschließlich Schaltflächen:
%Vor%Ja, Sie können eine Oberflächenansicht verwenden. Von der Oberfläche aus können Sie den SurfaceHolder aufrufen, mit dem Sie dann das previewDisplay der Kamera einstellen können.
%Vor%Sie müssen die SurfaceHolder.Callback-Methode implementieren, um die Vorschaugröße ordnungsgemäß zu aktualisieren. Stellen Sie in SurfaceCreated das previewDisplay der Kamera ein. Bei surfaceChanged aktualisieren Sie die previewSize für die Kamera.
%Vor%Tatsächlich das erwähnte Beispiel vorher ist eine sehr gute Referenz!