Pergunta

No meu aplicativo, gostaria de usar a câmera, se o dispositivo tiver um. Existem dispositivos executando o Android que não faça tem uma câmera? Incluindo o seguinte no meu manifesto:

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

Então está basicamente dizendo "Vou usar uma câmera se existir, mas não precisar de uma para executar o aplicativo".

Como eu poderia verificar se existe uma câmera no dispositivo, antes de tentar usar a classe da câmera?

Foi útil?

Solução

Eu não tentei, mas:

private android.hardware.Camera mCameraDevice;

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

Pode ser o que você precisa.

Outras dicas

Isso é o que estou usando

import android.content.pm.PackageManager;

PackageManager pm = context.getPackageManager();

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

Todos os tipos de outras coisas divertidas a testar também estão disponíveis - a bússola, está disponível, há uma câmera frontal:http://developer.android.com/reference/android/content/pm/packageManager.html

Para descobrir quantas câmeras estão disponíveis no seu dispositivo, você pode ligar:

import android.hardware.Camera;

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

Camera.getNumberOfCameras () é estático, por isso não é necessário conectar -se a uma câmera. Isso funciona desde a API 9.

Editar:

Com a API da câmera mais recente, você também pode ligar CameRamanager.getcameraidlist (), que fornece uma lista de todos os IDs de câmera válidos, em vez de apenas a contagem.

Você deve usar isso para encontrar a câmera em seu dispositivo

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

Use o PackageManager.hassystemFeature () Método para verificar a câmera:

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

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

Camera.getNumberOfCameras () está depreciado. Você pode usar:

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

Experimente isso:

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

Da maneira seguinte, podemos verificar o dispositivo tem câmera ou não.

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

Se você estiver usando o Android 2.3, existem algumas APIs que você pode verificar o status da sua câmera, como o número de câmeras (frente e traseira)

tente isso

Para a câmera 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 câmera traseira

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

Conforme documentação, você deve usar o gerenciador de pacotes para verificar se a câmera está disponível no dispositivo ou não

Em java:

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

Em Kotlin:

val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)

Encontrei em caixas de TV Android, onde você pode conectar e reproduzir uma câmera USB várias vezes. Em algum momento, o serviço de câmera começa a dizer que detectou uma câmera no sistema enquanto nenhuma câmera está conectada ao sistema. Isso acontece quando você conecta a câmera várias vezes. Para consertar isso, encontrei esta solução funcionando:

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

Solução de uma linha:

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

Coloque esse método em sua classe de projeto Utils.java.

De acordo com a documentação do 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 mais sobre a API da câmera:
https://developer.android.com/guide/topics/media/camera.html#detect-camera

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top