Mówiąc bardziej ogólnie, jeśli urządzenie ma więcej niż jedną wbudowaną kamerę, czy istnieje sposób na zainicjowanie w szczególności jednej z nich?
Nie znalazłem tego w dokumentacji referencyjnej Androida:
- 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 ma dwa aparaty. Jeśli nie ma wzmianki o używaniu dwóch aparatów, jakiś pomysł, jak zrobił to Samsung ...?
Odpowiedzi:
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; }
Dodaj następujące uprawnienia w
AndroidManifest.xml
pliku:<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" />
Uwaga: ta funkcja jest dostępna w wersji Gingerbread (2.3) i nowszej wersji Androida.
źródło
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
techniką otwierania istniejącej aplikacji aparatu?Intent
na swój sposób radzi sobie z ruchem kamery. Ta technika jest używana podczas korzystaniaSurfaceView
z funkcji aparatu.Wszystkie metody starszych odpowiedzi są przestarzałe przez Google (prawdopodobnie z powodu takich problemów), ponieważ API 21 musisz użyć API Camera 2:
W nowszym interfejsie API masz prawie całkowitą władzę nad aparatem urządzenia z Androidem i dokumentacją, która zawiera wyraźne porady
String[] getCameraIdList()
a następnie użyj uzyskanego CameraId, aby otworzyć kamerę:
void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)
99% przednich kamer ma id = "1", a tylny aparat id = "0", zgodnie z tym:
Oznacza to jednak , że jeśli sytuacja z urządzeniem jest rzadka, jak np. Tablet z jedną kamerą przednią, należy policzyć liczbę posiadanych kamer wbudowanych i uporządkować je według ich ważności („0”). Więc CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, co oznacza, że tylna kamera jest ważniejsza niż przednia.
Nie znam jednolitej metody identyfikacji przedniego aparatu na wszystkich urządzeniach z Androidem. Mówiąc najprościej, system operacyjny Android w urządzeniu nie może naprawdę dowiedzieć się, która kamera jest dokładnie tam, z pewnych powodów: być może jedynym zakodowanym na stałe identyfikatorem kamery jest liczba całkowita reprezentująca jej znaczenie, a może na niektórych urządzeniach, w którą stronę się zwrócisz ... ” plecy".
Dokumentacja : https://developer.android.com/reference/android/hardware/camera2/package-summary.html
Jawne przykłady : https://github.com/googlesamples/android-Camera2Basic
W przypadku starszego API (nie jest to zalecane, ponieważ na nowoczesnych telefonach nie będzie działać nowsza wersja Androida, a transfer jest uciążliwy). Po prostu użyj tego samego Integer CameraID (1), aby otworzyć przednią kamerę, jak w tej odpowiedzi :
cam = Camera.open(1);
Jeśli ufasz OpenCV jako część aparatu:
Wewnątrz
<org.opencv.android.JavaCameraView ../>
użyj następujących dla przedniego aparatu:
opencv:camera_id="1"
źródło
Począwszy od Androida 2.1, Android obsługuje tylko jedną kamerę w swoim SDK. Jest prawdopodobne, że zostanie to dodane w przyszłej wersji Androida.
źródło
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(); } }
źródło
W przypadku interfejsu API 21 (5.0) i nowszych można używać interfejsów API CameraManager
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. } } }
źródło
Aby otworzyć tylną kamerę: -
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)
Aby otworzyć przedni aparat: -
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)
Nie mogłem sprawić, by działało z API 28 i nowszymi. Również bezpośrednie otwarcie przedniego aparatu nie jest możliwe w niektórych urządzeniach (w zależności od producenta).
źródło
Wraz z wydaniem Androida 2.3 (Gingerbread) możesz teraz używać
android.hardware.Camera
klasy, aby uzyskać informacje o liczbie kamer, informacje o konkretnej kamerze i odniesienie do konkretnegoCamera
. Sprawdź noweCamera
interfejsy API tutaj .źródło
build.gradle
dependencies { compile 'com.google.android.gms:play-services-vision:9.4.0+' }
Ustaw widok
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);
źródło
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(); }
/ * To nie jest właściwy sposób, jest to rozwiązanie dla starszych urządzeń z systemem Android 4.0 lub starszym. Można to wykorzystać do celów testowych, ale nie jest to zalecane do głównego programowania. To rozwiązanie można traktować jedynie jako rozwiązanie tymczasowe. Ale to rozwiązanie pomogło wielu, więc nie zamierzam usuwać tej odpowiedzi * /
źródło