Sử dụng phiên tăng cường ánh sáng yếu để bật và tắt tính năng Tăng cường ánh sáng yếu của Google.
Kotlin
dependencies {
val low_light_boost_version = "16.0.0-beta01"
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.0-beta01"
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
do gói com.google.android.gms.cameralowlight
của Dịch vụ Google Play cung cấp. Hãy xem tài liệu về Dịch vụ Google Play để biết thông tin về cách truy cập vào API Dịch vụ Google Play.
Tạo đối tượng gọi lại
Khi tạo phiên tăng cường ánh sáng yếu, bạn cần truyền cho phiên này một đối tượng triển khai giao diện LowLightBoostCallback
.
Các hàm của đối tượng này được gọi khi phiên bị ngắt kết nối hoặc bị huỷ. Mã sau đây cho biết cách tạo lệnh gọi lại:
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;
}
Các điểm chính về mã này
- Mã này xác định một phương thức riêng tư,
createLowLightBoostCallback()
, tạo đối tượng gọi lại. Bạn sẽ gọi phương thức đó khi thực sự tạo phiên tăng cường ánh sáng yếu, như mô tả trong phần Tạo phiên. - Lệnh gọi lại được gọi khi phiên bị ngắt kết nối hoặc bị huỷ. Phương thức này không được gọi khi phiên được tạo. Để kiểm tra xem phiên có được tạo thành công hay không, hãy kiểm tra đối tượng
Task
doLowLightBoostClient.createSession
trả về.
Tạo phiên
Để tạo một phiên chụp thiếu sáng, hãy gọi phương thức 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");
});
Các điểm chính về mã này
- Bạn truyền đối tượng
LowLightBoostOptions
đếncreateSession()
để định cấu hình phiên. Đối tượng này chỉ định các thông tin như mặt phẳng mục tiêu, mã nhận dạng của máy ảnh cần sử dụng và kích thước của bản xem trước. - Mã này giả định rằng bạn đã mở một kết nối với máy ảnh Camera2 và sử dụng thông tin đó để đặt giá trị của
cameraId, previewWidth, previewHeight
. Để biết thêm thông tin, hãy xem tài liệu về Camera2. enableLowLightBoost
là một giá trị boolean chỉ định xem tính năng tăng cường ánh sáng yếu có bắt đầu bật hay tắt hay không.createLowLightBoostCallback
là một phương thức mà bạn viết để tạo đối tượng gọi lại. Đối tượng này được gọi khi phiên bị ngắt kết nối hoặc bị huỷ.- Phương thức
LowLightBoostClient.createSession()
trả về một đối tượngTask
. Bạn sử dụng đối tượng này để thiết lập trình nghe thành công và không thành công. Quay video bên trong trình nghe thành công. - Bạn có thể chỉ định
Executor
để chạy trình nghe. Nếu bạn không chỉ địnhExecutor
, trình nghe sẽ chạy trên luồng chính. Trong mã này, chúng ta giả địnhlowLightBoostExecutor
là mộtExecutor
phù hợp.
Bắt đầu xem trước của máy ảnh
Sau khi tạo một phiên ánh sáng yếu, bạn có thể bắt đầu luồng xem trước của máy ảnh. Bạn nên thực hiện việc này trong lệnh gọi lại onSuccess()
mà bạn truyền đến phiên ánh sáng yếu, như mô tả trong phần Tạo phiên. Mã sau đây cho biết cách quay video:
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.
}
Các điểm chính về mã này
lowLightBoostSession
là phiên mà bạn đã tạo trong phần Tạo phiên.setSceneDetectorCallback()
xác định một đối tượng gọi lại triển khai giao diệnSceneDetectorCallback
. Phiên gọi phương thứconSceneBrightnessChanged()
của đối tượng đó khi độ sáng cảnh thay đổi. Quá trình triển khai của bạn phải điều chỉnh giao diện người dùng của máy ảnh cho phù hợp.- Bạn có thể chỉ định
Executor
để chạy lệnh gọi lại. Nếu bạn không chỉ địnhExecutor
, lệnh gọi lại sẽ chạy trên luồng chính. Trong mã này, chúng ta giả địnhlowLightBoostExecutor
là mộtExecutor
phù hợp. lowLightBoostSession.getCameraSurface()
trả vềSurface
cùng với video đã quay.
Giải phóng phiên
Khi máy ảnh không còn hoạt động, hãy giải phóng phiên tăng cường ánh sáng yếu bằng cách gọi LowLightBoostSession.release()
. Cụ thể, bạn phải đảm bảo giải phóng phiên khi hoạt động của mình bị huỷ. Bạn có thể thực hiện việc này bằng cách gọi phương thức trong phương thức onDestroy()
của hoạt động:
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;
}
}
Các điểm chính về mã này
- Sau khi phiên phát được phát hành, bạn không nên gọi bất kỳ phương thức nào của phiên phát đó. Bạn nên xoá mọi biến trỏ đến phiên, như mã này.