Intereting Posts

HasSystemFeature (PackageManager.FEATURE_CAMERA) возвращает true для устройства без камеры

У меня есть приложение, в котором используются функции камеры, но часть его функций также может работать без функции камеры. Я вложил это в свой манифест.

<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false"/> 

И в моем коде я проверяю, имеет ли устройство камеру или нет.

 final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); 

Теперь я тестирую свой код на планшете с Android 4.0 (ICS) и не имеет камеры. Но все-таки я получаю True значение для deviceHasCameraFlag . Это странно или я чего-то не хватает.

Я пробовал разные вещи и даже пробовал то же самое в функции Bluetooth, поскольку планшет даже не имеет функции Bluetooth. Он отлично работает для Bluetooth, но дает мне правду для камеры.

Solutions Collecting From Web of "HasSystemFeature (PackageManager.FEATURE_CAMERA) возвращает true для устройства без камеры"

Какое это устройство? Ответ, который вы получаете, является ошибкой, а 4.0 очень устарел в наши дни. Многие планшеты, которые все еще используют эту версию, были созданы неправильно, как аппаратное, так и программное обеспечение с множеством проблем.

Независимо от того, вы всегда должны быть готовы к сбою в Camera.open() или Camera.open(0) : например, в некоторых случаях другое программное обеспечение на вашем устройстве не будет изящно освобождать камеру.

Итак, в вашем случае у вас есть ложный позитив, вы пытаетесь открыть камеру, она терпит неудачу, и вы продолжаете, как будто на устройстве нет камеры, даже если PackageManager считает, что PackageManager.FEATURE_CAMERA доступен.

Несмотря на то, что я принял ответ Алекса, я все же хочу собрать это коллективно, что может быть лучшим решением в таком состоянии.

То, что я нашел, было в случае некоторых низкоуровневых устройств Android

 pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) 

Возвращает true, даже если камера не существует, и это кажется ошибкой устройства для меня, которая неконтролируема.

Поэтому всякий раз, когда есть сценарий, который вам нужен, чтобы проверить, существует ли камера для устройства или нет лучшей практики, это то, что я помещаю ниже (лучшая практика, согласно моим знаниям, если есть что-то более интересное и лучшее решение, которое вы можете положить Это здесь, на этом посту)

 int numberOfCameras = Camera.getNumberOfCameras(); context = this; PackageManager pm = context.getPackageManager(); final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); if( !deviceHasCameraFlag || numberOfCameras==0 ) { Log.e(TAG, "Device has no camera" + numberOfCameras); Toast.makeText(getApplicationContext(), "Device has no camera", Toast.LENGTH_SHORT).show(); captureButton.setEnabled(false); } else { Log.e(TAG, "Device has camera" + deviceHasCameraFlag + numberOfCameras); } 

В этом я проверяю как количество камер, так и устройство имеет функцию камеры Boolean, поэтому в любом случае это не подведет мое состояние.

В моем случае у меня был этот код:

 public boolean hasCameraSupport() { boolean hasSupport = false; if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { //<- this constant caused problems hasSupport = true; } return hasSupport; } 

И он продолжал возвращать false на устройстве Genymotion под управлением Android 4.1.1 (API 16). Как только я изменил константу PackageManager.FEATURE_CAMERA_ANY на PackageManager.FEATURE_CAMERA , мои проблемы исчезли. Я предполагаю, что не все уровни устройств / API поддерживают PackageManager.FEATURE_CAMERA_ANY .

Я получил его, вы попробуете это, определенно, это сработает …

  import android.hardware.Camera; int numCameras = Camera.getNumberOfCameras(); if (numCameras > 0) { System.out.println("camera"); } else { System.out.println("No Camera"); } 

Попробуйте этот код:

 private boolean isDeviceSupportCamera() { if (getApplicationContext().getPackageManager().hasSystemFeature( PackageManager.FEATURE_CAMERA)) { // this device has a camera return true; } else { // no camera on this device return false; } } 

Тем не менее это не работает, пожалуйста, дайте мне знать