Verificar se o dispositivo tem uma câmera?
-
20-09-2019 - |
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?
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