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

XR डिवाइसों के लिए ज़रूरी शर्तें
इस गाइड की मदद से, इन 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>

स्मार्ट ग्लास के लिए अनुमतियों का अनुरोध करने से पहले

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

अनुमति के अनुरोध से जुड़े अलग-अलग मामले

ऑडियो और डिसप्ले वाले चश्मे पर, रनटाइम में जोखिम वाली अनुमतियों का अनुरोध करते समय, आपको अलग-अलग मामले देखने को मिल सकते हैं:

  • प्रोजेक्ट की गई किसी ऐक्टिविटी से, रनटाइम में अनुमतियों का अनुरोध करना
  • फ़ोन की किसी ऐक्टिविटी से, रनटाइम में अनुमतियों का अनुरोध करना

हर मामले के बारे में ज़्यादा जानकारी पाने के लिए, इस गाइड में दिए गए ये सेक्शन देखें.

प्रोजेक्ट की गई किसी ऐक्टिविटी से, रनटाइम में अनुमतियों का अनुरोध करना और उन्हें मैनेज करना

ऑडियो वाले चश्मे और डिसप्ले वाले चश्मे के लिए अनुमतियों का अनुरोध करने के लिए, सबसे पहले, अनुमतियों के लॉन्चर को रजिस्टर करने के लिए, ProjectedPermissionsResultContract तरीके के साथ ActivityResultLauncher का इस्तेमाल करें. जब उपयोगकर्ता, अनुमति के अनुरोध पर कार्रवाई कर लेता है, तब कॉलबैक को, अनुमति के नामों से लेकर उनकी दी गई स्थिति तक का मैप मिलता है.

// Register the permissions launcher using the ProjectedPermissionsResultContract.
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
    registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
        if (results[Manifest.permission.CAMERA] == true) {
            isPermissionDenied = false
            initializeGlassesFeatures()
        } else {
            // Handle permission denial.
            isPermissionDenied = true
        }
    }

कोड के बारे में अहम बातें

  • आपको यह बताना होगा कि आपके ऐप्लिकेशन को किन अनुमतियों की ज़रूरत है. जैसे, Manifest.permission.CAMERA या Manifest.permission.RECORD_AUDIO.
  • आपके ऐप्लिकेशन को, लॉन्चर के कॉलबैक में, अनुमति देने और अनुमति न देने, दोनों के नतीजों को सही तरीके से मैनेज करना चाहिए.

अनुमति के अनुरोध के फ़्लो को ट्रिगर करने के लिए, रजिस्टर किए गए अनुमति के लॉन्चर के launch तरीके में, ProjectedPermissionsRequestParams की सूची पास करें. ProjectedPermissionsRequestParams ऑब्जेक्ट, अनुरोध की गई मेनिफ़ेस्ट अनुमतियों को, पसंद के मुताबिक rationale स्ट्रिंग के साथ बंडल करता है. rationale स्ट्रिंग में, यह साफ़ तौर पर और कम शब्दों में बताया जाना चाहिए कि ऐप्लिकेशन को, स्मार्ट ग्लास के हार्डवेयर की सुविधाओं (जैसे, कैमरा या माइक्रोफ़ोन) को ऐक्सेस करने की ज़रूरत क्यों है.

private fun requestHardwarePermissions() {
    val params = ProjectedPermissionsRequestParams(
        permissions = listOf(Manifest.permission.CAMERA),
        rationale = "Camera access is required to overlay digital content on your physical environment."
    )
    requestPermissionLauncher.launch(listOf(params))
}

कोड के बारे में अहम बातें

अनुमति के अनुरोध के उपयोगकर्ता फ़्लो को समझना

ProjectedPermissionsResultContract तरीके का इस्तेमाल करके, अनुमति के अनुरोध को लॉन्च करने पर, सिस्टम, स्मार्ट ग्लास और फ़ोन, दोनों पर को-ऑर्डिनेटेड यूज़र फ़्लो शुरू करता है.

अनुमतियों के उपयोगकर्ता फ़्लो के दौरान, आपका ऐप्लिकेशन और उपयोगकर्ता क्या उम्मीद कर सकते हैं, यहां इसकी जानकारी दी गई है:

  1. चश्मे पर: प्रोजेक्ट किए गए डिवाइस (चश्मे) पर एक ऐक्टिविटी दिखती है. इसमें उपयोगकर्ता को आगे बढ़ने के लिए, अपना फ़ोन देखने का निर्देश दिया जाता है.

  2. फ़ोन पर: साथ ही, होस्ट डिवाइस (फ़ोन) पर एक ऐक्टिविटी लॉन्च होती है. इस स्क्रीन पर, आपकी दी गई वजह की स्ट्रिंग दिखती है. साथ ही, उपयोगकर्ता को आगे बढ़ने या रद्द करने का विकल्प मिलता है.

  3. फ़ोन पर: अगर उपयोगकर्ता, वजह को स्वीकार करता है, तो फ़ोन पर, Android सिस्टम की अनुमति का बदला हुआ डायलॉग दिखता है. इसमें उपयोगकर्ता को बताया जाता है कि वह फ़ोन के बजाय स्मार्ट ग्लास के लिए अनुमति दे रहा है. साथ ही, उपयोगकर्ता औपचारिक तौर पर अनुमति दे सकता है या अनुमति के अनुरोध को अस्वीकार कर सकता है.

  4. नतीजा पाना: उपयोगकर्ता के फ़ाइनल विकल्प चुनने के बाद, फ़ोन और चश्मे, दोनों पर मौजूद ऐक्टिविटी बंद हो जाती हैं. इसके बाद, आपके ActivityResultLauncher कॉलबैक को, अनुरोध की गई हर अनुमति के लिए, दी गई स्थिति वाला मैप मिलता है.

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

अगर आपका ऐप्लिकेशन, फ़ोन की किसी ऐक्टिविटी में चल रहा है, लेकिन उसे ऑडियो या डिसप्ले वाले चश्मे के लिए अनुमतियों की ज़रूरत है, तो डिवाइस के हिसाब से Activity#requestPermissions(permissions, requestCode, deviceId) तरीके का इस्तेमाल करके, अनुमतियों का अनुरोध करें. उदाहरण के लिए, अगर किसी उपयोगकर्ता को, पहले व्यक्ति के नज़रिए से वीडियो स्ट्रीम को चश्मे के कैमरे पर स्विच करने की अनुमति देनी है.

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

// 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
)

अनुमति के नतीजों को मैनेज करना

फ़ोन पर, अनुमति के डायलॉग का जवाब देने के बाद, उपयोगकर्ता का फ़ैसला आपके ऐप्लिकेशन को onRequestPermissionsResult कॉलबैक को कॉल करके भेजा जाता है.

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

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

private companion object {
    // REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant.
    const val REQUEST_CODE_GLASSES_CAMERA = 1001
}

@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray,
    deviceId: Int
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)

    // Handle the result of the permission request
    if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Proceed with glasses camera features
        } else {
            // Handle glasses permission denied
        }
    }
}

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