Камера Android заблокирована после закрытия силы
У меня есть приложение, в котором я использую камеры устройств.
Теперь я освобождаю камеру только в нормальном режиме.
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(camera != null) {
camera.stopPreview();
camera.release();
}
}
Таким образом, приложение неожиданно завершает работу в режиме камеры, т.е. Force Close (из-за OutOfMemoryError
) - камера блокируется. И единственный способ его освободить - перезапустить устройство.
И после запуска приложения я получаю:
RuntimeException: Fail to connect to camera service
Как я могу убедиться, что камера выпущена в любом случае?
Ответы
Ответ 1
Так как лучший способ сохранить часть кода так, чтобы вы его нашли позже, это опубликовать его в 'net,
private UnexpectedTerminationHelper mUnexpectedTerminationHelper = new UnexpectedTerminationHelper();
private class UnexpectedTerminationHelper {
private Thread mThread;
private Thread.UncaughtExceptionHandler mOldUncaughtExceptionHandler = null;
private Thread.UncaughtExceptionHandler mUncaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) { // gets called on the same (main) thread
XXXX.closeCamera(); // TODO: write appropriate code here
if(mOldUncaughtExceptionHandler != null) {
// it displays the "force close" dialog
mOldUncaughtExceptionHandler.uncaughtException(thread, ex);
}
}
};
void init() {
mThread = Thread.currentThread();
mOldUncaughtExceptionHandler = mThread.getUncaughtExceptionHandler();
mThread.setUncaughtExceptionHandler(mUncaughtExceptionHandler);
}
void fini() {
mThread.setUncaughtExceptionHandler(mOldUncaughtExceptionHandler);
mOldUncaughtExceptionHandler = null;
mThread = null;
}
}
и в соответствующих местах основного потока:
mUnexpectedTerminationHelper.init();
и
mUnexpectedTerminationHelper.fini();
Ответ 2
Как предложили @CommonsWare, если вы хотите убедиться, что ваше приложение освобождает камеру перед сбоем, вы должны использовать Thread.setDefaultUncaughtExceptionHandler()
.
Или, если вы используете Bugsense:
private class MyCameraActivity extends Activity implements SurfaceHolder.Callback, ExceptionCallback {
@Override
protected void onCreate(Bundle sSavedInstanceState) {
super.onCreate(sSavedInstanceState);
BugSenseHandler.setExceptionCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
this.camera = open();
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
// other camera stuff
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
releaseCamera();
}
@Override
public void lastBreath() {
releaseCamera();
}
private void releaseCamera() {
if (camera != null) {
camera.stopPreview();
camera.release();
}
}
}
Ответ 3
Ошибка из памяти возникает из-за того, что изображение, которое вы пытались сохранить, превысило лимит, обычно приходит, когда вы пытаетесь обработать растровое изображение.
Вы можете попробовать эти методы, чтобы избежать освобождения камеры.
Камера myCamera;
Используйте журналы и пальцы, где возникает ошибка, и
Добавьте блок catch try и в блок catch добавьте myCamera.stopPreview();
и myCamera.release();
Также переопределите метод ondestroy и onpause и add myCamera.stopPreview();
и myCamera.release();
Надеюсь, это поможет вам или, по крайней мере, дать вам представление.
Ответ 4
private void stopPreviewAndFreeCamera() {
if (mCamera != null) {
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview();
/*
Important: Call release() to release the camera for use by other applications.
Applications should release the camera immediately in onPause() (and re-open() it in
onResume()).
*/
mCamera.release();
mCamera = null;
}}
сделайте это так.