درخواست اجازه سخت‌افزار برای عینک‌های صوتی و عینک‌های نمایشگر

دستگاه‌های XR واجدشرایط
این راهنمایی به شما کمک می‌کند برای این نوع دستگاه‌های واقعیت گسترده تجربه بسازید.
عینک
نمایشگردار و صوتی

درست مانند تلفن، دسترسی به سخت‌افزار حساس مانند دوربین در عینک صوتی و عینک نمایشگردار مستلزم رضایت صریح کاربر است. این اجازه‌ها اجازه‌های مختص عینک درنظر گرفته می‌شوند و برنامه‌تان باید آن‌ها را در زمان اجرا درخواست کند، حتی اگر قبلاً اجازه‌های مربوطه را در تلفن داشته باشد.

اجازه‌ها را در مانیفست برنامه‌تان اعلام کنید

پیش‌از درخواست اجازه‌ها، باید آن‌ها را در مانیفست برنامه‌تان بااستفاده از عنصر <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 استفاده کنید.

فراخوانی این روش باعث راه‌اندازی جریان کاربر هماهنگ‌شده در عینک و تلفن میزبان می‌شود.

  1. در عینک: سیستم یک فعالیت همراه پیش‌بینی‌شده را در عینک باز می‌کند و به کاربر دستور می‌دهد تا تلفن خود را برای پاسخ به درخواست اجازه بررسی کند.
  2. در تلفن: کادر گفتگوی اجازه سیستم 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 استفاده کنید تا مطمئن شوید وضعیت اجازه به‌درستی به بافت خاص نگاشت شده است، مثلاً عینک صوتی یا نمایشگردار به‌جای تلفن میزبان.
  • برنامه شما باید نتایج اعطاشده و ردشده را به‌درستی مدیریت کند.