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


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.