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 surfaceview 怎么用

android videoview和surfaceview的区别

在视图动画时调用 setVisibility

android videoview和surfaceview的区别

SetVisible(false) 更改面板中组件的布局