Android相机功能在少数手机上无法使用

CQM*_*CQM 7 camera android android-2.2-froyo

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

我有一个简短的时刻在2.2上调试一个设备(不知道究竟是什么型号的手机,但它是皮肤的)我看到调试器说(ICamera失败)(相机错误100)

但我没有机会找到它出错的确切位置,但我确实看到其他人遇到过这个问题(关于在开始预览之前获取预览尺寸的事情),但没有明显的反应或任何直观的东西我有,但这是我的相机代码,什么会使这项工作更普遍?

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

    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Run Code Online (Sandbox Code Playgroud)

//这不在生命周期方法之内

 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
Run Code Online (Sandbox Code Playgroud)

//这是在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();
    }*/
Run Code Online (Sandbox Code Playgroud)

Com*_*are 4

我会删除onResume()逻辑,因为它重复了您在 中 所拥有的内容surfaceChanged(),并且在调用时完成该工作可能不安全onResume(),因为表面可能尚未准备好。

此外,您盲目地要求FLASH_MODE_AUTO而不查看设备是否支持。

这是两个可以开始的地方。