У меня есть приложение, которое требует камеру для работы, и недавно я столкнулся с проблемой на устройствах 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 возвращает пустой массив.