Проверьте, есть ли на устройстве камера?
В моем приложении я бы хотел использовать камеру, если она есть на устройстве. Есть ли устройства под управлением Android, у которых нет камеры? Включив в мой манифест следующее:
<uses-feature android:name="android.hardware.camera" android:required="false"/>
тогда в основном говорится: "Я буду использовать камеру, если она есть, но она мне не понадобится для запуска приложения".
Как я могу проверить, есть ли на устройстве камера, прежде чем пытаться использовать класс Camera?
15 ответов
Я не пробовал это, но:
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);
}
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();
}
Используйте метод 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
Следующим способом мы можем проверить, имеет ли устройство камеру или нет.
/** 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;
}
}
Попробуй это:
/** 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
лучше проверить ЛЮБУЮ камеру на устройстве, так как это может быть и внешняя камера
packageManager.hasSystemFeature(FEATURE_CAMERA_ANY)
Документация:
Функция для getSystemAvailableFeatures и hasSystemFeature: устройство имеет по крайней мере одну камеру, направленную в каком-либо направлении, или может поддерживать подключение внешней камеры к нему.
Согласно документации 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.
Попробуй это
Для фронтальной камеры
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");
}
Если вы используете Android 2.3, есть несколько API, которые вы можете проверить состояние вашей камеры, например, количество камер (передняя и задняя)
Одноканальное решение:
public static boolean hasCamera(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}
Поместите этот метод в свой класс проекта Utils.java.
Согласно документации, вы должны использовать диспетчер пакетов, чтобы проверить, доступна ли камера на устройстве или нет
В Java:
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_;
}