2011-03-16 45 views
1

我在这里有一段简单的代码,但由于某些原因,它不存储数据。我相信这是愚蠢的,但我似乎无法弄清楚。任何帮助将不胜感激。Android拍照并将其存储为字节数组

private byte[] picture; 

    public void takePicture(){ 
    Camera camera = Camera.open(); 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.set("camera-id",2); 
      camera.setParameters(parameters); 
    parameters.set("gps-timestamp", "1233744883"); 
    camera.setParameters(parameters); 
    Log.i("method", "in takePicture()"); 
    camera.takePicture(null, rawCallback, null); 
    camera.release(); 
} 

    PictureCallback rawCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
    // TODO Do something with the image RAW data. 
     Log.i("rawcallback", "in rawcallback"); 
     picture = data; 
    } 
}; 

当我运行代码时,登录回调没有被调用,也没有“图片”保存“数据”。有什么想法吗?我正在试图用前置摄像头拍摄一张照片,我是否可以为此需要一些特别的东西,而我并没有这样做?

我也有这些权限

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 

回答

2

Camera.takePicture()最后一个参数对应于JPEG回调。所以你应该在camera.setParameters()调用之前添加parameters.setPictureFormat(PixelFormat.JPEG);行。或者使用camera.takePicture(null, rawCallback, null);

您还应该确保你有以下行的AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 

从我的评论:

API访问置摄像头只出现在Android 2.3的字体( API版本9)。在早期版本中,您应该使用供应商特定的技术。看看银河S的this working solution

Camera.Parameters parameters = mCamera.getParameters(); 
parameters.set("camera-id", 2); 
parameters.setPreviewSize(640, 480); // or (800,480) this is supported front camera preview size @ Samsung Galaxy S 
mCamera.setParameters(parameters); 

我希望它会帮助你。如果不是,请尝试使用上面的参数setPreviewSize

+0

我把它改为camera.takePicture(NULL,rawCallback,NULL);但仍然没有运气。我确实有清单中的那些,我还评论说这是用于前置摄像头,如果这意味着我需要添加另一个使用功能/权限? – 4everAStudent 2011-03-16 22:28:12

+0

用于访问字体摄像头的[API](http://developer.android.com/sdk/api_diff/9/changes/android.hardware.Camera.html)仅出现在Android 2.3中。在早期版本中,您应该使用供应商特定的技术。看看[这个工作解决方案]为Galaxy S(http://stackoverflow.com/questions/4241292/how-to-use-front-facing-camera-on-samsung-galaxy-s/4252857#4252857)。我希望它能帮助你。如果不尝试玩'parameters.setPreviewSize' – Idolon 2011-03-16 22:40:54

1

我得到了类似的问题与JPEG回调。拍摄照片后并不总是被称为。 这可能是因为您过早释放相机。

在释放相机或退出应用程序之前,您应该等待所有回调函数返回。 Camera类不是线程安全的。回调将在事件线程open(int)被调用时调用。 (请参阅doc

我设法使用setJpegQuality()函数降低JPEG质量,以减少要计算的数据,从而更频繁地调用它。但更好的方法应该是等到回调被返回。

根据Android code documentation,您还需要将SurfaceHolder传递到相机并在拍摄照片之前开始预览。 为了我的目的,我想在用户屏幕上没有预览的情况下拍照。 我用了一个本地的SurfaceView,但你可以使用另一个。

我建议是这样的:

Camera.PictureCallback myPictureCallback_jpeg = new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] imageData, Camera c) { 
      //save your data 
     } 
    }; 

    SurfaceView mySurfaceView = new SurfaceView(this); 
    SurfaceHolder mySurfaceHolder = mySurfaceView.getHolder(); 
    Camera myCamera = Camera.open(); 

    try { 
     myCamera.setPreviewDisplay(mySurfaceHolder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Camera.Parameters p = myCamera.getParameters(); 
    p.setJpegQuality(70);//a value between 1 and 100 
    myCamera.setParameters(p); 
    myCamera.startPreview(); 
    myCamera.takePicture(null, null, null, myPictureCallback_jpeg); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    myCamera.release(); 
相关问题