Google Low Light Boost को चालू और बंद करने के लिए, कम रोशनी में बेहतर फ़ोटो लेने की सुविधा वाले सेशन का इस्तेमाल करें.
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 Google Play services
com.google.android.gms.cameralowlight पैकेज से उपलब्ध है. Google Play services के एपीआई ऐक्सेस करने के बारे में जानकारी पाने के लिए, Google
Play services का दस्तावेज़ देखें.
कॉलबैक ऑब्जेक्ट बनाना
कम रोशनी में बेहतर फ़ोटो लेने की सुविधा वाला सेशन बनाते समय, आपको उसे ऐसा
ऑब्जेक्ट पास करना होगा जो 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");
});
इस कोड के बारे में अहम जानकारी
- सेशन को कॉन्फ़िगर करने के लिए,
createSession()कोLowLightBoostOptionsऑब्जेक्ट पास करें. इस ऑब्जेक्ट में, टारगेट सर्फ़ेस, इस्तेमाल किए जाने वाले कैमरे का आईडी, और प्रीव्यू के डाइमेंशन जैसी चीज़ें तय की जाती हैं. - इस कोड में यह माना गया है कि आपने पहले ही Camera2 कैमरे से कनेक्शन खोला है,
और उस जानकारी का इस्तेमाल करके,
cameraId, previewWidth, previewHeightकी वैल्यू सेट की हैं. ज़्यादा जानकारी के लिए, Camera2 का दस्तावेज़ देखें. enableLowLightBoostएक बूलियन वैल्यू है. इससे यह तय होता है कि कम रोशनी में बेहतर फ़ोटो लेने की सुविधा चालू होनी चाहिए या बंद.createLowLightBoostCallbackएक ऐसा तरीका है जिसे कॉलबैक ऑब्जेक्ट बनाने के लिए लिखा जाता है. सेशन के डिसकनेक्ट या बंद होने पर, इस ऑब्जेक्ट को कॉल किया जाता है.- The method
LowLightBoostClient.createSession()returns aTaskऑब्जेक्ट. इस ऑब्जेक्ट का इस्तेमाल, सफलता और गड़बड़ी के बारे में सूचना देने वाले लिसनर सेट अप करने के लिए किया जाता है. सफलता के बारे में सूचना देने वाले लिसनर में, वीडियो कैप्चर करें. - लिसनर को चलाने के लिए,
Executorतय किया जा सकता है. अगर कोईExecutorतय नहीं किया जाता है, तो लिसनर मुख्य थ्रेड पर चलते हैं. इस कोड में, हम मानते हैं किlowLightBoostExecutorएक सहीExecutorहै.
कैप्चर के नतीजे पास करना
Google Low Light Boost को, कैमरे के कुछ मेटाडेटा की ज़रूरत होती है, ताकि यह पता चल सके कि रोशनी को कितना बढ़ाना है.
processCaptureResult() तरीके में, TotalCaptureResult पास करना ज़रूरी है.
onCaptureCompleted() कॉलबैक तरीके में, TotalCaptureResult पाया जा सकता है.
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);
}
}
};
इस कोड के बारे में अहम जानकारी
- इस कोड में, Google LLB से जुड़ा
CaptureCallbackकोड ही दिखाया गया है. इन कॉलबैक में, आपके पास अन्य कोड भी हो सकता है. TotalCaptureResultपास करने से, Google LLB, ऑटो एक्सपोज़र डेटा और अन्य मेटाडेटा का विश्लेषण कर पाता है. कम रोशनी में बेहतर फ़ोटो लेने की सुविधा के लिए, सीन का पता लगाना और यह तय करना ज़रूरी है कि फ़्रेम पर कितना बूस्ट लागू करना है.- कैमरे का सेशन बनाते समय,
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;
}
}
इस कोड के बारे में अहम जानकारी
- सेशन बंद होने के बाद, उसके किसी भी तरीके को कॉल नहीं करना चाहिए. आपको सेशन की ओर इशारा करने वाले सभी वैरिएबल मिटा देने चाहिए, जैसा कि इस कोड में किया गया है.