Android 2.3.4 Crash on Camera.setParameters

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)

+4
source share
2 answers

This code assumes that you can simply set result.width to some dynamically calculated value. This will not work on all devices. result should be one of the values ​​returned by getSupportedPreviewSizes() for reliable operation on all devices, and in your case, this is not necessarily one of these values.

+1
source

You may have an extended class for CameraHost. Inside this class, you can override the adjustPreviewParameters functions that result in an incorrect size of the result. Below is my fix for camera preview:

 @Override public Parameters adjustPreviewParameters(Parameters parameters) { List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); Camera.Size cs = sizes.get(0); parameters.setPreviewSize(cs.width, cs.height); return super.adjustPreviewParameters(parameters); } 
0
source

Source: https://habr.com/ru/post/1442428/


All Articles