ملاحظة: تشير هذه الصفحة إلى حزمة Camera2. ننصحك باستخدام الكاميراX ما لم يكن تطبيقك يتطلب ميزات محدَّدة منخفضة المستوى من تطبيق Camera2. يتوافق كل من CameraX و Camera2 مع نظام التشغيل Android 5.0 (المستوى 21 لواجهة برمجة التطبيقات) والإصدارات الأحدث.
توفّر Camera2 واجهة برمجة تطبيقات الإضافات للوصول إلى الإضافات التي نفذتها الشركات المصنّعة للأجهزة على أجهزة Android المختلفة. للحصول على قائمة بأوضاع الإضافات المتوافقة، يُرجى الاطّلاع على إضافات الكاميرا.
للحصول على قائمة بالأجهزة المتوافقة مع الإضافات، يُرجى الاطّلاع على الأجهزة المتوافقة.
بنية الإضافات
توضح الصورة التالية بنية إضافات الكاميرا.
يمكن لتطبيق Camera2 استخدام الإضافات من خلال واجهة برمجة تطبيقات Camera2. الكاميرا 2 توفر واجهة برمجة التطبيقات طرقًا لطلب البحث عن الإضافات المتاحة وإعداد إضافة جلسة كاميرا، والتواصل مع مكتبة المصنّعين الأصليين للكاميرا. هذا النمط السماح لتطبيقك باستخدام إضافات، مثل "الليل" أو "نطاق عالي الديناميكية" أو "تلقائي" أو "الخلفية الضبابية" إصلاح الوجه
اختبار توافق جهاز كاميرا مع واجهة برمجة التطبيقات لإضافات الكاميرا 2
يتحقّق مقتطف الرمز التالي مما إذا كان الجهاز متوافقًا مع الكاميرا2 واجهة برمجة التطبيقات الإضافات. لا تتيح بعض الأجهزة الإضافات أو قد يتوافق الجهاز مع مجموعة فرعية منها. من الإضافات. يعرض المقتطف قائمة بمعرّفات الكاميرات المتوافقة التي تتوافق مع إضافات الكاميرا.
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(); } }
إنشاء جلسة للكاميرا باستخدام واجهة برمجة التطبيقات إضافات Camera2
وعند استخدامها مع الأجهزة المتوافقة، تتيح لك واجهة برمجة التطبيقات للكاميرا 2 بالوصول إلى
بعض إضافات الكاميرا. يعرض مقتطف الرمز التالي مثالاً على
كيفية إنشاء 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
وعرض نماذج واجهة برمجة التطبيقات للإضافات الخاصة بالكاميرا2 العامة.
لمعرفة المزيد.