[英]Android 2.3.4 Crashes on Camera.setParameters
我有一個適用於大多數手機的相機應用程序,但我今天收到了用戶的錯誤。 錯誤說應用程序在Camera.setParameters()
上崩潰我已經閱讀了關於該主題的StackOverflow帖子 ,但是已經實現了相同的解決方案。
這是我正在使用的代碼:
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;
}
我的想法是在camera.setParameter(size.width, size.height)
周圍放置一個try / catch
但我不知道是否會在失敗時使其崩潰?
以下是在developer.android.com上發送給我的崩潰日志:
java.lang.RuntimeException:set.ramerameters在android.hardware.Camera.setParameters(Native Method)的android.hardware.Camera.setParameters(Camera.java:953)net.feltpad.mosaic.Preview.surfaceChanged(CameraPreview.java: 145)在android.view.SurfaceView.updateWindow(SurfaceView.java:557)的android.view.SurfaceView.dispatchDraw(SurfaceView.java:348)android.view.ViewGroup.drawChild(ViewGroup.java:1730)。在Android.view.ViewGroup.drawChild的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.drawChild(ViewGroup.java:1730)上查看.ViewGroup.dispatchDraw(ViewGroup.java:1459) (ViewGroup.java:1730)android.view.frameLayout.draw(FrameLayout.java)在android.view.View.draw.draw(View.java:6988)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 357)在android.view.ViewGroup.DavatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.GoChild(ViewGroup.java:1759)上的android.view.ViewGroup.drawChild(ViewGroup.java:1732)。 在Android.view.ViewGroup.drawChild的android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)的android.view.ViewGroup.drawChild(ViewGroup.java:1730)上查看.ViewGroup.dispatchDraw(ViewGroup.java:1459) (ViewGroup.java:1730)位於android.view.ViewGroup.DispatchDraw上的android.view.ViewGroup.DispatchDraw(ViewGroup.java:1459)上的android.view.ViewGroup.DavatchDraw(ViewGroup.java:1730) 1459)在android.view.View.View.draw(View.java:6988)的android.widget.FrameLayout.draw(FrameLayout.java:357)android.view.ViewGroup.drawChild(ViewGroup.java:1732)。在.android.internal.policy的android.widget.FrameLayout.draw(FrameLayout.java:357)的android.view.View.draw(View.java:6988)上的view.ViewGroup.dispatchDraw(ViewGroup.java:1459) .impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:1961)在Android.view上的android.view.ViewRoot.performTraversals(ViewRoot.java:1323)的android.view.ViewRoot.draw(ViewRoot.java:1602)。在android.os.Handler.dispa上的ViewRoot.handleMessage(ViewRoot.java:1961) tchMessage(Handler.java:99)位於android.app.Looper.loop(Looper.java:150)的android.app.ActivityThread.main(ActivityThread.java:4333),位於java.lang.reflect.Method.invokeNative(Native)方法)在com.android.internal.os.ZygoteInit的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)的java.lang.reflect.Method.invoke(Method.java:507)上.main(ZygoteInit.java:597)at dalvik.system.NativeStart.main(Native Method)
此代碼假定您可以將result.width
設置為某個動態計算值。 這不適用於所有設備。 result
必須是getSupportedPreviewSizes()
返回的值之一才能在所有設備上可靠地工作,在您的情況下,它不一定是其中一個值。
您可以擁有CameraHost的擴展類。 在此類中,您可以覆蓋adjustPreviewParameters函數,這會導致錯誤的結果大小。 以下是我對相機預覽的修復:
@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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.