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

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