我開發一個應用程序,它獲取的圖像,每當服務器調用和圖像發送到服務器。這是我定義的CameraSurfaceView
類中的一些代碼。如何拍照編程
private SurfaceHolder holder;
private Camera camera;
private Bitmap osb;
public void takeImage(){
Camera camera = this.getCamera();
CameraSurfaceView.HandlePictureStorage c = this.new HandlePictureStorage();
camera.takePicture(null, null, c);
}
public byte[] getImage(String type) {
if (osb==null) {
System.err.println("Camera.getImage: osb NULL");
return null;
}
CompressFormat format = CompressFormat.JPEG;
if (type.equals("PNG")) {
format = CompressFormat.PNG;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
System.err.println("Camera.getImage: decoded");
osb.compress(format, 100, out);
System.err.println("Camera.getImage: compressed");
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
} finally {
//lock.unlock();
}
byte[] bytes = out.toByteArray();
return bytes;
}
public void saveImage(byte[] picture) {
System.err.println("saveImage");
osb = BitmapFactory.decodeByteArray(picture, 0, picture.length);
}
和內部類HandlePictureStorage
實現PictureCallBack
@Override
public void onPictureTaken(byte[] picture, Camera camera)
{
CameraSurfaceView.this.saveImage(picture);
}
當我打電話takeImage()
然後getImage()
從外功能,我期望上HandlePictureStorage
類的onPictureTaken(byte[] picture, Camera camera)
代碼將右後takeImage()
被執行以保存圖像和getImage()
之前,所以getImage()
有數據檢索。
不幸的是,當我在logcat中看到,getImage()
功能takeImage()
後onPictureTaken()
前右運行。因此,很明顯,takeImage
只能獲得空數據,因爲沒有照片被保存之前。 如果再次運行takeImage()
和getImage()
,功能getImage()
將返回先前拍攝的照片。
你說幫我這麼多。感謝康斯坦丁。我解決了這個問題,通過添加一個信號來檢查圖像是否保存,然後運行getImage()。 – user1033464
不要忘記接受解決方案%)不需要semafor,因爲您可以通過回調調用saveImage(),並且在需要UI操作時,可以使用runOnUiThread() –