【问题标题】:Android camera functions don't work on a few phonesAndroid相机功能在一些手机上不起作用
【发布时间】:2011-12-14 22:27:44
【问题描述】:

我刚刚意识到我在 Surfaceholder 中的相机活动在某些设备上不起作用。一些 DROID 品牌和皮肤手机。到目前为止,它适用于所有具有标准 android 实现的谷歌手机。

我有时间在 2.2 上调试设备(不知道这是什么型号的手机,但它被蒙皮了),我看到调试器说(ICamera failed)(Camera Error 100)

但我没有机会确切找出问题所在,但我确实看到其他人遇到过这个问题(关于在开始预览之前获取预览大小的问题??),但没有明显的响应或任何直观的东西到我所拥有的,但这是我的相机代码,什么能让这项工作更普遍?

   //this is in OnCreate
   preview = (SurfaceView) findViewById(R.id.cameraplacer);
    previewHolder = preview.getHolder();

    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

//这在生命周期方法之外

 SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
    public void surfaceCreated(SurfaceHolder holder) {
        if (camera == null) {
            camera = Camera.open();
            try {
                Camera.Parameters camParams = camera.getParameters();
                camParams.setFlashMode(Parameters.FLASH_MODE_AUTO);

                setDisplayOrientation(camera, 90);
                camera.setPreviewDisplay(previewHolder);
                camera.setParameters(camParams);

            } catch (IOException e) {
                camera.release();
                camera = null;
            }
        }


    }//end surfaceCreated

    public void surfaceChanged(SurfaceHolder holder,
            int format, int width,
            int height) {
        Camera.Parameters parameters=camera.getParameters();
        Camera.Size size=getBestPreviewSize(width, height,
                parameters);

        if (size!=null) {
            parameters.setPreviewSize(size.width, size.height);
            camera.setParameters(parameters);
            camera.startPreview();
            inPreview=true;
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (camera != null) {
            camera.stopPreview();
            camera.setPreviewCallback(null);
            camera.release();
            camera = null;
        }
    }
};//end CallBack

private Camera.Size getBestPreviewSize(int width, int height,
        Camera.Parameters parameters) {
    Camera.Size result=null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
        if (size.width<=width && size.height<=height) {
            if (result==null) {
                result=size;
            }
            else {
                int resultArea=result.width*result.height;
                int newArea=size.width*size.height;

                if (newArea>resultArea) {
                    result=size;
                }
            }
        }
    }

    return(result);
}//end getBestPreviewSize

//这是在 OnResume 上

     try {
        //Method rotateMethod = android.hardware.Camera.class.getMethod("setDisplayOrientation", int.class);
        //rotateMethod.invoke(camera, 90);
        //Camera.Parameters camParams = camera.getParameters();
        //camParams.setPreviewSize(480, 320);// here w h are reversed
        //camera.setParameters(camParams);*/
        //setCameraDisplayOrientation(MainPhoto.this, 0, camera);
        if(camera!=null)
        {
            Camera.Parameters camParams = camera.getParameters();
            camParams.setFlashMode(Parameters.FLASH_MODE_AUTO);
            camera.setParameters(camParams);
            setDisplayOrientation(camera, 90);
            camera.setPreviewDisplay(previewHolder);
            camera.startPreview();
        }


    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }/* catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }*/ catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }/* catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }*/

【问题讨论】:

  • 如果没有您收到的日志和控制台消息,我认为没有多少人可以帮助您。

标签: android camera android-2.2-froyo


【解决方案1】:

我会删除 onResume() 逻辑,因为它复制了您在 surfaceChanged() 中的内容,并且在调用 onResume() 时执行该工作可能不安全,因为表面可能还没有准备好了。

此外,您在没有查看设备是否支持的情况下盲目地请求FLASH_MODE_AUTO

这将是两个开始的地方。

【讨论】:

  • 如何检查自动闪光模式。我认为该调用自己进行了检查,因为它是一个硬编码变量
  • @CQM:致电getSupportedFlashModes(),看看它是否在列表中。如果您请求不受支持的模式,我不知道会发生什么。
  • 谢谢!我从中得到了一个条件陈述。 onResume 消失了,并且有条件地检查了闪光灯模式。这仍然没有显示 2.2 设备上的相机的任何内容。我现在只是将最小 sdk 提高到 10,所以至少所有可以安装它的用户都会获得正确的体验
  • 将其降回 2.2 ......仍然没有解决方案。并非所有 2.2 设备都有问题
【解决方案2】:

首先是一个问题,你的 onPause 方法在哪里,我假设你正在释放与相机相关的所有资源,因为你不能阻止它直到你的应用暂停。

其次,有变量来跟踪表面状态是否被破坏,基于你必须决定在 onResume 中做什么。 类似这样的事情

if (hasSurface) {
            // The activity was paused but not stopped, so the surface still
            // exists. Therefore
            // surfaceCreated() won't be called, so init the camera here.
            initCamera(surfaceHolder);
        } else {
            surfaceHolder.addCallback(this);
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        }

您得到的错误 100 实际上是相机指示本机相机应用程序以某种方式崩溃,如果您已将 errorCallback 设置为相机实例,您将收到有关此事件的通知以及您可以根据错误执行的操作文档重新开始,即重新初始化相机实例。

希望能有所帮助!

【讨论】:

    【解决方案3】:

    看看android例子here

    或在您的 IDE 中导入 android 示例。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-09
      • 2017-09-22
      • 1970-01-01
      • 2015-05-26
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多