Перевірте, чи пристрій має камеру?


80

У своєму додатку я хотів би використовувати камеру, якщо вона є у пристрої. Чи є на Android пристрої, на яких немає камери? Додавши до мого маніфесту наступне:

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

тоді в основному говориться: "Я буду використовувати камеру, якщо вона існує, але не потрібна для запуску програми".

Як я можу перевірити, чи існує камера на пристрої, перед спробою використовувати клас Камера?


1
Я вважаю (але я не впевнений на 100%), що всі попередні та теперішні версії Документу визначення сумісності Android визначають камеру з деякою мінімальною роздільною здатністю. Відповідність CDD є необхідною умовою ліцензованого доступу до Android Market та власних програм Google. Є пристрої Android, які цього не роблять (наприклад, колір Nook).
— ефемієнт

2
На сьогоднішній день поточна версія документа (4.2) визначає "Реалізації пристрою ПОВИННІ включати задню камеру, а МОЖЕ включати фронтальну камеру". Зверніть увагу, що в ньому не використовується ключове слово "ПОВИННО".
— Метью Блекфорд,

Додамо лише, що є також пристрої, які мають лише фронтальну камеру.
— Берга

Чи є сенс додавати це до маніфесту, якщо там сказано, що додаток повинен працювати з камерою та без неї? Чи впливає це, можливо, на додаток у Play Store?
— розробник android

Відповіді:


-44

Я не пробував, але:

private android.hardware.Camera mCameraDevice;

try {
  mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
  Log.e(TAG, "fail to connect Camera", e);
  // Throw exception
}

Може бути те, що вам потрібно.


І не забудьте звільнити об’єкт Camera!
— opedog

11
Правильний спосіб перевірити, чи має пристрій камеру, див. Відповідь dpjanes нижче.
— Zack Marrapese

22
Поганий підхід. Дорогий дзвінок. Якщо ту саму камеру відкривають інші програми, це викличе RuntimeException. Не відповідає призначенню.
— Нуль покажчика

5
Ця відповідь стала настільки відомою! :) meta.stackoverflow.com/a/316273/651647
— Фаршид Закер

Ця реалізація на Android 6.0 (рівень API 23) + викличе SecurityException, якщо ви не вимагали спеціально дозвіл "android.permission.CAMERA" під час виконання.
— Matt G

224

Це те, що я використовую

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
}

Також доступні всілякі інші цікаві речі для тестування - компас, доступне розташування, чи є фронтальна камера: http://developer.android.com/reference/android/content/pm/PackageManager.html


4
так швидке запитання. це може бути німо, але я новачок в android / java, звідки ти отримуєш контекст ???? спасибі
— grobartn

