В более общем плане, если устройство имеет более одной встроенной камеры, есть ли способ инициализировать именно одну из них?
Я не нашел его в справочной документации Android:
- https://developer.android.com/reference/android/hardware/Camera.html
- https://developer.android.com/reference/android/hardware/camera2/package-summary.html
- https://developer.android.com/reference/android/hardware/camera2/CameraManager.html
Samsung SHW-M100S имеет две камеры. Если нет ссылки на использование двух камер, есть идеи, как это сделал Samsung ...?
Ответы:
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) и более поздней версии Android.
источник
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
техникой открытия существующего приложения камеры?Intent
обрабатывает действие камеры. Этот метод используется, когда вы используетеSurfaceView
функциональные возможности камеры.Все более старые методы ответов устарели Google (предположительно из-за подобных проблем), поскольку API 21 вам необходимо использовать API камеры 2:
В новом API у вас есть почти полная власть над камерой Android-устройства, а документация содержит явные советы
String[] getCameraIdList()
а затем используйте полученный CameraId, чтобы открыть камеру:
void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)
99% фронтальных камер имеют id = "1", а задние камеры id = "0" в соответствии с этим:
Однако это означает, что если ситуация с устройством встречается редко, например, только планшет с одной фронтальной камерой, вам нужно подсчитать, сколько у вас встроенных камер, и расположить камеры в порядке их важности («0»). Итак, CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, что означает, что задняя камера важнее фронтальной.
Я не знаю единого метода определения фронтальной камеры на всех устройствах Android. Проще говоря, ОС Android внутри устройства не может точно определить, где именно находится камера, по некоторым причинам: возможно, единственный жестко запрограммированный идентификатор камеры - это целое число, представляющее ее важность, или, может быть, на некоторых устройствах, в какую бы сторону вы ни повернулись ... " назад ».
Документация : 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);
Если вы доверяете OpenCV делать часть камеры:
Внутри
<org.opencv.android.JavaCameraView ../>
для фронтальной камеры используйте следующее:
opencv:camera_id="1"
источник
Начиная с Android 2.1, Android поддерживает только одну камеру в своем SDK. Вероятно, это будет добавлено в будущем выпуске Android.
источник
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(); } }
источник
Для API 21 (5.0) и более поздних версий вы можете использовать CameraManager API
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. } } }
источник
Чтобы открыть заднюю камеру: -
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
Чтобы открыть переднюю камеру: -
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)
Я не мог заставить его работать для API 28 и выше. Кроме того, на некоторых устройствах невозможно открыть фронтальную камеру напрямую (зависит от производителя).
источник
С выпуском Android 2.3 (Gingerbread) теперь вы можете использовать этот
android.hardware.Camera
класс, чтобы получить количество камер, информацию о конкретной камере и получить ссылку на конкретнуюCamera
. Ознакомьтесь с новымиCamera
API здесь .источник
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);
источник
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 или старше. Это можно использовать в целях тестирования, но не рекомендуется для основной разработки. Это решение можно рассматривать только как временное решение. Но это решение помогло многим, поэтому я не собираюсь удалять этот ответ * /
источник