درست مانند تلفن، دسترسی به سختافزار حساس مانند دوربین و میکروفون در عینک صوتی و عینک نمایشگردار مستلزم رضایت صریح کاربر است. این اجازهها اجازههای مختص عینک درنظر گرفته میشوند و برنامهتان باید آنها را در زمان اجرا درخواست کند، حتی اگر قبلاً اجازههای مربوطه را در تلفن داشته باشد.
اجازهها را در مانیفست برنامهتان اعلام کنید
قبلاز درخواست اجازهها، باید آنها را در مانیفست برنامهتان
بااستفاده از عنصر <uses-permission> اعلام کنید. این اظهارنامه چه اجازه مربوط به ویژگی تلفن باشد چه ویژگی عینک، یکسان است، اما
همچنان باید آن را بهطور صریح برای سختافزار یا عملکرد مختص عینک درخواست کنید.
<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>
قبلاز درخواست اجازههای عینک
اصول و گردشهای کار اجازه را مرور کنید تا مطمئن شوید بهترین تجربه را برای کاربران خود فراهم میکنید، مثلاً بررسی کنید که آیا کاربر قبلاً اجازههای زمان اجرا را که برنامه شما نیاز دارد اعطا کرده است یا نه و آیا برنامه شما باید قبلاز درخواست اجازههای ویژه عینک، دلیل آن را به کاربر نشان دهد یا نه.
سناریوهای اجازه
هنگام درخواست اجازههای زمان اجرای خطرناک در عینکهای صوتی و نمایشگر، ممکن است با سناریوهای مختلفی مواجه شوید:
- درخواست اجازههای زمان اجرا از فعالیت پیشبینیشده
- درخواست اجازههای زمان اجرا از فعالیت تلفن
برای جزئیات مربوط به هر سناریو، بخشهای زیر را در این راهنما ببینید.
درخواست اجازههای زمان اجرا از فعالیت پیشبینیشده
برای درخواست اجازههای زمان اجرا برای عینک نمایشگردار یا صوتی از فعالیت فرافکنیشده،
از روش ProjectedActivityCompat.requestPermissions استفاده کنید.
فراخوانی این روش باعث راهاندازی یک جریان کاربر هماهنگ در عینک و تلفن میزبان میشود.
- در عینک: سیستم یک فعالیت همراه پیشبینیشده را در عینک باز میکند و به کاربر دستور میدهد تلفن خود را برای پاسخ به درخواست اجازه بررسی کند.
- در تلفن: کادر گفتگوی اجازه سیستم Android در صفحه تلفن ظاهر میشود. کادر گفتگو بهطور صریح نشان میدهد که کاربر اجازه را برای عینک اعطا میکند نه برای خود تلفن. سپس کاربر میتواند درخواست را بپذیرد یا رد کند.
مثال زیر نحوه درخواست اجازههای عینک از یک فعالیت پخششده را نشان میدهد:
@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) } } }
نکات کلیدی درباره کد
- بهجای روش استاندارد
ActivityCompatازProjectedActivityCompat.requestPermissionsاستفاده کنید. این روش بهطور صریح اجازههای زمان اجرا را برای عینک نمایشگردار و صدا هدف قرار میدهد، نه تلفن میزبان.
مدیریت نتایج اجازه
وقتی کاربر به کادر گفتگوی اجازه در تلفن پاسخ میدهد، تصمیم او با فراخوانی
بازگشت تماس onRequestPermissionsResult به برنامه شما ارسال میشود.
سیستم فعالیت همراه فرافکنیشده را بهطور خودکار میبندد. در عینک صوتی، این اتفاق پساز پایان پخش هشدار صوتی رخ میدهد. در عینکهای نمایشگر، این اتفاق پساز پاسخ کاربر به همه کادرهای گفتگوی اجازه رخ میدهد.
برای رسیدگی به پاسخ، onRequestPermissionsResult() را در نمونه Activity که درخواست اجازه را آغاز کرده است لغو کنید.
تکه کد زیر نحوه مدیریت کردن تماس برگشتی و تأیید اینکه آیا کاربر اجازههای درخواستی را اعطا کرده است یا نه را نشان میدهد:
@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() } }
نکات کلیدی درباره کد
- از سربارگذاری
deviceIdبا فراخوانی برگشتیonRequestPermissionsResultاستفاده کنید تا مطمئن شوید وضعیت اجازه بهدرستی به بافت خاصی نگاشت شده است، مثلاً به عینک نمایشگردار یا صوتی بهجای تلفن میزبان. - برنامه شما باید نتایج اعطاشده و ردشده را بهخوبی مدیریت کند.
درخواست اجازههای زمان اجرا در فعالیت تلفن
اگر برنامه شما در فعالیت تلفن اجرا میشود اما برای عینکهای صوتی یا
نمایشگر اجازه میخواهد—برای مثال، برای اینکه به کاربر اجازه دهد جاریسازی ویدیو را به دوربین عینک
برای دید اولشخص تغییر دهد—اجازهها را بااستفاده از روش Activity#requestPermissions(permissions, requestCode,
deviceId) مختص دستگاه درخواست کنید:
// 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 )
نکات کلیدی درباره کد
- برای هدفیابی عینکهای صوتی و نمایشی، شناسه دستگاه مناسب را از بافت
پیشبینیشدهای که بااستفاده از
createProjectedDeviceContextایجاد کردهاید دریافت کنید. این شناسه را با فراخوانی به متدrequestPermissionsارسال کنید.
مدیریت نتایج اجازه
وقتی کاربر به کادر گفتگوی اجازه در تلفن پاسخ میدهد، تصمیم او با فراخوانی
بازگشت تماس onRequestPermissionsResult به برنامه شما ارسال میشود.
برای مدیریت پاسخ، onRequestPermissionsResult را در نمونه Activity که درخواست اجازه را آغاز کرده است ملغی کنید.
تکه کد زیر نحوه مدیریت کردن تماس برگشتی و تأیید اینکه آیا کاربر اجازههای درخواستی را اعطا کرده است یا نه را نشان میدهد:
@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() } }
نکات کلیدی درباره کد
- از سربارگذاری
deviceIdبا فراخوانی برگشتیonRequestPermissionsResultاستفاده کنید تا مطمئن شوید وضعیت اجازه بهدرستی به بافت خاص نگاشت شده است، مثلاً عینک صوتی یا نمایشگردار بهجای تلفن میزبان. - برنامه شما باید نتایج اعطاشده و ردشده را بهدرستی مدیریت کند.