I have a camera application that works on most phones, but today I got an error from a user. The error says that the application crashes on Camera.setParameters() I read https://stackoverflow.com/a/412630/ ... about this topic, but it already has the same solution.
Here is the code I'm using:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { camera.setDisplayOrientation(90); Camera.Parameters parameters = camera.getParameters(); Camera.Size size = getBestPreviewSize(w, h); parameters.setPreviewSize(size.width, size.height); // preview size camera.setParameters(parameters); camera.startPreview(); Camera.Parameters parameters = camera.getParameters(); List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); // You need to choose the most appropriate previewSize for your app Camera.Size previewSize = // .... select one of previewSizes here } private Camera.Size getBestPreviewSize(int width, int height) { // Get For Photo Size Camera.Parameters camparams = camera.getParameters(); // Find the Best Preview Size List<Size> sizes = camparams.getSupportedPreviewSizes(); Camera.Size result=null; int finalHeight = 0; for (Size s : sizes) { if (s.width <= width && s.height <= height) { if (result == null) { result = s; finalHeight = s.height; } else { int resultArea=result.width*result.height; int newArea=s.width*s.height; if (newArea>resultArea) { result=s; finalHeight = s.height; } } } } // Just in case... if (result == null) { finalHeight = height; } result.width = (int)(finalHeight*cameraRatio); return result; }
My thought is to put a try / catch around camera.setParameter(size.width, size.height) , but I don't know if this will keep it from crashing on crash?
Here is the crash log that was sent to me on developer.android.com:
java.lang.RuntimeException: setParameters failed to execute android.hardware.Camera.native_setParameters (native method) in android.hardware.Camera.setParameters (Camera.java:953) in net.feltpad.mosaic.Preview.surfaceChanged (CameraPreview.java : 145) in android.view.SurfaceView.updateWindow (SurfaceView.javaβ 577) in android.view.SurfaceView.dispatchDraw (SurfaceView.javahaps48) in android.view.ViewGroup.drawChild (ViewGroup.java:1730) in android .view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.ViewGroup.drawChild (ViewGroup.java:1730) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.ViewGroup. drawChild (ViewGroup.java:1730) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.View.draw (View.java:6988) at android.widget.FrameLayout.draw (FrameLayout.java : 357) in android.view.ViewGroup.drawChild (ViewGroup.java:1732) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.Vi ewGroup.drawChild (ViewGroup.java:1730) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.ViewGroup.drawChild (ViewGroup.java:1730) in android.view.ViewGroup.dispatchDraw (ViewGroup .java: 1459) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.ViewGroup.java:1459 in android.view.ViewGroup.drawChild (ViewGroup.java:1730) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.View.draw (View.java:6988) at android.widget.FrameLayout.draw (FrameLayout.javahaps57) in android.view. ViewGroup.drawChild (ViewGroup.java:1732) in android.view.ViewGroup.dispatchDraw (ViewGroup.java:1459) in android.view.View.draw (View.java:6988) at android.widget.FrameLayout.draw (FrameLayout .java: 357) in com.android.internal.policy.impl.PhoneWindow $ DecorView.draw (PhoneWindow.java:1961) on android.view.ViewRoot.draw (ViewRoot.java:1602) in android.view.ViewRoot. performTraversals (ViewRoot.java:1323) at android.view.ViewRoot.handleMe ssage (ViewRoot.java:1961) at android.os.Handler.dispatchMessage (Handler.java:99) at android.os.Looper.loop (Looper.java:150) in android.app.ActivityThread.main (ActivityThread.java : 4333) on java.lang.reflect.Method.invokeNative (native method) in java.lang.reflect.Method.invoke (Method.java:507) in com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit .java: 839) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java//97) at dalvik.system.NativeStart.main (native method)
source share