Камера Android не будет делать снимок в зависимости от того, что в коде - PullRequest
1 голос
/ 19 марта 2012

У меня есть следующий код, с помощью которого я пытаюсь сделать снимок и сохранить часть информации о снимке в базе данных. Часть базы данных была тщательно протестирована и отлично работает при любых других обстоятельствах. К сожалению, если я раскомментирую приведенный ниже код, мой код истечет. По какой-то причине, если есть код, следующий за методом this.camera.takePicture(), takePicture() вообще не будет вызывать переопределенный метод onPictureTaken (первое, что он должен сделать, это вывести строку текста, но это не так) даже не делай этого). Если за ним нет кода, он работает нормально.

Перед установкой защелки я получил бы ошибку, потому что ph.getPhoto() возвращал null (переменная-член ph's .photo еще не была установлена ​​в onPictureTaken(), потому что она еще не была вызвана). После установки фиксатора он будет ждать до истечения времени ожидания (или вечно, если значение времени ожидания не указано).

Может кто-нибудь сказать, что мне не хватает?

    public void takePicture(View view) throws Exception {
        CountDownLatch latch = new CountDownLatch(1);
        System.out.println("Taking Photo!");
        PhotoHandler photoHandler = new PhotoHandler(getApplicationContext(),latch);
        this.camera.takePicture(null, null, photoHandler);

    /* PhotoHandler has an overridden "onPictureTaken()" method which releases the latch as its final
     * action; however, its first instruction is to print a confirmation that it has been accessed.
     * Unfortunately, for some reason, onPictureTaken() is not called if the following code is
     * uncommented; it deadlocks for the five seconds before timing out. However, with out the following,
     * the camera.takePicture method invokes onPictureTaken() and it works just fine. */


//      latch.await(5,TimeUnit.SECONDS);
//      DatabaseHandler db = new DatabaseHandler(this);
//      Photo p = photoHandler.getPhoto();
//      db.addPhoto(p);
//      List<Photo> photos = new ArrayList<Photo>();
//      photos.add(p);
//      this.addPhotosToMap(photos);
}

Ответы [ 2 ]

1 голос
/ 19 марта 2012

onPictureTaken() (afaik) выполняется в основном потоке / пользовательском интерфейсе. Если ваш метод takePicture также находится там, то это должно произойти просто потому, что поток не может ждать самого себя.

Кроме того, вы не должны блокировать основную ветку, иначе ваша активность будет ANR.

Если вы переместите закомментированный код (без этой защелки) в onPictureTaken(), тогда все должно быть в порядке. Эти onSomethingHappened обратные вызовы сделаны именно для этой задачи

0 голосов
/ 19 марта 2012

Поместите всю вашу пост-обработку (т. Е. Код, который вы закомментировали) в соответствующий обратный вызов, а не после takePicture.И помещайте медленные действия, такие как доступ к файловой системе, в фоновый поток (например, AsyncTask).

...