воссоздание объекта камеры после ошибки 100 (сервер камеры умер) - PullRequest
8 голосов
/ 22 января 2012

У меня есть классическое приложение для Android с предварительным просмотром с камеры (общий инструмент, который можно найти во многих руководствах [маракана и т. Д.]), Которое должно делать снимки за определенный промежуток времени.Потоки и уничтожение потоков сделано, ошибки типа "method called after release" обрабатываются.Но иногда возникает общеизвестная ошибка 100.Я принял тот факт, что это происходит, и попытался справиться с этим тоже.Я реализовал ErrorCallback и его onError метод, где текущий объект камеры выпущен, и создал новый объект, как написано в официальной документации.

Но (без удивления) этого недостаточно.Новая камера может быть неправильно выделена, потому что теперь появляется сообщение "CameraDemo has been exited unexpectedly".Я прочитал много документов и примеров в надежде, что где-то будет объяснено правильное разбирательство, но, очевидно, ни у кого нет такой проблемы.Поэтому я хотел бы спросить, что еще я должен делать, кроме выпуска и создания новой камеры?Вот код:

ErrorCallback CEC = new ErrorCallback()
{
    public void onError(int error, Camera camera)
    {
        Log.d("CameraDemo", "camera error detected");
        if(error == Camera.CAMERA_ERROR_SERVER_DIED)
        {
            Log.d("CameraDemo", "attempting to reinstantiate new camera");
            camera.stopPreview();
            camera.setPreviewCallback(null);
            camera.release(); //written in documentation...
            camera = null;              
            camera = Camera.open();

        }
    }
};

Вскоре - если я освобождаю и воссоздаю камеру в onError обратном вызове, тогда RuntimeException Метод, вызываемый после освобождения (takePicture), вызывается.Так стоит ли мне как-то снова назначать держатель поверхности для камеры или воссоздавать держатель поверхности?

Этого было бы достаточно, чтобы направить меня, например, на некоторые форумы, где это описано или решено, и т. Д. Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 11 мая 2015

Вот как я это исправил, вот пример кода, думаю, вы поняли:

private Camera camera;

// code...

public Camera getCameraInstance() {
    Camera camera = Camera.open();
    // code...
    camera.setErrorCallback(new ErrorCallback() {
        @Override
        public void onError(int error, Camera camera) {
            if(error == Camera.CAMERA_ERROR_SERVER_DIED) {
                releaseCamera();
                startCamera();
            }
        }
    });
    return camera;
}

protected void startCamera() {
    if(getCamera() == null)
        setCamera(getCameraInstance());
    refreshCamera();
}

protected void releaseCamera() {
    if (getCamera() != null) {
        getCamera().release();
        setCamera(null);
    }
}

public Camera getCamera() {
    return camera;
}

public void setCamera(Camera camera) {
    this.camera = camera;
}
0 голосов
/ 18 февраля 2014

В моем приложении для обработки камеры я использую это:

    public void onResume() {
    super.onResume();
if(mCamera == null)
    mCamera = getCameraInstance():
}


public static Camera getCameraInstance() {
 mCamera = null;
    try {
        mCamera = Camera.open();
Parameters parameters = mCamera.getParameters();
    mCamera.cancelAutoFocus();
    mCamera.setPreviewCallback(yourPreviewCb);
    mCamera.startPreview();
    mCamera.setParameters(parameters);

    mCamera.autoFocus(yourAutoFocusCB);
    } catch (Exception e) {
        //TODO
    }
    return mCamera;
}

mCamera = null в getCameraInstance () просто для того, чтобы убедиться, что камера вообще не работает.

Я думаю, вам нужно воссоздать полную камеру, а не просто открыть ее с помощью

camera.open();

Установите это в onResume или в обратном вызове с ошибкой, в зависимости от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...