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