我这里有一段简单的代码,但由于某种原因它不存储数据。我确定这是愚蠢的,但我似乎无法弄明白。任何帮助将不胜感激。
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" />
答案 0 :(得分: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)中。在早期版本中,您应该使用特定于供应商的技术。看看this working solution对于Galaxy S:
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
参数。
答案 1 :(得分: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();