PictureCallback.onPictureTaken никогда не вызывал
Я пишу приложение, которому нужны снимки, сделанные камерой. Проблема возникает, когда я пытаюсь взять фактическое изображение. Вот код, который беспокоит меня:
final ShutterCallback shutterCallback = new ShutterCallback() {
@Override
public void onShutter() {
Log.d(TAG, "onShutter");
}
};
final PictureCallback callback = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.d(TAG, "onPictureTaken - jpeg");
try {
//async task for storing the photo
new SavePhotoTask(CameraView.this.ctx, data).execute();
} catch (final SavePhotoException e) {
//some exceptionhandling
}
}
};
this.camera = Camera.open();
this.camera.setPreviewDisplay(surfaceHolder);
final Camera.Parameters parameters = findBestParameters(w, h);
this.camera.setParameters(parameters);
this.camera.startPreview();
Log.d(TAG, "takePicture now!");
this.camera.takePicture(shutterCallback, null, callback);
На эмуляторе это работает, но на моем телефоне (Motorola Defy - android 2.1).
Актуальная проблема: на телефоне обратного вызова изображения никогда не происходит. "onPictureTaken" никогда не звонит. Запуск Shuttercallback выполняется, а другой - нет (и я попытался использовать raw вместо jpeg, то же самое).
Кто-нибудь знает эту проблему? Я просто не вижу, где сейчас разница с эмулятором. Я ценю вашу помощь.
Ответы
Ответ 1
Наконец я пошел и отладил проблему. Внезапно это сработало, потому что отладка происходит гораздо медленнее: это проблема времени. Обратный вызов требует некоторого времени для вызова. Хотя для отладки телефона было достаточно времени, чтобы закончить съемку...
Также не переходите к вызову Camera.stopPreview() и Camera.release() слишком рано.
Ответ 2
У меня была эта точная проблема. После большой отладки я наконец понял, что глупый объект камеры собирал мусор, прежде чем у него появилась возможность вызвать обратные вызовы!
Я исправил его, создав жесткую ссылку на объект Camera, который я использовал. Я сделал его членом класса PictureTaker, установил его перед вызовом takePicture(), а затем обнулял его в обратном вызове jpeg после получения моих данных. Тогда я просто должен удостовериться, что мой объект PictureTaker не получит gc'd, что я делаю, сохраняя его в моем подклассе Application в течение всего процесса.
Это всегда работает на моем Droid RAZR:
public class PictureTaker implements Camera.PictureCallback
{
private Camera mCam;
private MyApp theApp;
public PictureTaker(MyApp app)
{
theApp = app;
}
public void takePicture()
{
try
{
mCam = Camera.open();
}
catch (Exception e)
{
System.out.println("Problem opening camera! " + e);
return;
}
if (mCam == null)
{
System.out.println("Camera is null!");
return;
}
try
{
SurfaceView view = MyApp.getPreviewSurface(); // my own fcn
mCam.setPreviewDisplay(view.getHolder());
mCam.startPreview();
mCam.takePicture(null, null, this);
}
catch (Exception e)
{
System.out.println("Problem taking picture: " + e);
}
}
public void onPictureTaken(byte[] data, Camera cam)
{
theApp.jpegPictureData(data); // also my own fcn
cam.stopPreview();
cam.release();
mCam = null;
}
}
Ответ 3
В моем случае он не вызывал изображение на конкретном устройстве. Проблема была вызвана тем, что камера открывалась дважды на onResume() и oncreate().