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

อุปกรณ์ 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 มาตรฐาน วิธีนี้จะกำหนดเป้าหมายสิทธิ์รันไทม์สำหรับเสียงและแว่นตาที่มีจอแสดงผลอย่างชัดเจน แทนที่จะเป็นโทรศัพท์โฮสต์

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

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

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

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

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

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

ขอสิทธิ์รันไทม์ในกิจกรรมโทรศัพท์

หากแอปทำงานในกิจกรรมของโทรศัพท์แต่ต้องใช้สิทธิ์สำหรับแว่นตาที่มีจอแสดงผลหรือเสียง เช่น เพื่อให้ผู้ใช้เปลี่ยนสตรีมวิดีโอไปใช้กล้องของแว่นตาสำหรับมุมมองบุคคลที่หนึ่ง ให้ขอสิทธิ์โดยใช้เมธอด 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 การเรียกกลับ

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

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

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