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