Я разрабатываю приложение, которое получает изображение при каждом вызове сервера и отправляет это изображение на сервер. Вот некоторый код в 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()
функцию из внешнего, я ожидал, что код onPictureTaken(byte[] picture, Camera camera)
класса HandlePictureStorage
будет выполнен сразу после takeImage()
для сохранения изображения и до getImage()
, так что getImage()
есть данные для извлечения.
К сожалению, когда я вижу в logcat, функция getImage()
запускается сразу после takeImage()
и до onPictureTaken()
. следовательно, очевидно, что takeImage
может получить только нулевые данные, поскольку ранее изображение не было сохранено.
если снова запустить takeImage()
и getImage()
, функция getImage()
вернет изображение предыдущего снимка.