release()异常后调用的方法无法使用android camera恢复

在开发相机应用程序时,我遇到了一个例外,该例外仅在我切换到其他应用程序(onPause()对于我的应用程序)时发生。

01-15 17:22:15.017: E/AndroidRuntime(14336): FATAL EXCEPTION: main

01-15 17:22:15.017: E/AndroidRuntime(14336): java.lang.RuntimeException: Method called after release()

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.hardware.Camera.setPreviewDisplay(Native Method)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.hardware.Camera.setPreviewDisplay(Camera.java:357)

01-15 17:22:15.017: E/AndroidRuntime(14336): at com.sora.cbir.yuki.image.leaf.CameraPreview.surfaceCreated(CameraPreview.java:32)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.SurfaceView.updateWindow(SurfaceView.java:551)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:213)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.View.dispatchWindowVisibilityChanged(View.java:4075)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:742)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:742)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:742)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:742)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.ViewRoot.performTraversals(ViewRoot.java:858)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.view.ViewRoot.handleMessage(ViewRoot.java:1995)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.os.Handler.dispatchMessage(Handler.java:99)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.os.Looper.loop(Looper.java:150)

01-15 17:22:15.017: E/AndroidRuntime(14336): at android.app.ActivityThread.main(ActivityThread.java:4389)

01-15 17:22:15.017: E/AndroidRuntime(14336): at java.lang.reflect.Method.invokeNative(Native Method)

01-15 17:22:15.017: E/AndroidRuntime(14336): at java.lang.reflect.Method.invoke(Method.java:507)

01-15 17:22:15.017: E/AndroidRuntime(14336): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)

01-15 17:22:15.017: E/AndroidRuntime(14336): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)

01-15 17:22:15.017: E/AndroidRuntime(14336): at dalvik.system.NativeStart.main(Native Method)

我做了一些研究,发现我需要添加

mCamera.setPreviewCallback(null);

作为Android相机堆栈的解决方法

onPause()现在看起来像这样:

@Override

protected void onPause() {

super.onPause();

try

{

// release the camera immediately on pause event

//releaseCamera();

mCamera.stopPreview();

mCamera.setPreviewCallback(null);

mCamera.release();

mCamera = null;

}

catch(Exception e)

{

e.printStackTrace();

}

}

和我的onResume()

@Override

protected void onResume()

{

super.onResume();

try

{

mCamera.setPreviewCallback(null);

mCamera = getCameraInstance();

//mCamera.setPreviewCallback(null);

mPreview = new CameraPreview(Imageupload.this, mCamera);//set preview

preview.addView(mPreview);

} catch (Exception e){

Log.d(TAG, "Error starting camera preview: " + e.getMessage());

}

}

}

最后是我的getCameraInstance()方法:

public Camera getCameraInstance(){

Camera camera = null;

try {

camera = Camera.open(); // attempt to get a Camera instance

}

catch (Exception e){

// Camera is not available (in use or does not exist)

}

Camera.Parameters parameters = camera.getParameters();

//mPreviewSize = getBestPreviewSize(parameters, wt, ht);

//mPictureSize = getBestPictureSize(parameters, wt, ht);

//Shift W & H => if camera rotates 90 deg

mPreviewSize = getOptimalPreviewSize(parameters, wt, ht); //original => wt,ht

mPictureSize = getOptimalPictureSize(parameters, wt, ht); //original => wt,ht

Log.d("CAMERA", "SCREEN RESOLUTION H: "+ht);

Log.d("CAMERA", "SCREEN RESOLUTION W: "+wt);

Log.d("CAMERA", "PREVIEW RESOLUTION H: "+mPreviewSize.height);

Log.d("CAMERA", "PREVIEW RESOLUTION W: "+mPreviewSize.width);

Log.d("CAMERA", "PICTURE RESOLUTION H: "+mPictureSize.height);

Log.d("CAMERA", "PICTURE RESOLUTION W: "+mPictureSize.width);

//set preview size based on device screen

parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);

//set picture size based on device screen

parameters.setPictureSize(mPictureSize.width, mPictureSize.height);

//set output camera mode

parameters.setPictureFormat(PixelFormat.JPEG);

//set focous mode

parameters.setFocusMode(FOCUS_MODE_AUTO);

//set flash mode

parameters.setFlashMode("auto");

List<int[]> fps = parameters.getSupportedPreviewFpsRange();

//System.out.println("FPS size: " +fps.size());

//System.out.println("MAX FPS:"+(fps.get(fps.size()-1)[1])/1000);

//log min and max camera supported fps

Log.d("CAMERA", "CAMERA MAX FPS: "+(fps.get(fps.size()-1)[1])/1000);

Log.d("CAMERA", "CAMERA MIN FPS: "+(fps.get(fps.size()-1)[0])/1000);

if(camera_fps)

{

parameters.setPreviewFpsRange(fps.get(fps.size()-1)[1], fps.get(fps.size()-1)[1]);

}

//set camera parameters

camera.setParameters(parameters);

Toast.makeText(getApplicationContext(), "Your device are capable of previewing @" + fps.get(fps.size()-1)[1]/1000+"fps!",Toast.LENGTH_SHORT).show();

return camera; // returns null if camera is unavailable

}

有想法该怎么解决这个吗?

回答:

我有同样的问题。mCamera.setPreviewCallback(null);没有帮助。在我的活动中,我已将此添加到releaseCamera

mPreview.getHolder().removeCallback(mPreview);

现在就可以了。

以上是 release()异常后调用的方法无法使用android camera恢复 的全部内容, 来源链接: utcz.com/qa/422230.html

回到顶部