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ữ.
- 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.
- 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.requestPermissionsthay vì phương thứcActivityCompattiê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
deviceIdvới lệnh gọi lạionRequestPermissionsResultđể đả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ứcrequestPermissions.
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
deviceIdvới lệnh gọi lạionRequestPermissionsResultđể đả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.