استخدِم جلسة "تحسين الإضاءة المنخفضة" لتفعيل ميزة "تحسين الإضاءة المنخفضة" من Google وإيقافها.
Kotlin
dependencies {
val low_light_boost_version = "16.0.1-beta04"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")
implementation("com.google.android.gms:play-services-base:18.7.0")
implementation("com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}")
implementation("com.google.android.gms:play-services-tasks:18.3.0")
}
أنيق
dependencies {
def low_light_boost_version = "16.0.1-beta04"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2'
implementation 'com.google.android.gms:play-services-base:18.7.0'
implementation 'com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}'
implementation 'com.google.android.gms:play-services-tasks:18.3.0'
}
LowLightBoostSession توفّر حزمة
com.google.android.gms.cameralowlight في "خدمات Google Play". راجِع مستندات "خدمات Google
Play" للحصول على معلومات حول الوصول إلى واجهات برمجة التطبيقات في "خدمات Google Play"
APIs.
إنشاء عنصر رد الاتصال
عند إنشاء جلسة "تحسين الإضاءة المنخفضة"، عليك تمرير عنصر إليها ينفّذ واجهة
LowLightBoostCallback.
يتم استدعاء دوال هذا العنصر عند قطع الاتصال بالجلسة أو إيقافها. يوضّح الرمز التالي كيفية إنشاء رد اتصال:
Kotlin
private fun createLowLightBoostCallback(): LowLightBoostCallback =
object : LowLightBoostCallback() {
override fun onSessionDestroyed() {
Log.d(TAG, "onSessionDestroyed")
lowLightBoostSession = null
}
override fun onSessionDisconnected(statusCode: Int) {
Log.d(TAG, "onSessionDisconnected: error=$statusCode")
lowLightBoostSession = null
}
}
Java
private LowLightBoostCallback createLowLightBoostCallback() {
LowLightBoostCallback lowLightBoostCallback = new LowLightBoostCallback() {
@Override
public void onSessionDestroyed() {
Log.d(TAG, "onSessionDestroyed");
lowLightBoostSession = null;
}
@Override
public void onSessionDisconnected(int statusCode) {
Log.d(TAG, "onSessionCreationFailed: error=" + statusCode);
lowLightBoostSession = null;
}
}
return lowLightBoostCallback;
}
نقاط أساسية حول هذا الرمز
- يحدّد هذا الرمز طريقة خاصة،
createLowLightBoostCallback()، تنشئ عنصر رد الاتصال. يجب استدعاء هذه الطريقة عند إنشاء جلسة تحسين الإضاءة المنخفضة، كما هو موضّح في مقالة إنشاء جلسة. - يتم استدعاء رد الاتصال عند قطع الاتصال بالجلسة أو إيقافها. لا يتم استدعاؤه عند إنشاء الجلسة. للتحقّق مما إذا تم إنشاء الجلسة بنجاح، افحص عنصر
Taskالذي يعرضهLowLightBoostClient.createSession.
إنشاء جلسة
لإنشاء جلسة إضاءة منخفضة، استدعِ الطريقة
LowLightBoostClient.createSession.
Kotlin
val options = LowLightBoostOptions(
previewSurface,
cameraId,
previewWidth,
previewHeight,
enableLowLightBoost
)
launch {
try {
val lowLightBoostSession = lowLightBoostClient
.createSession(options, createLowLightBoostCallback()).await()
Log.d(TAG, "Session created successfully")
// Get the surface from the LLB session;
// give it to camera so camera can write frames to it
} catch (e: CancellationException) {
Log.w(TAG, "Session creation was canceled", e)
lowLightBoostSession = null
} catch (e: ApiException) {
Log.e(TAG, "Session creation failed with ApiException:", e)
lowLightBoostSession = null
} catch (e: Exception) {
Log.e(TAG, "Session creation failed with Exception", e)
lowLightBoostSession = null
}
}
Java
LowLightBoostOptions options = new LowLightBoostOptions(
previewSurface,
cameraId,
previewWidth,
previewHeight,
enableLowLightBoost);
lowLightBoostClient
.createSession(options, createLowLightBoostCallback())
.addOnSuccessListener(
lowLightBoostExecutor,
(session) -> {
Log.d(TAG, "Session created successfully");
// Get the surface from the LLB session;
// give it to camera so camera can write frames to it
})
.addOnFailureListener(
lowLightBoostExecutor,
(e) -> {
ApiException apiException = (ApiException) e;
Log.d(TAG, "Session creation failed: " + e);
lowLightBoostSession = null;
})
.addOnCompleteListener(
lowLightBoostExecutor,
(task) -> Log.d(TAG, "Session creation complete"))
.addOnCanceledListener(
lowLightBoostExecutor,
() -> {
throw new RuntimeException("Session creation canceled");
});
نقاط أساسية حول هذا الرمز
- عليك تمرير عنصر
LowLightBoostOptionsإلىcreateSession()لـ ضبط الجلسة. يحدّد هذا العنصر عناصر مثل السطح المستهدف ومعرّف الكاميرا التي سيتم استخدامها وأبعاد المعاينة. - يفترض هذا الرمز أنّك فتحت اتصالاً بكاميرا Camera2،
واستخدمت هذه المعلومات لضبط قيم
cameraId, previewWidth, previewHeight. لمزيد من المعلومات، راجِع مستندات Camera2. enableLowLightBoostهي قيمة منطقية تحدّد ما إذا كان يجب بدء ميزة "تحسين الإضاءة المنخفضة" أو إيقافها.-
createLowLightBoostCallbackعبارة عن إجراء تكتبه لإنشاء عنصر رد الاتصال. يتم استدعاء هذا العنصر عند قطع الاتصال بالجلسة أو إيقافها. - يعرض الإجراء
LowLightBoostClient.createSession()عنصرTask. يمكنك استخدام هذا العنصر لإعداد أدوات معالجة النجاح والفشل. التقط الفيديو داخل أداة معالجة النجاح. - يمكنك تحديد
Executorلتشغيل أدوات المعالجة. إذا لم تحدّدExecutor، يتم تشغيل أدوات المعالجة على سلسلة المحادثات الرئيسية. في هذا الرمز، نفترض أنّlowLightBoostExecutorهوExecutorمناسب.
تمرير نتائج الالتقاط
تتطلّب ميزة "تحسين الإضاءة المنخفضة" من Google بعض البيانات الوصفية للكاميرا لمعرفة مقدار التحسين المناسب الذي يجب تطبيقه. يجب تمرير TotalCaptureResult إلى الإجراء processCaptureResult(). يمكنك الحصول على TotalCaptureResult في طريقة رد الاتصال onCaptureCompleted().
Kotlin
val captureCallback = CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
super.onCaptureCompleted(session, request, result)
lowLightBoostSession?.processCaptureResult(result)
}
}
Java
CameraCaptureSession.CaptureCallback captureCallback =
new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(
@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result)
if (lowLightBoostSession != null) {
lowLightBoostSession.processCaptureResult(result);
}
}
};
نقاط أساسية حول هذا الرمز
- لا يعرض هذا الرمز سوى رمز
CaptureCallbackذي الصلة بميزة "تحسين الإضاءة المنخفضة" من Google. من المحتمل أن يكون لديك رمز آخر في عمليات رد الاتصال هذه. - يسمح تمرير
TotalCaptureResultلميزة "تحسين الإضاءة المنخفضة" من Google بتحليل بيانات التعريض التلقائي والبيانات الوصفية الأخرى اللازمة لكي تعالج ميزة "تحسين الإضاءة المنخفضة" عملية رصد المشهد وتحدّد مقدار التحسين الذي يجب تطبيقه على الإطار. - يجب تمرير العنصر
captureCallbackعند إنشاء جلسة الكاميرا، مثلاً باستخدام setSingleRepeatingRequest().
بدء معاينة الكاميرا
بعد إنشاء جلسة إضاءة منخفضة، يمكنك بدء بث معاينة الكاميرا. يجب تنفيذ ذلك داخل دالة onSuccess() التي تمرّرها إلى جلسة الإضاءة المنخفضة، كما هو موضّح في مقالة إنشاء جلسة. يوضّح الرمز التالي كيفية تسجيل فيديو:
Kotlin
MainActivity.this.lowLightBoostSession =
lowLightBoostSession
MainActivity.this.lowLightBoostSession
.setSceneDetectorCallback(
(lowLightBoostSession, boostStrength) -> {
Log.d(TAG, "onSceneBrightnessChanged: " +
"boostStrength=$boostStrength")
// boostStrength > 0.5 indicates a low light scene.
// Update UI accordingly.
},
lowLightBoostExecutor
)
try {
startCaptureSession(
lowLightBoostSession.getCameraSurface())
// Start a Camera2 session here. Pass the LLB surface
// to the camera so the camera can write frames to it.
} catch (e: CameraAccessException) {
Log.e(TAG, "Failed to start capture session", e)
// Must try again or start the capture session without LLB.
}
Java
MainActivity.this.lowLightBoostSession =
lowLightBoostSession;
MainActivity.this.lowLightBoostSession
.setSceneDetectorCallback(
(lowLightBoostSession, boostStrength) -> {
Log.d(TAG, "onSceneBrightnessChanged: " +
"boostStrength=" + boostStrength);
// boostStrength > 0.5 indicates a low light scene.
// Update UI accordingly.
},
lowLightBoostExecutor
);
try {
startCaptureSession(
lowLightBoostSession.getCameraSurface());
// Start a Camera2 session here. Pass the LLB surface
// to the camera so the camera can write frames to it.
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to start capture session", e);
// Must try again or start the capture session without LLB.
}
نقاط أساسية حول هذا الرمز
lowLightBoostSessionهي الجلسة التي أنشأتها في مقالة إنشاء جلسة.- يحدّد
setSceneDetectorCallback()عنصر ردّ الاتصال الذي ينفّذ واجهةSceneDetectorCallback. تستدعي الجلسة الإجراءonSceneBrightnessChanged()الخاص بهذا العنصر عند تغيُّر سطوع المشهد. يجب أن يضبط التنفيذ واجهة مستخدم الكاميرا بشكل مناسب. - يمكنك تحديد
Executorلتشغيل رد الاتصال. إذا لم تحدّدExecutor، يتم تشغيل رد الاتصال على سلسلة المحادثات الرئيسية. في هذا الرمز، نفترض أنّlowLightBoostExecutorهوExecutorمناسب. lowLightBoostSession.getCameraSurface()تعرض الـSurfaceالذي يحتوي على الفيديو الذي تم تسجيله.
إيقاف الجلسة
عندما تتوقف الكاميرا عن النشاط، أوقِف جلسة "تحسين الإضاءة المنخفضة" من خلال استدعاء LowLightBoostSession.release(). على وجه الخصوص، يجب التأكّد من
إيقاف الجلسة عند إيقاف نشاطك. يمكنك إجراء ذلك من خلال استدعاء الإجراء في إجراء onDestroy() الخاص بالنشاط:
Kotlin
override protected void onDestroy() {
super.onDestroy()
if (lowLightBoostSession != null) {
lowLightBoostSession.release()
lowLightBoostSession = null
}
}
Java
@Override
protected void onDestroy() {
super.onDestroy();
if (lowLightBoostSession != null) {
lowLightBoostSession.release();
lowLightBoostSession = null;
}
}
نقاط أساسية حول هذا الرمز
- بعد إيقاف الجلسة، يجب عدم استدعاء أي من إجراءاتها. عليك محو أي متغيرات تشير إلى الجلسة، كما يفعل هذا الرمز.