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