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