相机入睡后冻结 [英] Camera freezes after sleep

查看:90
本文介绍了相机入睡后冻结的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此方法从onResume()调用

This method is called from onResume()

 private void initCameraPreview() {
    mCamera = getCameraInstance();
    mSurfaceView = (SurfaceView) findViewById(R.id.camera_view);
    mCameraPreview = new CameraPreview(this, mCamera, mSurfaceView.getHolder());
}

private Camera getCameraInstance() {
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    } catch (Exception e) {
        // Camera is not available (in use or does not exist)
        e.printStackTrace();
    }
    return c; // returns null if camera is unavailable
}

这是我的onPause()

This is my onPause()

@Override
protected void onPause() {
    isPicTaken = false;

    mCameraPreview.surfaceDestroyed(null);

    Log.d("MainCameraActivity", "OnPause()");
    super.onPause();
}

这是CameraPreview

This is CameraPreview

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

private static String TAG = "Camera Preview class";
private SurfaceHolder mHolder;
private Camera mCamera;
private static boolean previewIsRunning;

public Camera getmCamera() {
    return mCamera;
}

public CameraPreview(Context context, Camera mCamera, SurfaceHolder holder) {
    super(context);

    mHolder = holder;
    this.mCamera = mCamera;

    if (mHolder != null) {
        mHolder.setKeepScreenOn(true);
        mHolder.setSizeFromLayout();
        mHolder.addCallback(this);
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    if (mCamera != null) {
        Camera.Parameters params = mCamera.getParameters();
        params.setFocusMode("continuous-picture");
        params.setRotation(90);

        mCamera.setParameters(params);

        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }

        mCamera.setDisplayOrientation(90);
        mCamera.startPreview();

        previewIsRunning = true;
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (mCamera != null) {
        myStopPreview();
        mCamera = null;
    }
    previewIsRunning = false;
}

public void myStartPreview() {
    if (!previewIsRunning) {
        try {
            mCamera = Camera.open();
            Camera.Parameters params = mCamera.getParameters();
            params.setFocusMode("continuous-picture");
            params.setRotation(90);

            mCamera.setParameters(params);
            mCamera.setPreviewDisplay(mHolder);
            mCamera.setDisplayOrientation(90);
            mCamera.startPreview();

            previewIsRunning = true;
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

public void myStopPreview() {
    if (previewIsRunning) {
        mHolder.removeCallback(this);

        mCamera.setPreviewCallback(null);

        mCamera.stopPreview();
        mCamera.release();

        previewIsRunning = false;
    }

}

}

如果我进入另一个活动,然后返回,最小化应用程序,然后再次打开,此代码将起作用,但是如果我让手机进入睡眠状态,然后醒来,则预览中的图片将冻结,并在调用takePicture后得到此信息

This code works if I go to another activity, and back, minimize application, and open it again, but if I make phone sleep, and then wake up, picture in preview freezes, and after calling for takePicture I get this

07-25 18:00:00.970  11395-11395/com.woxapp.pricehelper.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: takePicture failed
        at android.hardware.Camera.native_takePicture(Native Method)
        at android.hardware.Camera.takePicture(Camera.java:1100)
        at android.hardware.Camera.takePicture(Camera.java:1045)
        at com.woxapp.pricehelper.app.activities.MainCameraActivity.onTakePhotoButtonClicked(MainCameraActivity.java:683)
        at com.woxapp.pricehelper.app.views.MainCameraView$11.onClick(MainCameraView.java:545)
        at android.view.View.performClick(View.java:4240)
        at android.view.View$PerformClick.run(View.java:17721)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

我真的不知道如何实现,以及如何解决此问题,并在Nexus 4(Android 4.3)上进行了测试

I really don't know how it's possible, and how to solve this issue, testing on Nexus 4 (Android 4.3)

推荐答案

,因为无法调用mSurfaceView的oncreated和onchanged. 最简单的方法是将mSurfaceView设置为inpause和onresume中不可见和可见.在您的活动或片段中,添加以下代码:

because the mSurfaceView's oncreated and onchanged can not be call. the most simple way is just set mSurfaceView invisible and visible in the onpause and onresume. in your activity or fragment, add this code:

@Override
public void onResume() {
    super.onResume();
    mCamera = Camera.open(0);
    mSurfaceView.setVisibility(View.VISIBLE);// this can fix the freeze.
}
@Override
public void onPause() {
    super.onPause();
    mSurfaceView.setVisibility(View.GONE);//this to fix freeze.
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }
}

这篇关于相机入睡后冻结的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