Проверьте, есть ли в устройстве камера?
-
20-09-2019 - |
Вопрос
В своем приложении я хотел бы использовать камеру, если она есть на устройстве.Есть ли устройства под управлением Android, которые не есть камера?Включив в свой манифест следующее:
<uses-feature android:name="android.hardware.camera" android:required="false"/>
тогда это по сути говорит: «Я буду использовать камеру, если она есть, но она мне не нужна для запуска приложения».
Как я могу проверить, существует ли камера на устройстве, прежде чем пытаться использовать класс камеры?
Решение
Я не пробовал, но:
private android.hardware.Camera mCameraDevice;
try {
mCameraDevice = android.hardware.Camera.open();
} catch (RuntimeException e) {
Log.e(TAG, "fail to connect Camera", e);
// Throw exception
}
Может быть то, что вам нужно.
Другие советы
Это то, что я использую
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
Чтобы узнать, сколько камер доступно на вашем устройстве, вы можете позвонить:
import android.hardware.Camera;
int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
hasCamera = true;
}
Camera.getNumberOfCameras() является статическим, поэтому не требует фактического подключения к камере.Это работает начиная с API 9.
Редактировать:
С помощью нового API camera2 вы также можете вызвать CameraManager.getCameraIdList(), который дает список всех действительных идентификаторов камер, а не только их количество.
вы должны использовать это, чтобы найти камеру на вашем устройстве
public static boolean isCameraAvailable(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}
Использовать 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
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();
}
Попробуй это :
/** 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;
}
}
от : http://developer.android.com/guide/topics/media/camera.html
Следующим способом мы можем проверить, есть ли в устройстве камера или нет.
/** 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;
}
}
Если вы используете Android 2.3, есть несколько API-интерфейсов, с помощью которых вы можете проверить состояние вашей камеры, например количество камер (передних и задних).
попробуй это
Для фронтальной камеры
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");
}
В соответствии с документация, вам придется использовать диспетчер пакетов, чтобы проверить, доступна ли камера на устройстве или нет.
На Яве:
final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);
В Котлине:
val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)
Я нашел в приставках для 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_;
}
Однострочное решение:
public static boolean hasCamera(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
Поместите этот метод в класс проекта Utils.java.
Согласно документации 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