طلب أذونات الأجهزة لنظارات الذكاء الاصطناعي

أجهزة XR المعنيّة
تساعدك هذه الإرشادات في إنشاء تجارب لهذه الأنواع من أجهزة الواقع الممتد.
نظارات AI Glasses

وكما هو الحال على الهاتف، يتطلّب الوصول إلى الأجهزة الحسّاسة، مثل الكاميرا والميكروفون، على نظارات الذكاء الاصطناعي موافقة صريحة من المستخدم. تُعدّ هذه الأذونات أذونات خاصة بالنظارات، ويجب أن يطلبها تطبيقك في وقت التشغيل، حتى إذا كان لديه الأذونات المقابلة على الهاتف.

اتّبِع هذا الدليل لتنفيذ ما يلي:

  • تضمين الأذونات في بيان تطبيقك
  • طلب الحصول على الأذونات
  • التعرّف على مسار المستخدم للحصول على الأذونات

تضمين الأذونات في بيان تطبيقك

قبل طلب الأذونات، يجب الإفصاح عنها في ملف البيان الخاص بتطبيقك باستخدام العنصر <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()
    }
}

النقاط الرئيسية حول الرمز

  • ننشئ ActivityResultLauncher باستخدام الطريقة ProjectedPermissionsResultContract(). يتلقّى إجراء الاستدعاء خريطة لأسماء الأذونات وحالات منحها.
  • تنشئ الدالة requestAudioPermission() عنصر ProjectedPermissionsRequestParams. يجمع هذا العنصر قائمة الأذونات التي نحتاج إليها والسبب الذي يظهر للمستخدم.
  • يؤدي طلب launch() على مشغّل التطبيقات إلى بدء مسار طلب الإذن من المستخدم.
  • يجب أن يتعامل تطبيقك مع نتائج منح الإذن ورفضه بشكل سليم في دالة معاودة الاتصال الخاصة بمشغّل التطبيق.

فهم مسار المستخدم لطلب الإذن

عند إرسال طلب للحصول على إذن باستخدام طريقة ProjectedPermissionsResultContract()، يبدأ النظام مسارًا منسّقًا للمستخدم على كل من نظارات الذكاء الاصطناعي والهاتف.

في ما يلي ما يمكن أن يتوقّعه تطبيقك والمستخدم أثناء مسار المستخدِم الخاص بالأذونات:

  1. على نظارات الذكاء الاصطناعي: يظهر نشاط على الجهاز المعروض (النظارات)، ويطلب من المستخدم النظر إلى هاتفه للمتابعة.

  2. على الهاتف: في الوقت نفسه، يتم تشغيل نشاط على الجهاز المضيف (الهاتف). تعرض هذه الشاشة سلسلة السبب التي قدّمتها وتمنح المستخدم خيار المتابعة أو الإلغاء.

  3. على الهاتف: إذا وافق المستخدم على السبب، سيظهر على الهاتف مربّع حوار معدَّل لأذونات نظام Android يوضّح للمستخدم أنّه يمنح الإذن لجهاز النظارات الذكية المستندة إلى الذكاء الاصطناعي (وليس للهاتف)، ويمكن للمستخدم منح الإذن أو رفضه رسميًا.

  4. تلقّي النتيجة: بعد أن يتخذ المستخدم قراره النهائي، يتم إغلاق الأنشطة على كل من الهاتف ونظارات الذكاء الاصطناعي. بعد ذلك، يتم استدعاء ActivityResultLauncher رد الاتصال مع خريطة تحتوي على حالة الإذن الممنوح لكل إذن مطلوب.