Невозможно подключить камеру с помощью Android Camera (1) API на Raspberry Pi под управлением AndroidThings - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь запустить свое стандартное приложение для Android со сканером QR-кода на Raspberry Pi под управлением Android Things версии 0.7 с подключенной Raspberry Pi Camera V2.

Приложение и QR-сканер отлично работают на большинстве телефонов Android (Lollipop +).

В Android Things я могу нормально загрузить приложение и войти в систему, но при открытии вкладки QR-сканера происходит сбой. Это странно, потому что камера обнаружена (Camera.getNumberOfCameras () = 1), и камера, кажется, имеет фронтальную ориентацию (cameraInfo.facing = 1), но когда я пытаюсь открыть камеру, я получаю RuntimeException: Ошибка подключения в сервис камеры (см. трассировку стека ниже). Обратите внимание, что я открываю камеру в фоновом потоке, используя Rx:

[C:CameraSource] [M:getIdForRequestedCamera] [L:836]: numberOfCameras = 1
[C:CameraSource] [M:getIdForRequestedCamera] [L:839]: id 0, cameraInfo.facing = 1
W/CameraBase: An error occurred while connecting to camera 0: Status(-8): '10: connectHelper:1399: Failed to initialize camera "0": No such device (-19)'
W/System.err: io.reactivex.exceptions.OnErrorNotImplementedException: Fail to connect to camera service
W/System.err:     at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
W/System.err:     at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
W/System.err:     at io.reactivex.internal.observers.ConsumerSingleObserver.onError(ConsumerSingleObserver.java:45)
W/System.err:     at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.onError(SingleSubscribeOn.java:73)
W/System.err:     at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:43)
W/System.err:     at io.reactivex.Single.subscribe(Single.java:2700)
W/System.err:     at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:452)
W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61)
W/System.err:     at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
W/System.err:     at java.lang.Thread.run(Thread.java:764)
W/System.err: Caused by: java.lang.RuntimeException: Fail to connect to camera service
W/System.err:     at android.hardware.Camera.<init>(Camera.java:519)
W/System.err:     at android.hardware.Camera.open(Camera.java:365)

Также обратите внимание, что я использую старый Android Camera (1) API.

Я столкнулся с сообщением об ошибке, когда кто-то пытался сделать то же самое, запустив приложение для Android с Camera (1) API на AndroidThings / Rpi. Они смогли подключиться к той же камере Raspberry Pi, но у них были некоторые проблемы с предварительным просмотром: https://issuetracker.google.com/issues/37130806 (Подробнее https://plus.google.com/u/0/+PeterMeijer1/posts/1SKZGiP9jLr и https://plus.google.com/+RonaldVanDerLingen/posts/TE4JtJbHWqF)

Поиграв с примером приложения Google Doorbell для AndroidThings, похоже, мне может понадобиться реализовать Camera2 API. Тем не менее, похоже, что некоторые добились успеха при использовании Camera (1) API.

Прежде всего, я хотел бы знать, почему камера обнаружена, но когда я пытаюсь открыть ее, я получаю «Нет такого устройства».

Вот код:

private static int getIdForRequestedCamera(int facing) {
    CameraInfo cameraInfo = new CameraInfo();
    for (int i = 0; i < Camera.getNumberOfCameras(); ++i) {
        Camera.getCameraInfo(i, cameraInfo);
        if (cameraInfo.facing == facing) {
            return i;
        }
    }
    return -1;
}

private Camera createCamera() {
        int requestedCameraId = getIdForRequestedCamera(mFacing);
        if (requestedCameraId == -1) {
            throw new RuntimeException("Could not find requested 
camera.");
            }
            Camera camera = Camera.open(requestedCameraId);
...
}
...