Проверьте, есть ли у устройства камера?

В моем приложении я хотел бы использовать камеру, если на ней есть одна. Существуют ли какие-либо устройства, на которых работает андроид, у которых нет камеры? Включив в свой манифест следующее:

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

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

Как я могу проверить, существует ли камера на устройстве, прежде чем пытаться использовать класс Camera?

Ответ 1

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

private android.hardware.Camera mCameraDevice;

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

Может быть, что вам нужно.

Ответ 2

Это то, что я использую

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

Ответ 3

Чтобы узнать, сколько камер доступно на вашем устройстве, вы можете позвонить:

import android.hardware.Camera;

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

Camera.getNumberOfCameras() является статическим, поэтому он не требует фактического подключения к камере. Это работает с API 9.

Edit:

С помощью нового API камеры2 вы также можете вызвать CameraManager.getCameraIdList(), в котором приводится список всех допустимых идентификаторов камеры, а не просто счет.

Ответ 4

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

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

Ответ 5

Используйте метод PackageManager.hasSystemFeature() для проверки камеры:

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

Источник: https://developer.android.com/guide/topics/media/camera.html#custom-camera

Ответ 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();
}

Ответ 7

Попробуйте следующее:

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

from: http://developer.android.com/guide/topics/media/camera.html

Ответ 8

следующим образом мы можем проверить, есть ли у устройства камера или нет.

/** 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;
        }
    }

Ответ 9

Если вы используете Android 2.3, есть некоторые API-интерфейсы, которые вы можете проверить на состояние вашей камеры, например, количество камер (спереди и сзади)

Ответ 10

попробуйте это

Для передней камеры

    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");
          }

Ответ 11

Согласно документации, вы должны использовать диспетчер пакетов, чтобы проверить, доступна ли камера на устройстве или нет

В Java:

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

В Котлине:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

Ответ 12

Я нашел в коробках Android TV, где вы можете подключить и играть в 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_;
    }

Ответ 13

Решение в одну строку:

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

Поместите этот метод в свой класс проекта Utils.java.

Ответ 14

Согласно документации Android:

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

Подробнее об API камеры:
https://developer.android.com/guide/topics/media/camera.html#detect-camera