2011-12-14 81 views
7

我刚刚意识到我的相机活动在一个水平方向上不适用于某些设备。一些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); 

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

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(); 
    }*/ 
+0

没有日志和控制台消息,你会得到,我不认为很多人都可以帮助你。 – 2012-01-05 22:21:47

回答

4

我删除onResume()逻辑,因为它重复你所拥有的surfaceChanged(),在调用onResume()时可能不安全,因为表面可能尚未准备好。

此外,你是盲目地要求FLASH_MODE_AUTO没有看到如果这是由设备支持。

那将是两个开始的地方。

+0

如何检查闪光模式自动。我认为这个调用自己做了检查,因为它是一个硬编码变量 – CQM 2011-12-15 00:06:56

4

首先一个问题,你的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给您作通知背面的摄像头实例这个事件和你可以根据错误文档做的事情是开始新鲜的,即重新初始化相机实例。

希望它有助于某种方式!

2

看看android的例子here

或导入在IDE android的例子。

希望这可以帮助