คำขอสิทธิ์จะปกป้องข้อมูลที่ละเอียดอ่อนซึ่งพร้อมใช้งานจากอุปกรณ์ และควรใช้เฉพาะเมื่อจำเป็นต้องเข้าถึงข้อมูลเพื่อการทำงานของแอปเท่านั้น เอกสารนี้มีเคล็ดลับเกี่ยวกับวิธีที่คุณอาจใช้เพื่อให้ได้ฟังก์ชันการทำงานเดียวกัน (หรือดีกว่า) โดยไม่ต้องขอสิทธิ์เข้าถึงข้อมูลดังกล่าว แต่ไม่ได้อธิบายอย่างละเอียดเกี่ยวกับวิธีที่สิทธิ์ทำงานในระบบปฏิบัติการ Android
ดูข้อมูลทั่วไปเกี่ยวกับสิทธิ์ของ Android ได้ที่ภาพรวมของสิทธิ์ ดูรายละเอียดเกี่ยวกับวิธีใช้สิทธิ์ในโค้ดได้ที่การขอสิทธิ์ของแอป
สิทธิ์ใน Android 6.0 ขึ้นไป
ใน Android 6.0 (API ระดับ 23) ขึ้นไป แอปจะขอสิทธิ์จากผู้ใช้ได้ในรันไทม์ แทนที่จะขอสิทธิ์ก่อนการติดตั้ง ซึ่งจะช่วยให้แอป ขอสิทธิ์ได้เมื่อแอปต้องการใช้บริการหรือข้อมูลที่ ได้รับการปกป้องโดยบริการเหล่านั้นจริงๆ แม้ว่าการดำเนินการนี้จะไม่เปลี่ยนแปลงลักษณะการทำงานโดยรวมของแอป (โดยไม่จำเป็น) แต่ก็ทำให้เกิดการเปลี่ยนแปลงบางอย่างที่เกี่ยวข้องกับวิธีจัดการข้อมูลผู้ใช้ที่ละเอียดอ่อน ดังนี้
บริบทตามสถานการณ์ที่เพิ่มขึ้น
ผู้ใช้จะได้รับข้อความแจ้งในรันไทม์ในบริบทของแอปของคุณเพื่อขอสิทธิ์ เข้าถึงฟังก์ชันที่ครอบคลุมโดยกลุ่มสิทธิ์เหล่านั้น ผู้ใช้จะมีความละเอียดอ่อนมากขึ้นเกี่ยวกับบริบทที่มีการขอสิทธิ์ และหากมีความไม่ตรงกันระหว่างสิ่งที่คุณขอและวัตถุประสงค์ของแอป คุณจะต้องอธิบายรายละเอียดให้ผู้ใช้ทราบถึงสาเหตุที่คุณขอสิทธิ์ คุณควรให้คำอธิบายคำขอทั้งในขณะที่ส่งคำขอและในกล่องโต้ตอบติดตามผลหากผู้ใช้ปฏิเสธคำขอทุกครั้งที่เป็นไปได้
หากต้องการเพิ่มโอกาสที่ระบบจะยอมรับคำขอสิทธิ์ ให้แสดงข้อความแจ้งเฉพาะเมื่อจำเป็นต้องใช้ฟีเจอร์ที่เฉพาะเจาะจงเท่านั้น เช่น แสดงข้อความแจ้งให้เข้าถึงไมโครโฟน เมื่อผู้ใช้คลิกปุ่มไมโครโฟนเท่านั้น ผู้ใช้มีแนวโน้มที่จะ อนุญาตสิทธิ์ที่คาดหวังไว้มากกว่า
ความยืดหยุ่นที่มากขึ้นในการให้สิทธิ์
ผู้ใช้สามารถปฏิเสธการเข้าถึงสิทธิ์แต่ละรายการในเวลาที่มีการขอ และในการตั้งค่า แต่ผู้ใช้อาจยังคงประหลาดใจเมื่อฟังก์ชันการทำงาน หยุดทำงานอันเป็นผลมาจากการปฏิเสธดังกล่าว คุณควรตรวจสอบจำนวนผู้ใช้ที่ปฏิเสธสิทธิ์ (เช่น ใช้ Google Analytics) เพื่อที่จะได้ปรับโครงสร้างแอปเพื่อหลีกเลี่ยงการพึ่งพาสิทธิ์ดังกล่าว หรืออธิบายให้ดีขึ้นว่าทำไมคุณจึงต้องใช้สิทธิ์เพื่อให้แอปทำงานได้อย่างถูกต้อง นอกจากนี้ คุณควรตรวจสอบว่าแอปจัดการข้อยกเว้นเมื่อผู้ใช้ปฏิเสธคำขอสิทธิ์หรือปิดสิทธิ์ในการตั้งค่าได้
ภาระด้านธุรกรรมที่เพิ่มขึ้น
ระบบจะขอให้ผู้ใช้ให้สิทธิ์สำหรับกลุ่มสิทธิ์ทีละกลุ่ม ไม่ใช่เป็นชุด ดังนั้น คุณจึงควรลดจำนวนสิทธิ์ที่ขอให้เหลือน้อยที่สุด ซึ่งจะเพิ่มภาระของผู้ใช้ในการให้สิทธิ์ และดังนั้น จึงเพิ่มโอกาสที่จะมีการปฏิเสธคำขออย่างน้อย 1 รายการ
สิทธิ์ที่ต้องใช้การเป็นตัวแฮนเดิลเริ่มต้น
แอปบางแอปต้องอาศัยการเข้าถึงข้อมูลที่ละเอียดอ่อนของผู้ใช้ที่เกี่ยวข้องกับบันทึกการโทร และข้อความ SMS หากต้องการขอสิทธิ์ที่เฉพาะเจาะจงสำหรับบันทึกการโทร และข้อความ SMS รวมถึงเผยแพร่แอปของคุณไปยัง Play Store คุณต้องแจ้งให้ ผู้ใช้ตั้งค่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้นสำหรับฟังก์ชันหลักของระบบก่อน ที่จะขอสิทธิ์รันไทม์เหล่านี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแฮนเดิลเริ่มต้น รวมถึงคำแนะนำในการแสดงข้อความแจ้งตัวแฮนเดิลเริ่มต้นต่อผู้ใช้ได้ที่ดูคำแนะนำเกี่ยวกับสิทธิ์ที่ใช้เฉพาะในตัวแฮนเดิลเริ่มต้น
รู้จักไลบรารีที่คุณใช้
บางครั้งไลบรารีที่คุณใช้ในแอปอาจต้องใช้สิทธิ์ ตัวอย่างเช่น ไลบรารีโฆษณาและไลบรารีข้อมูลวิเคราะห์อาจต้องเข้าถึงLOCATION
กลุ่มสิทธิ์เพื่อใช้ฟังก์ชันการทำงานที่จำเป็น
แต่ในมุมมองของผู้ใช้ คำขอสิทธิ์จะมาจากแอปของคุณ ไม่ใช่ไลบรารี
เช่นเดียวกับที่ผู้ใช้เลือกแอปที่ใช้สิทธิ์น้อยกว่าสำหรับฟังก์ชันการทำงานเดียวกัน นักพัฒนาแอปควรตรวจสอบไลบรารีและเลือก SDK ของบุคคลที่สามที่ไม่ได้ใช้สิทธิ์ที่ไม่จำเป็น ตัวอย่างเช่น หากคุณใช้ไลบรารีที่มีฟังก์ชันการทำงานของตำแหน่ง โปรดตรวจสอบว่าคุณไม่ได้ขอสิทธิ์ FINE_LOCATION
เว้นแต่คุณจะใช้ฟังก์ชันการกำหนดเป้าหมายตามตำแหน่ง
จำกัดการเข้าถึงตำแหน่งในเบื้องหลัง
เมื่อแอปทำงานในเบื้องหลัง สิทธิ์เข้าถึง ตำแหน่งควรมีความสำคัญต่อฟังก์ชันการทำงานหลักของแอป และแสดงประโยชน์ที่ชัดเจนต่อผู้ใช้
ทดสอบทั้ง 2 รูปแบบสิทธิ์
ใน Android 6.0 (API ระดับ 23) ขึ้นไป ผู้ใช้จะให้และเพิกถอนสิทธิ์ของแอป ในขณะรันไทม์ แทนที่จะทำเมื่อติดตั้งแอป ด้วยเหตุนี้ คุณจึงต้องทดสอบแอปในสภาวะที่หลากหลายมากขึ้น ก่อน Android 6.0 คุณอาจสันนิษฐานได้ว่าหากแอปทำงานอยู่ แอปจะมีสิทธิ์ทั้งหมดที่ประกาศไว้ในไฟล์ Manifest ของแอป ตอนนี้ผู้ใช้ สามารถเปิดหรือปิดสิทธิ์สำหรับแอปใดก็ได้ ไม่ว่า API จะอยู่ในระดับใดก็ตาม คุณควรทดสอบเพื่อให้แน่ใจว่าแอปทํางานได้อย่างถูกต้องในสถานการณ์สิทธิ์ต่างๆ
เคล็ดลับต่อไปนี้จะช่วยคุณค้นหาปัญหาเกี่ยวกับโค้ดที่เกี่ยวข้องกับสิทธิ์ ในอุปกรณ์ที่ใช้ API ระดับ 23 ขึ้นไป
- ระบุสิทธิ์ปัจจุบันของแอปและเส้นทางโค้ดที่เกี่ยวข้อง
- ทดสอบโฟลว์ของผู้ใช้ในบริการและข้อมูลที่ได้รับการปกป้องด้วยสิทธิ์
- ทดสอบด้วยการผสมผสานสิทธิ์ที่ได้รับหรือถูกเพิกถอนแบบต่างๆ ตัวอย่างเช่น แอปกล้องถ่ายรูปอาจแสดง
CAMERA
,READ_CONTACTS
และACCESS_FINE_LOCATION
ในไฟล์ Manifest คุณควรทดสอบแอปโดยเปิดและปิดสิทธิ์แต่ละรายการเหล่านี้ เพื่อให้แน่ใจว่าแอปสามารถจัดการการกำหนดค่าสิทธิ์ทั้งหมดได้อย่างราบรื่น - ใช้เครื่องมือ adb เพื่อจัดการ
สิทธิ์จากบรรทัดคำสั่ง
- แสดงรายการสิทธิ์และสถานะตามกลุ่ม
$ adb shell pm list permissions -d -g
- ให้หรือเพิกถอนสิทธิ์อย่างน้อย 1 รายการ
$ adb shell pm [grant|revoke] <permission-name> ...
- แสดงรายการสิทธิ์และสถานะตามกลุ่ม
- วิเคราะห์แอปเพื่อหาบริการที่ใช้สิทธิ์
แหล่งข้อมูลเพิ่มเติม
- หลักเกณฑ์การออกแบบ Material Design สำหรับสิทธิ์ของ Android
- Android Marshmallow 6.0: Asking For Permission: วิดีโอนี้อธิบาย รูปแบบสิทธิ์รันไทม์ของ Android และวิธีที่ถูกต้องในการขอสิทธิ์จากผู้ใช้
- อธิบายเหตุผลที่แอปต้องมีสิทธิ์
- แนวทางปฏิบัติแนะนำสำหรับตัวระบุที่ไม่ซ้ำกัน