У меня похожая проблема с обратным вызовом JPEG. Это не всегда вызывали после съемки.
Это может быть потому, что вы отпускаете камеру слишком рано.
Вам следует подождать, пока все ваши обратные вызовы не будут возвращены, прежде чем отпустить камеру или выйти из приложения.
Класс Camera не является потокобезопасным. Обратные вызовы будут вызываться в потоке событий, из которого open(int)
был вызван. (см. документ )
Мне удавалось чаще вызывать его, снижая качество JPEG с помощью функции setJpegQuality()
, чтобы получать меньше данных для вычислений. Но лучше всего подождать, пока обратные вызовы не будут возвращены.
Согласно документации по коду Android , вам также необходимо передать 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();