Android 检查设备是否有摄像头?
在我的应用程序中,如果设备有摄像头,我想使用摄像头。有没有运行android的设备没有摄像头?通过在我的清单中包括以下内容:Android 检查设备是否有摄像头?,android,android-camera,Android,Android Camera,在我的应用程序中,如果设备有摄像头,我想使用摄像头。有没有运行android的设备没有摄像头?通过在我的清单中包括以下内容: <uses-feature android:name="android.hardware.camera" android:required="false"/> 然后它基本上是说“如果有摄像头,我会用它,但不需要摄像头来运行应用程序” 在尝试使用camera类之前,如何检查设备上是否存在摄像头?我没有尝试过,但是: private android.hard
<uses-feature android:name="android.hardware.camera" android:required="false"/>
然后它基本上是说“如果有摄像头,我会用它,但不需要摄像头来运行应用程序”
在尝试使用camera类之前,如何检查设备上是否存在摄像头?我没有尝试过,但是:
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)) {
}
还有其他各种有趣的东西可供测试——指南针、位置是否可用、是否有前置摄像头:
如果您使用的是Android 2.3,您可以使用一些API检查您的摄像头状态,例如摄像头数量(前后)要了解设备上有多少摄像头可用,您可以调用:
import android.hardware.Camera;
int numCameras = Camera.getNumberOfCameras();
if (numCameras > 0) {
hasCamera = true;
}
getNumberOfCameras()是静态的,因此不需要实际连接到相机。这在API 9之后就开始工作了
编辑:
使用较新的Camera2API,您还可以调用,它提供了所有有效相机ID的列表,而不仅仅是计数 试试这个
用于前置摄像头
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");
}
您应该使用此功能在设备中查找摄像头
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();
}
试试这个:
/** 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:通过以下方式,我们可以检查设备是否有摄像头
/** 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;
}
}
使用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;
}
}
来源:根据,您必须使用软件包管理器检查设备上是否有摄像头
在Java中:
final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);
val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)
在科特林:
final boolean isCameraAvailable = getPackageManager().hasSystemFeature(FEATURE_CAMERA);
val isCameraAvailable = packageManager.hasSystemFeature(FEATURE_CAMERA)
我在安卓电视盒中发现,在那里你可以多次插拔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的信息请参考:
我相信(但我不是100%确定)所有过去和现在的版本都指定了具有某种最低分辨率的摄像头。遵守CDD是获得Android市场许可和专有谷歌应用程序的先决条件。不过,还有一些安卓设备没有这样做(例如Nook颜色)。截至今天,当前版本的文档(4.2)规定“设备实现应包括一个后向摄像头,并可能包括一个前向摄像头。”请注意,它没有使用关键字“必须”。只需补充一下,也有一些设备只有一个前置摄像头。如果它说应用程序应该使用和不使用摄像头,那么将其添加到清单中有意义吗?它是否会影响Play Store上的应用程序?请不要忘记释放相机对象!有关查看设备是否有摄像头的正确方法,请参见下面DPJane的答案。方法不正确。昂贵的电话。如果其他应用程序打开同一个摄像头,这将引发RuntimeException。不符合目的。这个答案太有名了!:)Android 6.0(API级别23)+上的这个实现将抛出一个SecurityException,除非您在运行时特别请求了“Android.permission.CAMERA”权限。问题很快。这可能是愚蠢的,但我是android/java新手,你从哪里获得上下文????thanks@grobartn:
public类YourActivity扩展活动{Context contextActivity;PackageManager pm;@Override public void onCreate(Bundle savedInstanceState){…contextActivity=this;pm=contextActivity.getPackageManager().
从API第9级开始,除了FEATURE_CAMERA外,您可能还需要检查FEATURE_CAMERA_FRONT。例如,Nexus 7(只有一个前置摄像头)将false返回FEATURE_CAMERA。对于Kindle Fire HD 7(Android 4.0.3),我发现它报告FEATURE_CAMERA,即使它只有一个前置摄像头!糟糕……作为一种解决方法,我也进行了测试(FEATURE_CAMERA_FRONT and CAMERA.getNumberOfCameras()==1)然后我知道没有后置摄像头。在API级别17之后,您可以使用PackageManager.FEATURE_CAMERA_ANY。我认为这是最有用的一个。FEATURE_CAMERA_ANY是一个不错的选择。下面是一个简短的代码版本,供喜欢它的人使用。public static boolean是可用的(Context Context){return Context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_-CAMERA_-ANY))}
这对我有效,而在API 19单线版本中该功能_-CAMERA没有:boolean hasCam=android.hardware.CAMERA.getNumberOfCameras()>0;这个答案更好。hasSystemFeature(PackageManager.FEATURE_-CAMERA)在Kit Kat(Nexus 7)上返回false对于Nexus 7(2013)返回false,因为FEATURE_CAMERA仅与背面摄像头有关(由于向后兼容性);FEATURE_CAMERA_ANY是指如果设备上至少有一台任何类型的摄像头,那么该功能就是正确的。为什么不推荐使用android.hardware.CAMERA
呢?这个功能应该使用什么呢?我知道我们现在有android.hardware.camera2
,但是我们在哪里可以找到getNumberOfCameras
的替代品呢?