2013-01-18 99 views
8

我的应用程序具有需要后置摄像头的功能。是否有前置摄像头与我的需求无关。在任何情况下,整合一个强大的程序来检测后置摄像头是否存在,这证明是棘手的。例如,一位拥有HTC Evo 3D的用户抱怨说该应用说没有后置摄像头(显然是),而且我也收到了一些其他用户的类似投诉。检测后置摄像头的不足

这是一个棘手的事情来测试,因为尽管有很多设备,我没有一个只有前置摄像头的设备,比如Nexus 7,或者任何用户提到的型号。

这是我拥有的,这是从代码采取本网站其他答案:

boolean rearCameraFound = false; 
    if(BUILD_VERSION > 8){ 
     int cameraCount = 0; 
     Camera cam = null; 
     Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); 
     cameraCount = Camera.getNumberOfCameras(); 
     for (int camIdx = 0; camIdx < cameraCount; camIdx++) { 
      Camera.getCameraInfo(camIdx, cameraInfo); 
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK ) { 
       try { 
        cam = Camera.open(camIdx); 
        Log.d("TAG", "Rear camera detected"); 
        rearCameraFound = true; 
       } catch (RuntimeException e) { 
        Log.e("TAG", "Camera failed to open: " + e.getLocalizedMessage()); 
       } 
      } 
      if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       Log.d("TAG", "Front camera detected"); 
      } 
     } 
     return rearCameraFound; 
    }else{ 
     if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 
      // this device has a camera 
      return true; 
     } else { 
      // no camera on this device 
      return false; 
     } 
    } 

现在我把它换成这个代码与此更简单的版本:

PackageManager pm = context.getPackageManager(); 
return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); 

然而,我不知道Nexus 7会发生什么情况,例如只有前置摄像头。这将返回真实?

我正在寻找能够确定是否存在后置摄像头的代码。

+2

FYI ,此代码在Nexus 7运行股票JB 4.2 –

+0

上返回false。Sahil - 在过去,我试图这样做,但被告知我没有足够的声誉来这样做。我想我现在有了,所以一定会经历我的问题并确保完成,谢谢。 – androidneil

回答

9

Nexus 7(仅具有一个正面照相机)返回false到FEATURE_CAMERA,而不是它,您可以使用FEATURE_CAMERA_FRONT。看看这个discussion

现在,通过使用上述内容,您可以确保至少有一个摄像头。所以现在,你可以检查手机中存在的相机数量,如果它大于1,那么肯定会有后置相机。

import android.hardware.Camera; 

int numCameras = Camera.getNumberOfCameras(); 
if (numCameras > 1) { 
    rearCamera = true; 
} 

这是非常棘手的。但就是这些,我现在可以想到。试试吧。

+0

因此,如果我只想知道后置摄像头,那么看起来我的更新,更简单的代码可能就是所需的全部代码。我所能做的就是尝试并等待用户反馈,我猜。 – androidneil

+4

这种情况不适用于只有后置摄像头可用的情况。 –

+0

@TranHoangDuyAnh你到底想干什么? –

2

使用此片段。请注意,这仅适用于API 9或更高版本。

private static boolean checkCameraFacing(final int facing) { 
    if (getSdkVersion() < Build.VERSION_CODES.GINGERBREAD) { 
     return false; 
    } 
    final int cameraCount = Camera.getNumberOfCameras(); 
    CameraInfo info = new CameraInfo(); 
    for (int i = 0; i < cameraCount; i++) { 
     Camera.getCameraInfo(i, info); 
     if (facing == info.facing) { 
      return true; 
     } 
    } 
    return false; 
} 

public static boolean hasBackFacingCamera() { 
    final int CAMERA_FACING_BACK = 0; 
    return checkCameraFacing(CAMERA_FACING_BACK); 
} 

public static boolean hasFrontFacingCamera() { 
    final int CAMERA_FACING_BACK = 1; 
    return checkCameraFacing(CAMERA_FACING_BACK); 
} 

public static int getSdkVersion() { 
    return android.os.Build.VERSION.SDK_INT; 
} 

而这不需要打开相机。

1

对于前摄像机

Context context = this; //If its Activity 

// Context context=getActivity(); If its a Fragment 

PackageManager packageManager = context.getPackageManager(); 

if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) { 

    Log.i("CameraLog", "Front Camera Available"); 

} else { 

    Log.i("CameraLog", "No Front Camera Available"); 
     } 

用于后视照相机

Context context = this; //If its an Activity 

// Context context=getActivity(); If its a fragments 

PackageManager packageManager = context.getPackageManager(); 

if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 

    Log.i("CameraLog", "Back Camera is Available"); 

} else { 

    Log.i("CameraLog", "No Back Camera Available"); 

     } 
1

如果装置只有一个摄像头,它可以有背面仅相机,或仅前摄像机,首先检查是否回照相机存在:

  • 检查前置摄像头是否存在,但带有两个摄像头的设备显然有前置摄像头
  • 检查设备只有一个摄像头,但它可以有背部或前置摄像头
  • 最终结果:如果设备有前置摄像头,它只有一个摄像头,后置摄像头不存在
private boolean backCameraExists() { 
    boolean isFrontExists = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT); 
    if (isFrontExists && (Camera.getNumberOfCameras()<2)) { 
     return false; 
    } 
    return true; 
}