android.hardware.camera2 CameraManager возвращает пустой список камер - PullRequest
0 голосов
/ 10 января 2019

У меня есть приложение, которое требует камеру для работы, и недавно я столкнулся с проблемой на устройствах Android TV при подключении камеры USB (протестировано на Mi Box и Nvidia Shield). Метод getCameraIdList () CameraManager обычно возвращает пустой массив, хотя к Android TV подключена камера, но в некоторых странных случаях он возвращает массив идентификаторов камер. Подводя итог, он работает так:

  • Если камера была подключена к устройству во время работы приложения - CameraManager возвращает пустой массив
  • Если камера была подключена до запуска приложения - CameraManager перенастраивает действительный массив идентификаторов

Чтобы определить, что устройство камеры подключено, я использую BroadcastReceiver с действием SystemActions.USB_DEVICE_ATTACHED:

public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();

    if (action.equals(SystemActions.USB_DEVICE_ATTACHED)) {

        final UsbDevice connectedDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        Log.d(TAG, "USB device attached: " + (connectedDevice != null ? connectedDevice.toString() : ""));

        if (OsVersionInfo.hasLolliPop() && null != connectedDevice) {

            if (!UsbDeviceHelper.defineWhetherVideoDevice(connectedDevice)) {
                Log.d(TAG, "Attached non-camera device");
                return;
            }

            if (ConfigurationHelper.isAndroidTvMode(App.getAppContext()) && null != getVideo().getCameraManager()
                    && getVideo().getCameraApiVersion(false) == ICameraManager.CAMERA2_API_VERSION) {
                App.getHandler().postDelayed(() -> {
                    Log.d(TAG, "postponing update event");
                    App.getManagers().getHardware().getVideo().getCameraManager().updateCameraList();
                }, 500);
            }
        }
    } else if (action.equals(SystemActions.USB_DEVICE_DETACHED)) {

        onUsbDeviceDetached(intent);

    } else if (action.equals(SystemActions.VOLUME_CHANGED_ACTION)) {
        //   EventBus.getDefault().post(new EventOnVolumeLevelChanged());
    }
}

App.getManagers (). getHardware (). getVideo (). getCameraManager (). updateCameraList () Метод, где я обновляю cameraList моего приложения:

public void updateCameraList() {
        try {
            CameraManager cameraManager = (CameraManager) App.getAppContext().getSystemService(Context.CAMERA_SERVICE);
            mCameraList.setList(cameraManager.getCameraIdList());
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

И именно здесь CameraManager возвращает пустой массив.

1 Ответ

0 голосов
/ 08 февраля 2019

У меня такая же проблема: (

Сценарий: TVBox с веб-камерой. Если я начинаю с подключенной веб-камерой, она работает правильно, но в противном случае

class USBReceiver : BroadcastReceiver(), ILogger {

    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        d("USBReceiver: $action")

        when (action) {

            UsbManager.ACTION_USB_DEVICE_ATTACHED,
            UsbManager.ACTION_USB_DEVICE_DETACHED -> {

                val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
                device?.let {
                    getDetails(it)
                }

                checkUSBWebCam()
            }
        }

    }

    private fun getDetails(device: UsbDevice) {
        d("USB: Device -> Model: ${device.deviceName}")
        d("USB: Device -> ID: ${device.deviceId}")
        d("USB: Device -> Vendor: ${device.vendorId}")
    }

    private fun checkUSBWebCam() {

        GlobalScope.launch {

            val typesCamera = ToolsCamera().getCamerasSync()
            val hasCamera = typesCamera.hasCameras
            d("USB: Tiene camara: $hasCamera")

            RxBus.publish(WebcamEvent(hasCamera))
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...