我认为我的问题在标题中得到了很好的描述。
基本上,我要做的是:
takeFocusedPhoto("a");
doSomethingElse();
takeFocusedPhoto("b");
doSomethingElse();
takeFocusedPhoto("c");
doSomethingElse();
takeFocusedPhoto("d");
但是我的代码只设法保存最后一个(d.jpg)。
doSomethingElse()实际上是一个旋转我的手机所在平台的功能(我想拍摄房间内每一面墙的照片。
有没有一种简单的方法可以解决这个问题?我会感激任何帮助或建议。
代码:
/** Takes photo with default settings */
public void takePhoto(){
camera.startPreview();
camera.takePicture(null, rawCallback, jpegCallback);
camera.stopPreview();
}
/** Takes photo using Auto Focus function */
public void takeFocusedPhoto(String name){
filename=name;
isAutoFocused=false;
camera.startPreview();
AutoFocusClbk afcb = new AutoFocusClbk();
camera.autoFocus(afcb);
if(isAutoFocused){
Log.d(TAG, "takeFocusedPhoto - AutoFocused");
}
else{
Log.d(TAG, "takeFocusedPhoto - NOT AutoFocused");
}
camera.takePicture(null, rawCallback, jpegCallback);
camera.stopPreview();
}
/** Releases the interface */
public void closeCamera(){
camera.release();
}
/** Shutter */
/*ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d(TAG, "onShutter'd");
}
};*/
/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken - RAW");
}
};
/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
//write the file to sdcard
outStream = new FileOutputStream(String.format("/sdcard/"+filename+".jpg"));
outStream.write(data);
outStream.close();
Log.d(TAG, "onPictureTaken - SUCCESS! - wrote bytes: " + data.length);
} catch (FileNotFoundException e) {
Log.d(TAG, "onPictureTaken - FAILURE - FileNotFound");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d(TAG, "onPictureTaken - JPEG");
}
};
/** AutoFocus Callback */
private class AutoFocusClbk implements Camera.AutoFocusCallback{
public void onAutoFocus(boolean success, Camera camera){
isAutoFocused = success;
Log.d(TAG, "onAutoFocus - AutoFocused: "+success);
}
};
}
答案 0 :(得分:2)
对takePicture的调用是异步的,这就是你传入回调的原因,当照片数据准备好时会触发回调。当你连续调用takeFocusedPhoto()时,所有这些都会在第一个takePicture之前被解雇。查看takeFocusedPhoto的方法体,您将类成员变量filename
设置为等于name参数。这意味着在jpegCallback被触发之前filename
被设置为a,b,c然后d,这意味着你将每张照片保存到d。您将需要一种更好的方法来获取jpegCallback中的文件名。
您可以通过将调用放在jpegCallback中的下一张照片中同步拍摄照片,并只记录您的位置。如果你不知道你将有多少张照片,你可以创建一个数组并使用随机字符串(我在mili中使用时间)在jpeg照片中按需创建文件名,并将文件名添加到数组中以供日后使用。