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

อุปกรณ์ 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>

ก่อนขอสิทธิ์เข้าถึงแว่นตา

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

สถานการณ์การให้สิทธิ์

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

  • ขอสิทธิ์รันไทม์จากกิจกรรมที่ฉายภาพ
  • ขอสิทธิ์รันไทม์จากกิจกรรมในโทรศัพท์

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

ขอสิทธิ์รันไทม์จากกิจกรรมที่ฉายภาพ

หากต้องการขอสิทธิ์รันไทม์สำหรับแว่นตาที่มีเสียงหรือจอแสดงผลจากกิจกรรมที่ฉาย ให้ใช้เมธอด 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)
        }
    }
}

ประเด็นสำคัญเกี่ยวกับโค้ด

  • ใช้ ProjectedActivityCompat.requestPermissions แทนเมธอด ActivityCompat มาตรฐาน วิธีนี้กำหนดเป้าหมายสิทธิ์รันไทม์สำหรับเสียงและแว่นตาที่มีจอแสดงผลอย่างชัดเจน แทนที่จะเป็นโทรศัพท์โฮสต์

จัดการผลลัพธ์ของสิทธิ์

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

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

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

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

@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 กับ Callback 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

จัดการผลลัพธ์ของสิทธิ์

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

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

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

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