ملاحظة: تشير هذه الصفحة إلى حزمة Camera2. ننصحك باستخدام CameraX ما لم يكن تطبيقك يتطلّب ميزات محدّدة منخفضة المستوى من Camera2. تتوافق كل من CameraX وCamera2 مع الإصدار 5.0 من نظام التشغيل Android (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث.
توفّر Camera2 واجهة برمجة تطبيقات للإضافات من أجل الوصول إلى الإضافات التي نفّذتها الشركات المصنّعة للأجهزة على أجهزة Android المختلفة. للاطّلاع على قائمة بأوضاع الإضافات المتوافقة، يُرجى مراجعة إضافات الكاميرا.
للاطّلاع على قائمة بالأجهزة المتوافقة مع الإضافات، يُرجى مراجعة الأجهزة المتوافقة.
بنية الإضافات
توضّح الصورة التالية بنية إضافات الكاميرا.
يمكن لتطبيق Camera2 استخدام الإضافات من خلال واجهة برمجة التطبيقات Camera2 API. توفّر واجهة برمجة التطبيقات Camera2 طرقًا لطلب البحث عن الإضافات المتاحة وضبط جلسة كاميرا للإضافة والتواصل مع مكتبة المصنّع الأصلي للجهاز الخاصة بإضافات الكاميرا. يتيح ذلك لتطبيقك استخدام إضافات مثل "الوضع الليلي" أو "النطاق العالي الديناميكية" أو "تلقائي" أو "الخلفية الضبابية" أو "تجميل الوجه".
اختبار جهاز كاميرا للتأكّد من توافقه مع واجهة برمجة التطبيقات Camera2 Extensions API
يتحقّق مقتطف الرمز التالي مما إذا كان الجهاز متوافقًا مع واجهة برمجة التطبيقات Camera2 Extensions API. لا تتوافق الإضافات مع بعض الأجهزة، أو قد يتوافق الجهاز مع مجموعة فرعية من الإضافات. يعرض المقتطف قائمة بمعرّفات الكاميرات المتوافقة التي تتيح إضافات الكاميرا.
Kotlin
private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { cameraManager.cameraIdList.filter { cameraId -> val characteristics = cameraManager.getCameraCharacteristics(cameraId) val extensionCharacteristics = cameraManager.getCameraExtensionCharacteristics(cameraId) val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) extensionCharacteristics.supportedExtensions.isNotEmpty() && capabilities?.contains( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE ) ?: false } } else emptyList()
Java
private List<String> getExtensionCameraIds(CameraManager cameraManager) throws CameraAccessException { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { return Arrays.stream(cameraManager.getCameraIdList()).filter(cameraId -> { try { CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); CameraExtensionCharacteristics extensionCharacteristics = cameraManager.getCameraExtensionCharacteristics(cameraId); IntStream capabilities = Arrays.stream( characteristics.get( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES ) ); return !extensionCharacteristics.getSupportedExtensions().isEmpty() && capabilities.anyMatch(capability -> capability == CameraCharacteristics .REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE ); } catch (CameraAccessException e) { throw new RuntimeException(e); } }).collect(Collectors.toList()); } else { return Collections.emptyList(); } }
إنشاء CameraExtensionSession باستخدام واجهة برمجة التطبيقات Camera2 Extensions API
تتيح لك واجهة برمجة التطبيقات Camera2 Extensions الوصول إلى بعض إضافات الكاميرا عند استخدامها مع الأجهزة المتوافقة. يعرض مقتطف الرمز التالي مثالاً على كيفية إنشاء CameraExtensionSession لاستخدام وضع "الالتقاط الليلي" في تطبيق Camera2 حالي.
Kotlin
private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() { // Implement Capture Callbacks } private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() { override fun onConfigured(session: CameraExtensionSession) { cameraExtensionSession = session try { val captureRequest = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { addTarget(previewSurface) }.build() session.setRepeatingRequest( captureRequest, Dispatchers.IO.asExecutor(), captureCallbacks ) } catch (e: CameraAccessException) { Snackbar.make( previewView, "Failed to preview capture request", Snackbar.LENGTH_SHORT ).show() requireActivity().finish() } } override fun onClosed(session: CameraExtensionSession) { super.onClosed(session) cameraDevice.close() } override fun onConfigureFailed(session: CameraExtensionSession) { Snackbar.make( previewView, "Failed to start camera extension preview", Snackbar.LENGTH_SHORT ).show() requireActivity().finish() } } private fun startExtensionSession() { val outputConfig = arrayListOf( OutputConfiguration(stillImageReader.surface), OutputConfiguration(previewSurface) ) val extensionConfiguration = ExtensionSessionConfiguration( CameraExtensionCharacteristics.EXTENSION_NIGHT, outputConfig, Dispatchers.IO.asExecutor(), extensionSessionStateCallback ) cameraDevice.createExtensionSession(extensionConfiguration) }
Java
private CameraExtensionSession.ExtensionCaptureCallback captureCallbacks = new CameraExtensionSession.ExtensionCaptureCallback() { // Implement Capture Callbacks }; private CameraExtensionSession.StateCallback extensionSessionStateCallback = new CameraExtensionSession.StateCallback() { @Override public void onConfigured(@NonNull CameraExtensionSession session) { cameraExtensionSession = session; try { CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(previewSurface); CaptureRequest captureRequest = captureRequestBuilder.build(); session.setRepeatingRequest(captureRequest, backgroundExecutor, captureCallbacks); } catch (CameraAccessException e) { Snackbar.make( previewView, "Failed to preview capture request", Snackbar.LENGTH_SHORT ).show(); requireActivity().finish(); } } @Override public void onClosed(@NonNull CameraExtensionSession session) { super.onClosed(session); cameraDevice.close(); } @Override public void onConfigureFailed(@NonNull CameraExtensionSession session) { Snackbar.make( previewView, "Failed to start camera extension preview", Snackbar.LENGTH_SHORT ).show(); requireActivity().finish(); } }; private void startExtensionSession() { ArrayList<OutputConfiguration> outputConfig = new ArrayList<>(); outputConfig.add(new OutputConfiguration(stillImageReader.getSurface())); outputConfig.add(new OutputConfiguration(previewSurface)); ExtensionSessionConfiguration extensionConfiguration = new ExtensionSessionConfiguration( CameraExtensionCharacteristics.EXTENSION_NIGHT, outputConfig, backgroundExecutor, extensionSessionStateCallback ); }
مراجع إضافية
لمزيد من المعلومات، يُرجى الاطّلاع على
CameraExtensionCharacteristics
وعرض نماذج واجهة برمجة التطبيقات Camera2 Extensions
العامة.