ขอสิทธิ์ฮาร์ดแวร์สำหรับแว่นตาเสียงและแว่นตาแสดงผล

อุปกรณ์ XR ที่รองรับ
คำแนะนำนี้จะช่วยคุณสร้างประสบการณ์การใช้งานสำหรับอุปกรณ์ XR ประเภทต่างๆ
แว่นตาสำหรับแสดงผลและแว่นตาสำหรับฟัง

เช่นเดียวกับในโทรศัพท์ การเข้าถึงฮาร์ดแวร์ที่ละเอียดอ่อน เช่น กล้องและไมโครโฟนในแว่นตาที่มีจอแสดงผลและแว่นตาที่มีระบบเสียงต้องได้รับความยินยอมของผู้ใช้อย่างชัดแจ้ง ซึ่งถือเป็น สิทธิ์เฉพาะสำหรับแว่นตา และแอปของคุณต้องขอสิทธิ์เหล่านี้แบบรันไทม์ แม้ว่าจะมีสิทธิ์ที่เกี่ยวข้องในโทรศัพท์อยู่แล้วก็ตาม

ประกาศสิทธิ์ในไฟล์ Manifest ของแอป

ก่อนที่จะขอสิทธิ์ คุณต้องประกาศสิทธิ์เหล่านั้นในไฟล์ Manifest ของแอป โดยใช้<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>

สิ่งที่ควรทำก่อนขอสิทธิ์สำหรับแว่นตา

อ่านหลักการและเวิร์กโฟลว์ของสิทธิ์เพื่อให้แน่ใจว่าคุณมอบ ประสบการณ์การใช้งานที่ดีที่สุดแก่ผู้ใช้ เช่น การตรวจสอบว่าผู้ใช้ได้ ให้สิทธิ์รันไทม์ที่แอปของคุณต้องการแล้วหรือไม่ และ แอปของคุณ ควรแสดงเหตุผลให้ผู้ใช้ทราบก่อนที่จะขอสิทธิ์เฉพาะสำหรับแว่นตา หรือไม่

สถานการณ์การขอสิทธิ์

คุณอาจพบสถานการณ์ต่างๆ เมื่อขอสิทธิ์รันไทม์ที่เป็นอันตรายในแว่นตาสำหรับแสดงผลและแว่นตาสำหรับฟัง

  • ขอสิทธิ์รันไทม์จากกิจกรรมที่แสดง
  • ขอสิทธิ์รันไทม์จากกิจกรรมในโทรศัพท์

ดูรายละเอียดเกี่ยวกับแต่ละสถานการณ์ได้ในส่วนต่อไปนี้ของคู่มือนี้

ขอและจัดการสิทธิ์รันไทม์จากกิจกรรมที่แสดง

หากต้องการขอสิทธิ์สำหรับแว่นตาที่มีระบบเสียงและแว่นตาที่มีจอแสดงผล ให้ใช้ ActivityResultLauncher กับวิธี ProjectedPermissionsResultContract ก่อนเพื่อลงทะเบียนตัวเรียกใช้สิทธิ์ เมื่อผู้ใช้ดำเนินการตามคำขอสิทธิ์แล้ว การเรียกกลับจะได้รับแผนที่ของชื่อสิทธิ์ไปยังสถานะที่ได้รับ

// 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
  • แอปของคุณควรจัดการผลลัพธ์ทั้งที่ได้รับอนุญาตและถูกปฏิเสธอย่างเหมาะสมในการเรียกกลับของตัวเรียกใช้

หากต้องการทริกเกอร์โฟลว์คำขอสิทธิ์ ให้ส่งรายการ ProjectedPermissionsRequestParams ไปยัง วิธี launch ของตัวเรียกใช้สิทธิ์ที่ลงทะเบียนไว้ ออบเจ็กต์ ProjectedPermissionsRequestParams จะรวมสิทธิ์ Manifest ที่ขอไว้เข้ากับสตริง 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

หากต้องการจัดการการตอบกลับ ให้ลบล้าง onRequestPermissionsResult ภายในอินสแตนซ์ Activity ที่เริ่มคำขอสิทธิ์

ข้อมูลโค้ดต่อไปนี้แสดงวิธีจัดการการเรียกกลับและตรวจสอบว่าผู้ใช้ให้สิทธิ์ที่ขอหรือไม่

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
        }
    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด
  • ใช้การโอเวอร์โหลด deviceId กับการเรียกกลับ onRequestPermissionsResult เพื่อให้แน่ใจว่าสถานะสิทธิ์ได้รับการแมปอย่างถูกต้องกับบริบทที่เฉพาะเจาะจง เช่น แว่นตาสำหรับฟัง หรือแว่นตาที่มีจอแสดงผล ไม่ใช่โทรศัพท์โฮสต์
  • แอปของคุณควรจัดการผลลัพธ์ทั้งที่ได้รับอนุญาตและถูกปฏิเสธอย่างเหมาะสม