Yêu cầu cấp quyền truy cập phần cứng cho kính âm thanh và kính hiển thị

Các thiết bị XR được hỗ trợ
Hướng dẫn này giúp bạn xây dựng các trải nghiệm cho những loại thiết bị XR sau.
Kính có màn hình
và âm thanh

Cũng giống như trên điện thoại, việc truy cập vào phần cứng nhạy cảm như camera trên kính phát âm thanh và kính có màn hình cần có sự đồng ý rõ ràng của người dùng. Đây được coi là các quyền dành riêng cho kính và ứng dụng của bạn phải yêu cầu các quyền này trong thời gian chạy, ngay cả khi ứng dụng đã có các quyền tương ứng trên điện thoại.

Khai báo quyền trong tệp kê khai của ứng dụng

Trước khi yêu cầu quyền, bạn phải khai báo quyền trong tệp kê khai của ứng dụng bằng phần tử <uses-permission>. Nội dung khai báo này không thay đổi cho dù quyền đó là dành cho điện thoại hay tính năng dành riêng cho kính, nhưng bạn vẫn phải yêu cầu rõ ràng quyền đó cho phần cứng hoặc chức năng dành riêng cho kính.

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for the camera. -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application ...>
        ...
    </application>
</manifest>

Trước khi yêu cầu cấp quyền cho kính

Xem lại nguyên tắc và quy trình cấp quyền để đảm bảo bạn cung cấp trải nghiệm tốt nhất cho người dùng, chẳng hạn như kiểm tra xem người dùng đã cấp quyền khi bắt đầu chạy mà ứng dụng của bạn yêu cầu hay chưa và liệu ứng dụng của bạn có nên cho biết lý do với người dùng trước khi yêu cầu cấp quyền dành riêng cho kính hay không.

Các trường hợp cấp quyền

Có nhiều trường hợp bạn có thể gặp phải khi yêu cầu quyền nguy hiểm khi bắt đầu chạy trên kính có màn hình và âm thanh:

  • Yêu cầu quyền khi bắt đầu chạy từ một hoạt động được chiếu
  • Yêu cầu quyền khi bắt đầu chạy từ một hoạt động trên điện thoại

Hãy xem các phần sau trong hướng dẫn này để biết thông tin chi tiết về từng trường hợp.

Yêu cầu quyền khi bắt đầu chạy từ một hoạt động được chiếu

Để yêu cầu quyền khi bắt đầu chạy đối với âm thanh hoặc kính có màn hình từ một hoạt động được chiếu, hãy sử dụng phương thức ProjectedActivityCompat.requestPermissions.

Việc gọi phương thức này sẽ kích hoạt một luồng người dùng phối hợp trên cả kính và điện thoại lưu trữ.

  1. Trên kính: Hệ thống sẽ mở một hoạt động đồng hành được chiếu trên kính, hướng dẫn người dùng kiểm tra điện thoại để phản hồi yêu cầu cấp quyền.
  2. Trên điện thoại: Hộp thoại cấp quyền của hệ thống Android sẽ xuất hiện trên màn hình điện thoại. Hộp thoại cho biết rõ ràng rằng người dùng đang cấp quyền cho kính chứ không phải cho điện thoại. Sau đó, người dùng có thể cấp hoặc từ chối yêu cầu.

Ví dụ sau đây cho thấy cách yêu cầu cấp quyền cho kính từ một hoạt động được chiếu:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
private fun requestCameraPermission() {
    lifecycleScope.launch {
        try {
            ProjectedActivityCompat.requestPermissions(
                this@PermissionsFromProjectedActivity,
                arrayOf(Manifest.permission.CAMERA),
                // CAMERA_PERMISSION_REQUEST_CODE is a developer defined constant
                CAMERA_PERMISSION_REQUEST_CODE,
            )
        } catch (e: IllegalStateException) {
            // Thrown when the projected system service can't be bound.
            Log.e(TAG, "Camera permission request failed: projected service unavailable.", e)
        }
    }
}

