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, то же самое).

Кто-нибудь знает эту проблему? Я просто не вижу, где сейчас разница в эмуляторе. Я ценю вашу помощь.

Я, наконец, пошел и отладил проблему. Внезапно это сработало, потому что отладка намного медленнее: это проблема времени. Обратный вызов требует некоторого времени для вызова. В то время как отладка телефона имела достаточно времени, чтобы закончить съемку …

Также не переходите к вызову Camera.stopPreview () и Camera.release () слишком рано.

У меня была эта точная проблема. После большой отладки я наконец понял, что глупый объект камеры собирал мусор, прежде чем у него появилась возможность вызвать обратные вызовы!

Я исправил его, создав жесткую ссылку на объект 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; } } 

В моем случае он не вызывал изображение на конкретном устройстве. Проблема была вызвана тем, что камера открывалась дважды на onResume () и oncreate ().

Intereting Posts
Как добавить кнопку Facebook Share в приложении для Android API-вызов для получения архитектуры процессора Уведомление об обновлении для нескольких сообщений ActionNext не работает с многострочным EditText в android Как получить аккумулятор, процессор, использование памяти с помощью appium Как использовать автономный пакет на android для реагирования на собственный проект? Почему моя кнопка не работает при первом нажатии? Как открыть проект Android Studio в Eclipse? При вызове php-файла с некоторым кодом js от android код js является результатом такого вызова Почему мой BroadcastReceive вызывает отказ READ_PRIVILEGED_PHONE_STATE на M? Открыть форум в Tapatalk через Intent Android camera2 обрабатывает каждый кадр и отображает его предварительный просмотр PhoneGap / Sencha Touch: проблема с отображением WebView на скрытии SoftKeyboard Как использовать акселерометр Android? RecyclerView аварийно завершает работу, когда «пересмотренные или присоединенные виды не могут быть переработаны»