SurfaceView setVisibility() 抛出 RuntimeException
Posted
技术标签:
【中文标题】SurfaceView setVisibility() 抛出 RuntimeException【英文标题】:SurfaceView setVisibility() throws RuntimeException 【发布时间】:2015-01-25 01:59:40 【问题描述】:我面临以下问题。我正在使用SurfaceView
显示相机预览,但是当我将表面视图设置为可见时,出现以下异常。
java.lang.RuntimeException: getParameters failed (empty parameters)
at android.hardware.Camera.native_getParameters(Native Method)
at android.hardware.Camera.getParameters(Camera.java:1460)
at com.the.package.activity.ShowPhotoActivity$2.surfaceChanged(ShowPhotoActivity.java:111)
at android.view.SurfaceView.updateWindow(SurfaceView.java:558)
at android.view.SurfaceView.setVisibility(SurfaceView.java:248)
显示照片活动:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
Camera.Parameters parameters = mCamera.getParameters(); // <-- line 101
Camera.Size size = getBestPreviewSize(width, height, parameters);
if (mInPreview)
mCamera.stopPreview();
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if (display.getRotation() == Surface.ROTATION_0)
mCamera.setDisplayOrientation(90);
parameters = mCamera.getParameters(); // <---- line 111
size = getBestPreviewSize(width, height, parameters);
if (display.getRotation() == Surface.ROTATION_270)
mCamera.setDisplayOrientation(180);
parameters = mCamera.getParameters();
size = getBestPreviewSize(width, height, parameters);
Camera.Size s = getBestResolution(parameters);
parameters.setPreviewSize(size.width, size.height);
parameters.setPictureSize(s.width, s.height);
mCamera.setParameters(parameters);
if (mInPreview)
mCamera.startPreview();
真的让我抓狂,为什么第 101 行处理没有问题而第 111 行抛出异常。这只发生在装有 Android 4.1.1 的设备 Sony st26i (Xperia J) 上。我没有注意到 Galaxy Nexus、Galaxy SIII 或 4.1.2 模拟器有任何问题。感谢您的每一个想法。
【问题讨论】:
看看这个:***.com/questions/14941625/… 谢谢,我已经试过了,但是不行。 您是否有权访问其中一台故障设备?或者至少有一些方法可以在发生故障时获取 logcat 输出? 我只发布了 logcat。我刚刚删除了一些函数调用。 【参考方案1】:这里已经回答了,检查接受的答案: Correct handling of exception: "getParameters failed (empty parameters)"
我的猜测是这里的 stopPreview 是有问题的,可能是从错误的线程调用的。在您调用 stopPreview 时检查您的日志,它可能会为您提供线索。
【讨论】:
这种方式调用stopPreview()是可以的,但是相机服务可能会异步执行这个请求。准备好在大多数无辜的相机调用中捕获 RuntimeException。但在这种特定情况下,没有理由再次调用 getParameters()。 setDisplayOrientation() 不会影响支持的预览尺寸。以上是关于SurfaceView setVisibility() 抛出 RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章
Android:为什么setVisibility(View.GONE);或setVisibility(View.INVISIBLE);不工作
android videoview和surfaceview的区别