Các điểm chính về mã

  • Sử dụng ProjectedActivityCompat.requestPermissions thay vì phương thức ActivityCompat tiêu chuẩn. Phương thức này nhắm mục tiêu rõ ràng đến các quyền khi bắt đầu chạy đối với âm thanh và kính có màn hình thay vì điện thoại lưu trữ.

Xử lý kết quả cấp quyền

Sau khi người dùng phản hồi hộp thoại cấp quyền trên điện thoại, quyết định của họ sẽ được gửi đến ứng dụng của bạn bằng cách gọi lệnh gọi lại onRequestPermissionsResult.

Hệ thống sẽ tự động đóng hoạt động đồng hành được chiếu. Trên kính phát âm thanh, điều này xảy ra sau khi cảnh báo bằng âm thanh phát xong. Trên kính có màn hình, điều này xảy ra sau khi người dùng phản hồi tất cả hộp thoại cấp quyền.

Để xử lý phản hồi, hãy ghi đè onRequestPermissionsResult() trong thực thể Activity đã bắt đầu yêu cầu cấp quyền.

Đoạn mã sau đây cho thấy cách xử lý lệnh gọi lại và xác minh xem người dùng đã cấp các quyền được yêu cầu hay chưa:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray,
    deviceId: Int,
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
    if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

Các điểm chính về mã
  • Sử dụng phương thức nạp chồng deviceId với lệnh gọi lại onRequestPermissionsResult để đảm bảo trạng thái quyền được liên kết chính xác với bối cảnh cụ thể, chẳng hạn như kính âm thanh hoặc kính có màn hình thay vì điện thoại lưu trữ.
  • Ứng dụng của bạn phải xử lý linh hoạt cả kết quả được cấp và bị từ chối.

Yêu cầu quyền khi bắt đầu chạy trong một hoạt động trên điện thoại

Nếu ứng dụng của bạn đang chạy trong một hoạt động trên điện thoại nhưng cần có quyền truy cập vào âm thanh hoặc kính có màn hình (ví dụ: để cho phép người dùng chuyển luồng video sang camera của kính để có góc nhìn thứ nhất), hãy yêu cầu cấp quyền bằng phương thức Activity#requestPermissions(permissions, requestCode, deviceId) dành riêng cho thiết bị:

// Request the projected permission from phone activity
requestPermissions(
    arrayOf(Manifest.permission.CAMERA),
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant
    REQUEST_CODE_GLASSES_CAMERA,
    projectedDeviceId
)

Các điểm chính về mã

  • Để nhắm đến kính có màn hình và âm thanh, hãy lấy mã thiết bị thích hợp từ một bối cảnh dự kiến mà bạn đã tạo bằng createProjectedDeviceContext. Truyền mã nhận dạng này cùng với lệnh gọi đến phương thức requestPermissions.

Xử lý kết quả cấp quyền

Sau khi người dùng phản hồi hộp thoại cấp quyền trên điện thoại, quyết định của họ sẽ được gửi đến ứng dụng của bạn bằng cách gọi lệnh gọi lại onRequestPermissionsResult.

Để xử lý phản hồi, hãy ghi đè onRequestPermissionsResult trong thực thể Activity đã bắt đầu yêu cầu cấp quyền.

Đoạn mã sau đây cho thấy cách xử lý lệnh gọi lại và xác minh xem người dùng có cấp các quyền được yêu cầu hay không:

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray,
    deviceId: Int,
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
    if (requestCode != CAMERA_PERMISSION_REQUEST_CODE) return

    val isCameraGranted =
        grantResults.getOrNull(permissions.indexOf(Manifest.permission.CAMERA)) ==
            PackageManager.PERMISSION_GRANTED

    if (isCameraGranted) {
        initializeCameraFeatures()
    } else {
        onCameraPermissionDenied()
    }
}

Các điểm chính về mã
  • Sử dụng phương thức nạp chồng deviceId với lệnh gọi lại onRequestPermissionsResult để đảm bảo trạng thái quyền được liên kết chính xác với bối cảnh cụ thể, chẳng hạn như kính âm thanh hoặc kính có màn hình thay vì điện thoại lưu trữ.
  • Ứng dụng của bạn phải xử lý linh hoạt cả kết quả được cấp và bị từ chối.