استخدِم جلسة "تحسين الإضاءة المنخفضة" لتفعيل ميزة "تحسين الإضاءة المنخفضة" من 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")
}
Groovy
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".
إنشاء عنصر ردّ الاتصال
عند إنشاء جلسة تحسين الإضاءة المنخفضة، عليك تمرير عنصر إليها ينفّذ واجهة 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 LLB. من المحتمل أن يكون لديك رمز آخر في عمليات معاودة الاتصال هذه. - يسمح تمرير
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;
}
}
نقاط أساسية حول هذا الرمز
- بعد إيقاف الجلسة، يجب عدم استدعاء أي من إجراءاتها. عليك محو أي متغيرات تشير إلى الجلسة، كما يفعل هذا الرمز.