更一般地说,如果设备有多个嵌入式摄像头, 有没有办法初始化其中一个?
我在Android参考文档中找不到它:
三星SHW-M100S有两个摄像头。如果没有参考使用两个相机,任何想法三星怎么做...?
答案 0 :(得分: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;
}
在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" />
注意:此功能适用于Gingerbread(2.3)和Up Android版。
答案 1 :(得分:12)
所有旧答案&#39;谷歌不赞成这些方法(据说是因为这样的麻烦),因为API 21需要use Camera 2 API:
此类在API级别21中已弃用。我们建议使用新类 用于新应用程序的android.hardware.camera2 API。
在the newer API中,您对Android设备相机几乎完全支持并明确建议
String[] getCameraIdList()
然后使用获得的CameraId打开相机:
void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)
99%的正面相机都有id =&#34; 1&#34;和后置摄像头ID =&#34; 0&#34; 根据这个:
不可移动相机使用从0开始的整数 标识符,而可移动摄像机每个都有唯一的标识符 个别设备,即使它们是同一型号。
然而,这意味着如果设备情况很罕见,就像1-frontal -camera平板电脑一样,您需要计算您拥有的嵌入式相机的数量,并下订单相机的重要性(&#34; 0&#34;)。所以CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0,这意味着后置摄像头比正面更强重要。
我不知道在所有Android设备上识别正面相机的统一方法。简单地说,设备内部的Android操作系统由于某些原因无法真正找出哪个摄像机正好在哪里:也许唯一的摄像机硬编码ID是一个表示其重要性的整数,或者可能在某些设备上,无论您转向哪一侧。 。&#34;回来&#34;。
文档:https://developer.android.com/reference/android/hardware/camera2/package-summary.html
明确示例:https://github.com/googlesamples/android-Camera2Basic
对于较旧的API (不建议这样做,因为它不适用于现代手机,较新的Android版本和传输是一种痛苦的屁股)。只需使用相同的整数 CameraID(1)打开正面相机,就像在this answer中一样:
cam = Camera.open(1);
如果您信任 OpenCV 来执行相机部分:
内
<org.opencv.android.JavaCameraView
../>
使用以下相机:
opencv:camera_id="1"
答案 2 :(得分:10)
从Android 2.1开始,Android仅在其SDK中支持单个摄像头。这可能会在未来的Android版本中添加。
答案 3 :(得分:4)
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(holder);
Camera.Parameters p = mCamera.getParameters();
p.set("camera-id",2);
mCamera.setParameters(p);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
答案 4 :(得分:4)
对于API 21(5.0)及更高版本,您可以使用CameraManager API's
try {
String desiredCameraId = null;
for(String cameraId : mCameraIDsList) {
CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId);
List<CameraCharacteristics.Key<?>> keys = chars.getKeys();
try {
if(CameraCharacteristics.LENS_FACING_FRONT == chars.get(CameraCharacteristics.LENS_FACING)) {
// This is the one we want.
desiredCameraId = cameraId;
break;
}
} catch(IllegalArgumentException e) {
// This key not implemented, which is a bit of a pain. Either guess - assume the first one
// is rear, second one is front, or give up.
}
}
}
答案 5 :(得分:2)
随着Android 2.3(Gingerbread)的发布,您现在可以使用android.hardware.Camera
类来获取摄像机的数量,有关特定摄像机的信息,并获得对特定{{1 }}。查看新的Camera
API here。
答案 6 :(得分:1)
要打开后退摄像头,请执行以下操作:-
router.get("/home", async (req, res) => {
if (req.query.search) {
let result = [];
const collections = ['A', 'B', 'C', 'D', 'E', 'F'];
const regex = new RegExp(escapeRegex(req.query.search), 'gi');
for (let collection of collections) {
let group = mongoose.model(collection);
result.push(...await group.find({ 'title': regex }));
}
res.render("public/hadith.ejs", { search: result});
}
});
function escapeRegex(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};
要打开前置摄像头,请执行以下操作:-
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
我无法使其适用于API 28及更高版本。另外,在某些设备中(取决于制造商)无法直接打开前置摄像头。
答案 7 :(得分:0)
Camera camera;
if (Camera.getNumberOfCameras() >= 2) {
//if you want to open front facing camera use this line
camera = Camera.open(CameraInfo.CAMERA_FACING_FRONT);
//if you want to use the back facing camera
camera = Camera.open(CameraInfo.CAMERA_FACING_BACK);
}
try {
camera.setPreviewDisplay("your surface holder here");
camera.startPreview();
} catch (Exception e) {
camera.release();
}
/ *这不是正确的方法,这是运行Android 4.0或更早版本的旧设备的解决方案。这可用于测试目的,但不建议用于主要开发。此解决方案仅可视为临时解决方案。但是这个解决方案帮助了很多人,所以我不打算删除这个答案* /
答案 8 :(得分:0)
<强>的build.gradle 强>
dependencies {
compile 'com.google.android.gms:play-services-vision:9.4.0+'
}
设置视图
CameraSourcePreview mPreview = (CameraSourcePreview) findViewById(R.id.preview);
GraphicOverlay mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay);
CameraSource mCameraSource = new CameraSource.Builder(context, detector)
.setRequestedPreviewSize(640, 480)
.setFacing(CameraSource.CAMERA_FACING_FRONT)
.setRequestedFps(30.0f)
.build();
mPreview.start(mCameraSource, mGraphicOverlay);