Pregunta

En mi aplicación, me gustaría utilizar la cámara, si el dispositivo tiene una. ¿Hay alguna dispositivos con Android que no tiene una cámara? Al incluir lo siguiente en mi manifiesta:

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

entonces es básicamente diciendo "Voy a usar una cámara si es que existe, pero no lo necesito para ejecutar la aplicación".

¿Cómo podría comprobar si existe una cámara en el dispositivo, antes de intentar utilizar la clase Camera?

¿Fue útil?

Solución

No he intentado pero:

private android.hardware.Camera mCameraDevice;

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

Puede ser lo que necesita.

Otros consejos

Esto es lo que estoy utilizando

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

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

Todas las clases de otras cosas divertidas para poner a prueba para están disponibles también - la brújula, es ubicación disponible, hay una cámara frente a frente: http://developer.android.com/reference/android/content/pm /PackageManager.html

Para saber cuántas cámaras están disponibles en el dispositivo, puede llamar a:

import android.hardware.Camera;

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

Camera.getNumberOfCameras () es estática, por lo que no requiere en realidad se conecta a una cámara. Esto funciona ya que la API 9.

Editar:

Con la API camera2 más reciente, también se puede llamar CameraManager.getCameraIdList () , lo que da una lista de los identificadores de todas las cámaras válidos, en lugar de la cuenta.

se debe utilizar esto para encontrar la cámara en su dispositivo

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

Utilice la PackageManager.hasSystemFeature () método para el control de la cámara:

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

Fuente: https://developer.android.com /guide/topics/media/camera.html#custom-camera

Camera.getNumberOfCameras () está en desuso. Se puede utilizar:

@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();
}

Prueba esto:

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

a partir de: http://developer.android.com/guide/topics/ media / camera.html

siguiendo manera podemos comprobar qué dispositivo tiene cámara o no.

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

Si está utilizando Android 2.3, hay algunas API que se puede comprobar el estado de la cámara, como el número de cámaras (frontal y posterior)

Probar

Para cámara frontal

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

para la cámara posterior

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

De acuerdo con la documentación , usted tiene que utilizar Administrador de paquetes para comprobar si la cámara está disponible en el dispositivo o no

En Java:

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

En Kotlin:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

He encontrado en cajas de Android TV donde se puede enchufar y jugar cámara USB varias veces. En algún punto del tiempo, el servicio de la cámara empieza a decir que detecta una cámara en el sistema, mientras que no hay ninguna cámara conectada al sistema. Esto sucede cuando se conecta / salida de la cámara varias veces. Para solucionar esto, he encontrado esta solución de trabajo:

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

Una solución línea:

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

Ponga este método en la clase de proyecto Utils.java.

De acuerdo con la documentación 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;
    }
}

Consulte más sobre la cámara API: turismo Els href="https://developer.android.com/guide/topics/media/camera.html#detect-camera" rel="nofollow noreferrer"> https : //developer.android.com/guide/topics/media/camera.html#detect-camera

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top