Я пытаюсь запустить свое стандартное приложение для 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);
...
}