Sol*_*Sol 83 camera android android-camera
更一般地说,如果设备有多个嵌入式摄像头,是否有办法初始化其中一个?
我没有在Android参考文档中找到它:
三星SHW-M100S有两个摄像头.如果没有参考使用两个相机,任何想法三星怎么做...?
小智 113
private Camera openFrontFacingCameraGingerbread() {
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_FRONT) {
try {
cam = Camera.open(camIdx);
} catch (RuntimeException e) {
Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
}
}
}
return cam;
}
Run Code Online (Sandbox Code Playgroud)
在AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />
Run Code Online (Sandbox Code Playgroud)
注意:此功能在Gingerbread(2.3)和Up Android Version中可用.
ian*_*nuk 13
所有旧答案的方法都被Google弃用(据说是因为这样的麻烦),因为API 21需要使用 Camera 2 API:
该类在API级别21中已弃用.我们建议将新的android.hardware.camera2 API用于新的应用程序.
在较新的API中,您几乎可以完全掌握 Android设备相机和文档的明确建议
String[] getCameraIdList()
Run Code Online (Sandbox Code Playgroud)
然后使用获得的CameraId打开相机:
void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)
Run Code Online (Sandbox Code Playgroud)
99%的正面相机具有id ="1",并且后置摄像头id ="0", 根据此:
不可移动摄像机使用从0开始的整数作为其标识符,而可移动摄像机具有每个单独设备的唯一标识符,即使它们是相同的型号.
但是,这意味着如果设备情况很罕见,就像1-frontal -camera平板电脑一样,您需要计算您拥有的嵌入式摄像机数量,并根据其重要性("0")来设置摄像机的顺序.所以CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0,这意味着后置摄像头比正面更重要.
我不知道在所有Android设备上识别正面相机的统一方法.简单地说,设备内部的Android操作系统无法真正找出哪个摄像头确实位于某个原因:也许唯一的摄像头硬编码ID是一个表示其重要性的整数,或者可能在某些设备上,无论你转向哪一个......"背部".
文档:https://developer.android.com/reference/android/hardware/camera2/package-summary.html
显式示例:https://github.com/googlesamples/android-Camera2Basic
对于较旧的API(不建议这样做,因为它不适用于现代手机,较新的Android版本和传输是一种痛苦的屁股).只需使用相同的Integer CameraID(1)打开正面相机,就像在这个答案中一样:
cam = Camera.open(1);
Run Code Online (Sandbox Code Playgroud)
如果您信任OpenCV来执行相机部件:
内
<org.opencv.android.JavaCameraView
../>
Run Code Online (Sandbox Code Playgroud)
使用以下相机:
opencv:camera_id="1"
Run Code Online (Sandbox Code Playgroud)
Com*_*are 10
从Android 2.1开始,Android仅在其SDK中支持单个摄像头.这可能会在未来的Android版本中添加.
要打开后置摄像头:-
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
Run Code Online (Sandbox Code Playgroud)
要打开前置摄像头:-
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> {
cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 24 Android version 7.0(Samsung S6)
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 27 Android version 8.0(Nexus 6P)
cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
}
else -> cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1) // Tested API 21 Android version 5.0.1(Samsung S4)
}
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
Run Code Online (Sandbox Code Playgroud)
我无法使其适用于 API 28 及更高版本。此外,在某些设备中无法直接打开前置摄像头(取决于制造商)。