درست مانند تلفن، دسترسی به سختافزارهای حساس مانند دوربین و میکروفون در عینکهای هوش مصنوعی نیاز به رضایت صریح کاربر دارد. اینها مجوزهای مخصوص عینک محسوب میشوند و برنامه شما باید در زمان اجرا آنها را درخواست کند، حتی اگر از قبل مجوزهای مربوطه را در تلفن داشته باشد.
این راهنما را دنبال کنید تا:
- مجوزها را در مانیفست برنامه خود اعلام کنید
- درخواست مجوز
- آشنایی با جریان دسترسیهای کاربر
مجوزها را در مانیفست برنامه خود اعلام کنید
قبل از درخواست مجوزها، باید آنها را در فایل مانیفست برنامه خود با استفاده از عنصر <uses-permission> اعلام کنید. این اعلام چه برای تلفن باشد و چه برای یک ویژگی خاص عینک هوش مصنوعی، یکسان باقی میماند، اما همچنان باید صریحاً آن را برای سختافزار یا عملکرد خاص عینک درخواست کنید.
<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>
درخواست مجوز
برای درخواست مجوز برای عینکهای هوش مصنوعی، از ActivityResultLauncher به همراه متد ProjectedPermissionsResultContract() استفاده میکنید. باید مشخص کنید که برنامه شما به چه مجوزهایی نیاز دارد، مانند Manifest.permission.CAMERA یا Manifest.permission.RECORD_AUDIO . یک دلیل واضح و مختصر ارائه دهید که توضیح دهد چرا برنامه شما به این مجوزها نیاز دارد. این دلیل به کاربر نمایش داده میشود تا به او در تصمیمگیری آگاهانه کمک کند.
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()
}
}
نکات کلیدی در مورد کد
- ما با استفاده از متد
ProjectedPermissionsResultContract()یکActivityResultLauncherایجاد میکنیم. تابع فراخوانی، نگاشتی از نامهای مجوزها را به وضعیتهای اعطا شدهشان دریافت میکند. - تابع
requestAudioPermission()یک شیءProjectedPermissionsRequestParamsمیسازد. این شیء فهرست مجوزهای مورد نیاز و منطق کاربر را در خود جای داده است. - فراخوانی
launch()در لانچر، درخواست مجوز کاربر را فعال میکند. - برنامهی شما باید نتایج اعطا شده و رد شده را به خوبی در فراخوانی لانچر مدیریت کند.
جریان درخواست مجوز کاربر را درک کنید
وقتی با استفاده از متد ProjectedPermissionsResultContract() درخواست مجوزی را ارسال میکنید، سیستم یک جریان کاربری هماهنگ را در عینک هوش مصنوعی و گوشی آغاز میکند.
اگر برنامه شما از قبل یک Activity نمایش داده شده روی گوشی دارد، باید از Activity#requestPermissions(permissions, requestCode, deviceId) استفاده کنید، که در آن deviceId از فراخوانی متد getDeviceId() روی Context که با فراخوانی ProjectedContext.createProjectedDeviceContext() برگردانده میشود، به دست میآید.
در طول جریان دسترسیهای کاربر، آنچه برنامه شما و کاربر میتوانند انتظار داشته باشند، به شرح زیر است:
روی عینک هوش مصنوعی : فعالیتی روی دستگاه نمایش داده شده (عینک) ظاهر میشود و به کاربر دستور میدهد برای ادامه به تلفن خود نگاه کند.
tts?.speak("Please review the permission request on your host device", TextToSpeech.QUEUE_ADD, null, "permission_request")روی گوشی : همزمان، یک فعالیت روی دستگاه میزبان (گوشی) اجرا میشود. این صفحه رشتهی منطقی که شما ارائه کردهاید را نمایش میدهد و به کاربر امکان ادامه یا لغو را میدهد.
در تلفن : اگر کاربر منطق را بپذیرد، یک پنجرهی مجوز سیستم اندروید اصلاحشده روی تلفن ظاهر میشود که به کاربر میگوید مجوز را برای دستگاه عینک هوش مصنوعی (نه تلفن) اعطا میکند و کاربر میتواند رسماً مجوز را اعطا یا رد کند.
دریافت نتیجه : پس از اینکه کاربر انتخاب نهایی خود را انجام داد، فعالیتهای روی گوشی و عینک هوش مصنوعی رد میشوند. سپس تابع فراخوانی
ActivityResultLauncherشما با نقشهای حاوی وضعیت اعطا شده برای هر مجوز درخواستی فراخوانی میشود.