Какой лучший способ вызвать StartPreview () после захвата изображения? - PullRequest
12 голосов
/ 02 февраля 2012

После вызова Camera.takePicture () мой предварительный просмотр перестанет обновляться, как описано в документации.Каков наилучший способ определить, что процесс захвата изображения завершен, и вызвать startPreview (), чтобы заставить его снова начать обновление?

Невозможно выполнить вызов ни в один из обратных вызовов, переданных takePicture, согласнодокументы, так как они все должны были вернуться до того, как я вызову его.

В настоящее время я предпочитаю создать обработчик и опубликовать отложенный Runnable для него из обратного вызова JPEG (или того, который является последним определенным обратным вызовом для возврата).

Ответы [ 2 ]

12 голосов
/ 06 мая 2013

Поскольку PictureCallback все равно запускается в отдельном потоке (он не блокирует интерфейс), вам не нужно использовать AsyncTask для вызова захвата.

Есть два способа сделать то, что вы хотите сделать, самый простой из них:

mCamera.startPreview(); //preview has to be started before you can take a picture
mCamera.takePicture(null, null, mPictureCallback); //take a picture

private PictureCallback mPictureCallback = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        camera.startPreview(); //once your camera has successfully finished
                               //its capture it's safe to restart the preview
        ... //anything else you want to do to process that image
    }
}

Второй будет использовать анонимную функцию, например ::10000

mCamera.takePicture(null, null, new PictureCallback(){
    ...
});

Оба имеют свое применение, в зависимости от ваших потребностей.

6 голосов
/ 25 апреля 2012

Вы должны запустить mCamera.takePicture из AsyncTask (или потока), однако AsyncTaks проще.

Действительно простая реализация (которую, конечно, можно изменить) состоит в следующем:

Метод, призванный сделать снимок

/**
 * Execute the AsyncTask that will handle the preview of the captured photo.
 */
public void takePicture() {
    TakePictureTask takePictureTask = new TakePictureTask();
    takePictureTask.execute();
}

Подкласс AsyncTask

/**
 * A pretty basic example of an AsyncTask that takes the photo and
 * then sleeps for a defined period of time before finishing. Upon
 * finishing, it will restart the preview - Camera.startPreview().
 */

private class TakePictureTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPostExecute(Void result) {
        // This returns the preview back to the live camera feed
        mCamera.startPreview();
    }

    @Override
    protected Void doInBackground(Void... params) {
        mCamera.takePicture(null, null, mPictureCallback);

        // Sleep for however long, you could store this in a variable and
        // have it updated by a menu item which the user selects.
        try {
            Thread.sleep(3000); // 3 second preview
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

}

Поле PictureCallback

private PictureCallback mPictureCallback = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        File file = null;

        // Check whether the media is mounted with read/write permission.
        if (Environment.MEDIA_MOUNTED.equals(
                Environment.getExternalStorageState())) {
            file = getOutputMediaFile();
        }

        if (file == null) {
            Log.d(TAG, "Error creating media file, check storage persmissions!");
            return;
        }

        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(data);
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...