2014-07-25 5 views
0

후이 방법은카메라가 수면

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()는 onResume()에서 호출 정지입니다 이 코드는 다른 a로 이동하면 작동합니다. ctivity, 다시는, 응용 프로그램을 최소화하고, 다시 열,하지만 난 전화 잠을 확인한 다음 일어나 경우, 미리보기 정지에서 사진 및 takePicture 위해 호출 한 후 나는이

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)에서 테스트 할 수 있습니다.

답변

1

를 확인할 수 있기 때문에 mSurfaceView의 oncreated 및 호출 할 수 없다는 onChanged. 가장 간단한 방법은 mSurfaceView를 보이지 않게 설정하고 onpause 및 onresume에 표시하는 것입니다. 활동 또는 단편에 다음 코드를 추가하십시오 :

@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; 
    } 
} 
1

initCameraPreview()은 앱에서 mCamera을 획득해야한다고 가정합니다. 아마도 어딘가, 예. onStop()도 카메라를 놓으십시오 (또는 시스템이 자동으로 처리합니다). 그러나 휴대 전화를 잠자기 상태로 전환 한 다음 깨우면 현재 활동으로 onPause()onResume() 만 호출됩니다.

그렇다면 이미 카메라를 구입하려고 시도하지 말아야합니다. 쉬운 방법 중 하나는 mCamera.close()으로 전화 한 직후 mCamera = null;을 추가하는 것입니다. 그리고 그렇지 않은 경우 -이 작업을 onStop() 메서드에 추가하십시오.

그런 initCameraPreview()에 당신은 단순히

if (mCamera == null) { 
    mCamera = getCameraInstance(); 
}