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