3
@grobartn:public class YourActivity extends Activity { Context contextActivity; PackageManager pm; @Override public void onCreate(Bundle savedInstanceState) { ... contextActivity = this; pm = contextActivity.getPackageManager(); ...
— Клофі

14
Починаючи з 9 рівня API, ви можете перевірити наявність FEATURE_CAMERA_FRONT, крім FEATURE_CAMERA. Наприклад, Nexus 7 (який має лише одну фронтальну камеру) повертає значення false у FEATURE_CAMERA.
— Хорхе Чеваллос,

6
Для Kindle Fire HD 7 "(Android 4.0.3) я виявив, що він повідомляє FEATURE_CAMERA, хоча у нього є лише фронтальна камера! Жахливо ... як обхідний шлях я також перевіряю (FEATURE_CAMERA_FRONT і Camera.getNumberOfCameras () == 1 ) тоді я знаю, що задньої камери немає.
— CSmith

6
Після рівня API 17 ви можете використовувати PackageManager.FEATURE_CAMERA_ANY
— XY

42

Щоб дізнатись, скільки камер доступно на вашому пристрої, ви можете зателефонувати:

import android.hardware.Camera;

int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
  hasCamera = true;
}

Camera.getNumberOfCameras () є статичним, тому не вимагає фактичного підключення до камери. Це працює з API 9.

Редагувати:

За допомогою новішого API camera2 ви також можете зателефонувати CameraManager.getCameraIdList () , який надає список усіх дійсних ідентифікаторів камери, а не лише кількість.


2
це працювало для мене, і FEATURE_CAMERA не працював в API 19
— sobelito

Версія в один рядок: boolean hasCam = android.hardware.Camera.getNumberOfCameras ()> 0;
— J.Jacobs-VP

Ця відповідь є кращою. hasSystemFeature (PackageManager.FEATURE_CAMERA) повертає false на Kit-Kat (Nexus 7)
— Кирило Кармазін

1
Повертає значення false для Nexus 7 (2013), оскільки FEATURE_CAMERA стосується лише камер, що мають зворотну сторону (через зворотну сумісність); FEATURE_CAMERA_ANY - це функція, яка відповідає дійсності, якщо на пристрої є хоча б одна камера будь-якого роду.
— Едді Талвала,

Чому android.hardware.Cameraзастаріло? Що слід використовувати замість цієї функції? Я знаю, що зараз у нас є android.hardware.camera2, але де ми можемо знайти альтернативу getNumberOfCamerasтам?
— розробник android

12

ви повинні використовувати це, щоб знайти камеру у своєму пристрої

public static boolean isCameraAvailable(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}

1
Я думаю, що це найкорисніший. FEATURE_CAMERA_ANY - хороший вибір. Ось коротша версія коду для тих, хто віддає йому перевагу. public static boolean isCameraAvailable(Context context) { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) }
— miva2

6

Camera.getNumberOfCameras () застаріла. Ви можете використовувати:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public int getNumberOfCameras() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        try {
            return ((CameraManager) getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length;
        } catch (CameraAccessException e) {
            Log.e("", "", e);
        }
    }
    return Camera.getNumberOfCameras();
}



3

наступним чином ми можемо перевірити, чи має пристрій камеру чи ні.

/** Check if this device has a camera */
    public static boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA)) 
        {
            return true;
        }
        else if(context.getPackageManager().hasSystemFeature(
                PackageManager.FEATURE_CAMERA_FRONT))
        {
            return true;
        }
        else {
            return false;
        }
    }

1

Якщо ви використовуєте Android 2.3, є кілька API, за допомогою яких ви можете перевірити стан камери, наприклад кількість камер (спереду та ззаду)


1

спробуйте це

Для передньої камери

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has Front Camera ?", "NO");
          }

для задньої камери

    Context context = this;
    PackageManager packageManager = context.getPackageManager();
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {

        Utils.makeAlertDialog(context, "Has back Camera ?", "YES");

    } else {

        Utils.makeAlertDialog(context, "Has back Camera ?", "NO");
          }


0

Відповідно до документації , вам потрібно скористатися диспетчером пакетів, щоб перевірити, чи доступна камера на пристрої чи ні

На Java:

final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);

У Котліні:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

0

Я знайшов в телевізійних скриньках для android, де ви можете підключати і відтворювати usb-камеру кілька разів. У якийсь момент часу служба камер починає говорити, що виявила одну камеру в системі, коли до системи не підключена жодна камера. Це трапляється, коли кілька разів підключити / вимкнути камеру. Щоб виправити це, я виявив, що це рішення працює:

//under oncreate:
//cameraManager = ((CameraManager) getSystemService(Context.CAMERA_SERVICE)); 

public int getNumberOfCameras() {
        int count_ = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                count_ = cameraManager.getCameraIdList().length;

                if(count_==1)
                {
                    try {
                        cameraManager.getCameraCharacteristics(cameraManager.getCameraIdList()[0]);
                    }catch (Exception e)
                    {
                        count_ = 0;
                    }
                }

            } catch (Exception e) {
               //e.printStackTrace();
            }
        }
        else {
            count_ = Camera.getNumberOfCameras();
        }

        return count_;
    }

0

Рішення в один рядок:

public static boolean hasCamera(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

Помістіть цей метод у свій клас проекту Utils.java.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.