ऑडियो ग्लास और डिसप्ले ग्लास के लिए, हार्डवेयर से जुड़ी अनुमतियों का अनुरोध करना

एक्सआर डिवाइसों पर लागू होने वाली सुविधाएँ
इन दिशा-निर्देशों से, आपको इस तरह के एक्सआर डिवाइसों के लिए अनुभव बनाने में मदद मिलती है.
ऑडियो और
डिसप्ले ग्लास

फ़ोन की तरह ही, ऑडियो ग्लास और डिसप्ले ग्लास पर कैमरा और माइक्रोफ़ोन जैसे संवेदनशील हार्डवेयर को ऐक्सेस करने के लिए, उपयोगकर्ता की साफ़ तौर पर सहमति लेना ज़रूरी है. इन्हें स्मार्ट ग्लास के लिए खास अनुमतियां माना जाता है. आपके ऐप्लिकेशन को रनटाइम के दौरान इनके लिए अनुरोध करना होगा. भले ही, फ़ोन पर पहले से ही ये अनुमतियां मौजूद हों.

अपने ऐप्लिकेशन के मेनिफ़ेस्ट में अनुमतियों का एलान करना

अनुमतियों का अनुरोध करने से पहले, आपको उन्हें अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में एलान करना होगा. इसके लिए, <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 कॉलबैक को शुरू किया जाता है.

सिस्टम, प्रोजेक्ट की गई कंपैनियन ऐक्टिविटी को अपने-आप बंद कर देता है. ऑडियो ग्लास पर, यह ऑडियो अलर्ट खत्म होने के बाद होता है. डिस्प्ले ग्लास पर, यह तब होता है, जब उपयोगकर्ता अनुमति वाले सभी डायलॉग बॉक्स का जवाब दे देता है.

जवाब को मैनेज करने के लिए, अनुमति का अनुरोध करने वाले Activity इंस्टेंस में onRequestPermissionsResult() को बदलें.

नीचे दिए गए कोड स्निपेट में, कॉलबैक को मैनेज करने और यह पुष्टि करने का तरीका बताया गया है कि उपयोगकर्ता ने अनुरोध की गई अनुमतियां दी हैं या नहीं:

@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()
    }
}

कोड के बारे में अहम बातें
  • onRequestPermissionsResult कॉलबैक के साथ deviceId ओवरलोड का इस्तेमाल करें. इससे यह पक्का किया जा सकेगा कि अनुमति की स्थिति को किसी खास कॉन्टेक्स्ट के साथ सही तरीके से मैप किया गया है. जैसे, होस्ट फ़ोन के बजाय ऑडियो या डिसप्ले ग्लास.
  • आपके ऐप्लिकेशन को, अनुमति दिए जाने और अनुमति न दिए जाने, दोनों ही स्थितियों में बेहतर तरीके से काम करना चाहिए.

फ़ोन ऐक्टिविटी में रनटाइम अनुमतियों का अनुरोध करना

अगर आपका ऐप्लिकेशन फ़ोन पर चल रहा है, लेकिन उसे ऑडियो या डिसप्ले ग्लास की अनुमतियों की ज़रूरत है, तो डिवाइस के हिसाब से तरीके का इस्तेमाल करके अनुमतियों का अनुरोध करें. उदाहरण के लिए, अगर किसी उपयोगकर्ता को वीडियो स्ट्रीम को ग्लास के कैमरे पर स्विच करने की अनुमति देनी है, ताकि वह पहले व्यक्ति के नज़रिए से वीडियो देख सके, तो डिवाइस के हिसाब से 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 कॉलबैक को शुरू किया जाता है.

जवाब को मैनेज करने के लिए, अनुमति का अनुरोध करने वाले Activity इंस्टेंस में onRequestPermissionsResult को बदलें.

यहां दिए गए कोड स्निपेट से पता चलता है कि कॉलबैक को कैसे मैनेज किया जाए और यह कैसे पुष्टि की जाए कि उपयोगकर्ता ने अनुरोध की गई अनुमतियां दी हैं या नहीं:

@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 कॉलबैक के साथ करें, ताकि यह पक्का किया जा सके कि अनुमति की स्थिति को किसी खास कॉन्टेक्स्ट के साथ सही तरीके से मैप किया गया है. जैसे, होस्ट फ़ोन के बजाय ऑडियो या डिसप्ले ग्लास.
  • आपके ऐप्लिकेशन को, अनुमति दिए जाने और अनुमति न दिए जाने, दोनों ही स्थितियों में बेहतर तरीके से काम करना चाहिए.