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 và micrô trên kính AI đòi hỏi phải 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.
Hãy làm theo hướng dẫn này để:
- Khai báo quyền trong tệp kê khai của ứng dụng
- Yêu cầu cấp quyền
- Tìm hiểu về quy trình cấp quyền cho người dùng
Khai báo các quyền trong tệp kê khai của ứng dụng
Trước khi yêu cầu cấp quyền, bạn phải khai báo các 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 vẫn giữ nguyên cho dù quyền đó là cho một tính năng dành riêng cho điện thoại hay kính AI, nhưng bạn vẫn phải yêu cầu quyền đó một cách rõ ràng đối với 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 microphone. -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<application ...>
...
</application>
</manifest>
Yêu cầu cấp quyền
Để yêu cầu cấp quyền cho kính AI, bạn sử dụng ActivityResultLauncher với phương thức ProjectedPermissionsResultContract(). Bạn cần chỉ định những quyền mà ứng dụng của bạn yêu cầu, chẳng hạn như Manifest.permission.CAMERA hoặc Manifest.permission.RECORD_AUDIO. Đưa ra lý do rõ ràng và ngắn gọn để giải thích lý do ứng dụng của bạn cần các quyền này. Lý do này sẽ được hiển thị cho người dùng để giúp họ đưa ra quyết định sáng suốt.
class SampleGlassesActivity : ComponentActivity() {
// Register the permissions launcher
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
// Check the result for the specific RECORD_AUDIO permission
if (results[Manifest.permission.RECORD_AUDIO] == true) {
onPermissionGranted()
} else {
onPermissionDenied()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Audio permission is critical for the displayless AI glasses experience
checkAndRequestAudioPermission()
setContent {
GlimmerTheme {
DisplayGlassesUi()
}
}
}
// Checks for the required RECORD_AUDIO permission and requests it if necessary.
private fun checkAndRequestAudioPermission() {
val permission = Manifest.permission.RECORD_AUDIO
val permissionStatus = ContextCompat.checkSelfPermission(this, permission)
if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
// Permission is already granted
onPermissionGranted()
} else {
// Permission is not granted, request it
requestAudioPermission()
}
}
private fun requestAudioPermission() {
val params = ProjectedPermissionsRequestParams(
permissions = listOf(Manifest.permission.RECORD_AUDIO),
// The rationale should explain why this permission is needed.
// For displayless AI glasses, it's often the main input mechanism.
rationale = "Microphone access is essential for voice commands and features on these AI glasses."
)
requestPermissionLauncher.launch(listOf(params))
}
private fun onPermissionGranted() {
// Implement the logic for when the permission is granted
}
private fun onPermissionDenied() {
// Implement the logic for when the permission is denied.
// On displayless AI glasses, if the app requires voice/mic it should exit the activity if the critical permission is denied.
finish()
}
}
Các điểm chính về mã
- Chúng ta tạo một
ActivityResultLauncherbằng phương thứcProjectedPermissionsResultContract(). Lệnh gọi lại sẽ nhận được một bản đồ tên quyền theo trạng thái được cấp. - Hàm
requestAudioPermission()tạo một đối tượngProjectedPermissionsRequestParams. Đối tượng này kết hợp danh sách các quyền mà chúng ta cần và lý do mà người dùng thấy được. - Việc gọi
launch()trên trình chạy sẽ kích hoạt luồng người dùng yêu cầu cấp quyền. - Ứng dụng của bạn phải xử lý cả kết quả được cấp và bị từ chối một cách thoả đáng trong lệnh gọi lại của trình chạy.
Tìm hiểu quy trình yêu cầu cấp quyền cho người dùng
Khi bạn khởi chạy một yêu cầu cấp quyền bằng phương thức ProjectedPermissionsResultContract(), hệ thống sẽ bắt đầu một quy trình phối hợp cho người dùng trên cả kính AI và điện thoại.
Trong luồng người dùng cấp quyền, đây là những điều mà ứng dụng và người dùng có thể mong đợi:
Trên kính AI: Một hoạt động xuất hiện trên thiết bị được chiếu (kính), hướng dẫn người dùng nhìn vào điện thoại để tiếp tục.
Trên điện thoại: Đồng thời, một hoạt động sẽ khởi chạy trên thiết bị lưu trữ (điện thoại). Màn hình này hiển thị chuỗi lý do mà bạn cung cấp và cho phép người dùng chọn tiếp tục hoặc huỷ.
Trên điện thoại: Nếu người dùng chấp nhận lý do, thì một hộp thoại cấp quyền hệ thống Android đã được sửa đổi sẽ xuất hiện trên điện thoại để cho người dùng biết rằng họ đang cấp quyền cho thiết bị kính AI (không phải điện thoại) và người dùng có thể chính thức cấp hoặc từ chối quyền.
Nhận kết quả: Sau khi người dùng đưa ra lựa chọn cuối cùng, các hoạt động trên cả điện thoại và kính AI sẽ bị loại bỏ. Sau đó, lệnh gọi lại
ActivityResultLaunchercủa bạn sẽ được gọi bằng một bản đồ chứa trạng thái được cấp cho từng quyền được yêu cầu.