Sử dụng phiên tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng để bật và tắt tính năng Tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng của 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 được cung cấp bởi gói
com.google.android.gms.cameralowlight của Dịch vụ Google Play. 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 các API của Dịch vụ Google Play.
Tạo đối tượng gọi lại
Khi tạo phiên tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng, bạn cần phải truyền 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;
}
Những đ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 chất lượng ảnh chụp trong điều kiện thiếu sáng, 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ỷ. Lệnh gọi lại không được gọi khi phiên được tạo. Để kiểm tra xem phiên đã được
tạo thành công hay chưa, hãy kiểm tra đối tượng
TaskdoLowLightBoostClient.createSessiontrả về.
Tạo phiên
Để tạo phiên chụp trong điều kiện 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");
});
Những đ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 những nội dung như bề mặt mục tiêu, mã nhận dạng của camera 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ở kết nối với camera 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. enableLowLightBoostlà một giá trị boolean chỉ định xem tính năng tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng sẽ bắt đầu bật hay tắt.createLowLightBoostCallbacklà 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ề đố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à thất bại. Ghi lại 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 tôi giả địnhlowLightBoostExecutorlà mộtExecutorphù hợp.
Truyền kết quả chụp
Tính năng Tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng của Google cần một số siêu dữ liệu camera để biết mức độ làm sáng chính xác cần áp dụng. Bạn phải truyền TotalCaptureResult đến
processCaptureResult() phương thức. Bạn có thể nhận TotalCaptureResult trong
phương thức gọi lại 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);
}
}
};
Những điểm chính về mã này
- Mã này chỉ hiển thị mã
CaptureCallbackcó liên quan đến tính năng Tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng của Google. Bạn có thể có mã khác trong các lệnh gọi lại này. - Việc truyền
TotalCaptureResultcho phép tính năng Tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng của Google phân tích dữ liệu phơi sáng tự động và các siêu dữ liệu khác cần thiết để tính năng tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng xử lý việc phát hiện cảnh và xác định mức độ tăng cường cần áp dụng cho khung hình. - Bạn nên truyền đối tượng
captureCallbackkhi tạo phiên camera, chẳng hạn như với `setSingleRepeatingRequest().
Bắt đầu bản xem trước camera
Sau khi tạo phiên chụp trong điều kiện thiếu sáng, bạn có thể bắt đầu luồng xem trước camera. Bạn nên thực hiện việc này bên trong lệnh gọi lại onSuccess() mà bạn truyền đến phiên chụp trong điều kiện thiếu sáng, như mô tả trong phần Tạo phiên. Mã sau đây cho biết cách ghi lại 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.
}
Những điểm chính về mã này
lowLightBoostSessionlà phiên 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ủa cảnh thay đổi. Cách triển khai của bạn phải điều chỉnh giao diện người dùng của camera 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 tôi giả địnhlowLightBoostExecutorlà mộtExecutorphù hợp. lowLightBoostSession.getCameraSurface()trả vềSurfacecó video đã ghi.
Phát hành phiên
Khi camera không còn hoạt động, hãy phát hành phiên tăng cường chất lượng ảnh chụp trong điều kiện thiếu sáng bằng cách gọi LowLightBoostSession.release(). Cụ thể, bạn nên đảm bảo phát hành phiên khi hoạt động của bạn 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;
}
}
Những điểm chính về mã này
- Sau khi phát hành phiên, bạn không nên gọi bất kỳ phương thức nào của phiên đó. Bạn nên xoá mọi biến trỏ đến phiên, như mã này.