2017-07-05 2 views
2

Ich habe an Camera Modules gearbeitet, und das einzige Problem hier ist, wenn ich versuche, die Kamera zu wiederholen, wird es für ein paar Sekunden verzögert, bevor die Kameravorschau erneut geöffnet wird (siehe Erstes Bild) . Bitte werfen Sie einen Blick auf meine Kamera schaut Vorschau untenAndroid - Fortsetzen der Kameraaktivität wird verzögert

enter image description here

Dies ist, nachdem ich das Foto

enter image description here

nahm Als ich die Neuaufnahme Schaltfläche klicken (mittlere), wird es einige nehmen Mal, um die Kameravorschau neu zu laden (erstes Bild). Ich habe eine andere App ausprobiert und festgestellt, dass bei der erneuten Aufnahme des Fotos sofort (ohne Verzögerung) zur vorherigen Kameravorschau zurückgekehrt wird, so als würde man zur vorherigen Seite zurückkehren.

In der Kameravorschau habe ich eine Leinwandzeichnung implementiert, um die Überlagerungsansicht zu erstellen. Aber ich denke, das ist nicht das Problem, weil die andere App, die ich vorher gesagt habe, auch einige Zeit braucht, um die Kameravorschau zu laden. Aber das einzige Unterschied ist, wenn sie das Foto wiederholen, wird die Kameravorschau sofort geladen, während meine App einige Male dauert, um die Kameravorschau neu zu laden.

Ich implementierte in meiner Klasse. Ich habe versucht, onResume zu entfernen und einige der Methoden zu optimieren, und es hat nicht viel geholfen.

Haben Sie eine Idee, wie Sie mit dieser Verzögerung umgehen können?

Dank

+0

Siehe meine Antwort hoffe, das wird Ihnen einen Hinweis geben. –

+0

danke @AndyDeveloper, krank zu überprüfen – Webster

Antwort

1

Sie benötigen eine andere Tätigkeit zu schaffen, dieVorschau Ihrer Capture-Foto zeigt. Das Vorschau-Aktivitäts-XML-Layout sieht genauso aus wie Ihre Erfassungsaktivität. Der einzige Unterschied zwischen beiden XML-Layout ist ImageView, den Sie für die Vorschauaktivität verwendet haben.

Nun, wie geht das? Hier ist die einfache Lösung. Wie Sie bereits erwähnt haben, haben Sie SurfaceHolder.Callback verwendet, also müssen Sie die Methode Camera.PictureCallback verwenden, die Ihr Foto in Ihrem Speicherverzeichnis speichert.

Camera.PictureCallback mPicture = new Camera.PictureCallback() 
{ 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) 
    { 
     // Logic to Save your Photo to your storage directory. 
     Intent intent = new Intent(YouActivity.this, PreviewActivity.class); 
     // Pass the saved image path to preview activity. 
     intent.putExtra("ImagePath", youSavedImagePath); 
     startActivity(intent); 
    } 
}; 

Jetzt auf PreviewActivity nur den Wert aus Intent.

String imagePath = getIntent().getStringExtra("ImagePath"); 

Nachdem Sie den Pfad des Bildes festgelegt haben, setzen Sie das Bild auf Ihre ImageView.

Bitmap bitmap = BitmapFactory.decodeFile(imagePath); 
yourImageView.setImageBitmap(bitmap); 

Wenn Sie nun auf die CaptureActivity drücken zurück, oder klicken Sie auf Ihre Vorschau zurückzuerobern zeigen sofort und nicht time.Please stellen Sie sicher, nehmen Sie nicht die CaptureActivity beenden.

+0

danke Mann, ich werde das Ergebnis aktualisieren und als beantwortet markieren, sobald es Erfolg ist – Webster

+0

@Webster Ya sicher.Willkommen Sir :) –

+0

sowieso, ich habe bereits ähnliche Art und Weise mit Ihrem implementiert, wenn onPictureTaken werde ich zur zweiten Aktivität gehen, um das Bild, das gemacht worden war, zu laden. Kannst du näher erläutern, auf welchen Teil die Wiederholung schneller funktionieren wird? Danke Kumpel – Webster

1

Damit die Wiederholung schneller funktioniert, können Sie die Kameravorschau sofort beim Eintreffen des Bildes unter der Haube neu starten und die (aufgezeichnete) Bildansicht oben anzeigen, um den Live-Kamera-Videostream zu verbergen. Wenn der Benutzer sich entscheidet, das Foto zu wiederholen, verstecken Sie einfach das Overlay (kann ein Fragment oder nur ein Layout mit ImageView und Schaltflächen sein), und die Live-Vorschau wird sofort verfügbar sein!

+0

gutes Konzept, werde es versuchen und informieren Sie sowieso – Webster

+0

, gibt es einen Unterschied, wenn ich Aktivität verwenden, um das Bild zu öffnen (ich benutze Picasso, um das Bild in den ImageView zu laden) anstatt ein Fragment zu verwenden? – Webster

+1

Solange Sie beide Szenen in einer Aktivität behalten, ist es viel einfacher, den Lebenszyklus der Kamera zu verfolgen. Normalerweise verwenden wir SurfaceView-Callbacks, um Camera.open(), Camera.release(), startPreview() usw. zu orchestrieren. Es ist nicht unmöglich, dies mit einer sekundären Aktivität zu tun, aber normalerweise sind die Vorteile der Trennung wesentlich geringer als die Vorteile von organischer Kameraperistenz. –

Verwandte Themen