เราขอแนะนำให้คุณลดการใช้สิทธิ์ในแอปเพื่อเป็นส่วนหนึ่งของการปรับปรุงคุณภาพแอป และปกป้องความเป็นส่วนตัวของผู้ใช้ ซึ่งจะช่วยให้ผู้ใช้ค้นพบและใช้แอปคุณภาพสูงที่มอบ สภาพแวดล้อมที่ปลอดภัยและมั่นคงสำหรับผู้ใช้
การขอสิทธิ์จากผู้ใช้จะขัดจังหวะขั้นตอนของผู้ใช้ และผู้ใช้สามารถปฏิเสธคำขอของคุณได้ นอกจากนี้ ทุกครั้งที่คุณประกาศสิทธิ์ใหม่ คุณต้องตรวจสอบวิธีที่แอปขอและแชร์ข้อมูลผู้ใช้ สิทธิ์และ API ที่มีความละเอียดอ่อนเป็นพิเศษบางรายการ กำหนดให้คุณต้องเปิดเผยข้อมูลในแอปเกี่ยวกับการเข้าถึง การเก็บรวบรวม การใช้งาน และการแชร์ข้อมูล
คุณสามารถลดการใช้สิทธิ์ได้หลายวิธีดังนี้
- ประกาศสิทธิ์ที่ให้ข้อมูลตำแหน่งคร่าวๆ แทน ข้อมูลตำแหน่งที่แน่นอน หากแอปต้องการเพียงตำแหน่งโดยประมาณ
- เรียกใช้ API ที่อนุญาตให้แอปของคุณทําฟังก์ชันการทํางานที่ต้องการได้โดยไม่ต้องประกาศสิทธิ์
- เรียกใช้ Intent หรือตัวแฮนเดิลเหตุการณ์ที่เฉพาะเจาะจงเพื่อดำเนินการฟังก์ชันการทำงานแทนการประกาศสิทธิ์
- ระบบมี สัญญาในตัว สำหรับการดำเนินการกับไฟล์ต่างๆ และยังรองรับสัญญาที่กำหนดเองด้วย
หากต้องประกาศสิทธิ์ ให้เคารพการตัดสินใจของผู้ใช้เสมอ และหาวิธีลดประสบการณ์การใช้งานแอปอย่างค่อยเป็นค่อยไป
หน้านี้อธิบายกรณีการใช้งานหลายอย่างที่แอปของคุณสามารถทำได้โดยไม่ต้องประกาศความจำเป็นในการขอสิทธิ์ใดๆ
แสดงสถานที่ใกล้เคียง
แอปอาจต้องทราบตำแหน่งโดยประมาณของผู้ใช้ ซึ่งมีประโยชน์ในการ แสดงข้อมูลที่รับรู้ตำแหน่ง เช่น ร้านอาหารใกล้เคียง
กรณีการใช้งานบางอย่างต้องการเพียงการประมาณตำแหน่งของอุปกรณ์อย่างคร่าวๆ ในกรณีเหล่านี้ ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้ ทั้งนี้ขึ้นอยู่กับความถี่ที่แอปต้องการข้อมูลที่รับรู้ตำแหน่ง
- หากแอปของคุณต้องใช้ตำแหน่งบ่อยครั้ง ให้ประกาศสิทธิ์
ACCESS_COARSE_LOCATION
สิทธิ์นี้จะให้ค่าประมาณตำแหน่งของอุปกรณ์จากบริการตำแหน่งตามที่อธิบายไว้ในเอกสารประกอบเกี่ยวกับความแม่นยำของตำแหน่งโดยประมาณ - หากแอปของคุณต้องการตำแหน่งไม่บ่อยนักหรือเพียงครั้งเดียว ให้พิจารณาขอให้ผู้ใช้ ป้อนที่อยู่หรือรหัสไปรษณีย์แทน
Use Case อื่นๆ ต้องมีการประมาณตำแหน่งของอุปกรณ์ที่แม่นยำยิ่งขึ้น สถานการณ์เหล่านั้นเป็นกรณีเดียวที่อนุญาตให้ประกาศสิทธิ์ ACCESS_FINE_LOCATION
สร้างและเข้าถึงไฟล์
Android ช่วยให้คุณสร้างและเข้าถึงไฟล์ได้โดยไม่ต้องประกาศสิทธิ์ใดๆ ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูลหรือเซ็นเซอร์
เปิดไฟล์สื่อ
แอปของคุณอาจอนุญาตให้ผู้ใช้เลือกจากรูปภาพและวิดีโอของตนเอง เช่น สำหรับ ไฟล์แนบในข้อความหรือรูปโปรไฟล์
หากต้องการรองรับฟังก์ชันการทำงานนี้ ให้ใช้ photo picker เครื่องมือเลือกรูปภาพไม่ ต้องใช้สิทธิ์รันไทม์ใดๆ เมื่อผู้ใช้โต้ตอบกับเครื่องมือเลือกรูปภาพเพื่อเลือกรูปภาพหรือวิดีโอที่จะแชร์กับแอป ระบบจะให้สิทธิ์เข้าถึงแบบอ่านชั่วคราวแก่ URI ที่เชื่อมโยงกับไฟล์สื่อที่เลือก
หากแอปของคุณต้องเข้าถึงไฟล์สื่อโดยไม่ใช้เครื่องมือเลือกรูปภาพ คุณไม่จำเป็นต้องประกาศสิทธิ์เข้าถึงพื้นที่เก็บข้อมูลใดๆ โดยทำดังนี้
- หากคุณเข้าถึงไฟล์สื่อที่แอปสร้างขึ้น แอปจะมีสิทธิ์เข้าถึงไฟล์เหล่านี้ในที่เก็บสื่ออยู่แล้ว
- หากเข้าถึงไฟล์สื่อที่แอปอื่นสร้างขึ้น ให้ใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล
เปิดเอกสาร
แอปของคุณอาจแสดงเอกสารที่ผู้ใช้สร้างขึ้น ไม่ว่าจะในแอปของคุณหรือใน แอปอื่น ตัวอย่างที่พบบ่อยคือไฟล์ข้อความ
ในกรณีนี้ ให้ประกาศ
READ_EXTERNAL_STORAGE
เพื่อความเข้ากันได้กับอุปกรณ์รุ่นเก่าเท่านั้น ตั้งค่า android:maxSdkVersion
เป็น
28
ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้ โดยขึ้นอยู่กับแอปที่สร้างเอกสาร
- หากผู้ใช้สร้างเอกสารในแอปของคุณ ให้เข้าถึงเอกสารนั้นโดยตรง
- หากผู้ใช้สร้างเอกสารในแอปอื่น ให้ใช้Storage Access Framework
ถ่ายรูป
ผู้ใช้อาจถ่ายภาพในแอปของคุณโดยใช้แอปกล้องถ่ายรูประบบที่ติดตั้งไว้ล่วงหน้า
ในกรณีนี้ อย่าประกาศCAMERA
แต่ให้เรียกใช้การดำเนินการของอินเทนต์
ACTION_IMAGE_CAPTURE
แทน
บันทึกวิดีโอ
ผู้ใช้อาจบันทึกวิดีโอในแอปของคุณโดยใช้แอปกล้องของระบบที่ติดตั้งไว้ล่วงหน้า
ในกรณีนี้ อย่าประกาศCAMERA
แต่ให้เรียกใช้การดำเนินการของอินเทนต์
ACTION_VIDEO_CAPTURE
แทน
ระบุอุปกรณ์ที่เรียกใช้อินสแตนซ์ของแอป
อินสแตนซ์หนึ่งๆ ของแอปอาจต้องทราบว่าแอปทำงานในอุปกรณ์ใด ซึ่งจะเป็นประโยชน์สำหรับแอปที่มีค่ากำหนดหรือการรับส่งข้อความเฉพาะอุปกรณ์ เช่น เพลย์ลิสต์ที่แตกต่างกันสำหรับอุปกรณ์ทีวีและอุปกรณ์ที่สวมใส่ได้
ในกรณีนี้ อย่าเข้าถึง IMEI ของอุปกรณ์โดยตรง แต่ใน Android 10 คุณจะทำเช่นนั้นไม่ได้ ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้แทน
- รับตัวระบุอุปกรณ์ที่ไม่ซ้ำกันสำหรับอินสแตนซ์ของแอปโดยใช้ไลบรารี Instance ID
- สร้างตัวระบุของคุณเองซึ่งกำหนดขอบเขตไว้ที่พื้นที่เก็บข้อมูลของแอป ใช้ฟังก์ชันระบบพื้นฐาน เช่น
randomUUID()
จับคู่กับอุปกรณ์ผ่านบลูทูธ
แอปของคุณอาจมอบประสบการณ์การใช้งานที่ดียิ่งขึ้นได้ด้วยการโอนข้อมูลไปยังอุปกรณ์อื่นผ่านบลูทูธ
หากต้องการรองรับฟังก์ชันการทำงานนี้ โปรดอย่าประกาศสิทธิ์ ACCESS_FINE_LOCATION
,
ACCESS_COARSE_LOCATIION
หรือ BLUETOOTH_ADMIN
แต่ให้ใช้การจับคู่อุปกรณ์เสริมแทน
ป้อนหมายเลขบัตรชำระเงินโดยอัตโนมัติ
บริการ Google Play มีคลังที่ช่วยให้คุณป้อนหมายเลขบัตรชำระเงินได้โดยอัตโนมัติ คุณสามารถใช้ไลบรารีการจดจำบัตรเดบิตและบัตรเครดิต
แทนการประกาศCAMERA
สิทธิ์ได้
จัดการการโทรและข้อความ SMS
บริการของ Android และ Google Play มีไลบรารีที่ช่วยให้คุณจัดการการโทร และข้อความได้โดยไม่ต้องประกาศสิทธิ์ใดๆ ที่เกี่ยวข้องกับการโทร หรือข้อความ SMS
ป้อนรหัสผ่านแบบใช้ครั้งเดียวโดยอัตโนมัติ
เพื่อเพิ่มประสิทธิภาพเวิร์กโฟลว์การตรวจสอบสิทธิ์แบบ 2 ปัจจัย แอปอาจป้อนรหัสผ่านแบบใช้ครั้งเดียวที่ส่งไปยังอุปกรณ์ของผู้ใช้โดยอัตโนมัติเพื่อยืนยันตัวตน
หากต้องการรองรับฟังก์ชันนี้ในอุปกรณ์ที่ขับเคลื่อนโดยบริการ Google Play คุณไม่ควร
ประกาศสิทธิ์ READ_SMS
แต่ให้ใช้ SMS Retriever
API แทน
ในอุปกรณ์อื่นๆ หากแอปกำหนดเป้าหมายเป็น Android 8.0 (API ระดับ 26) ขึ้นไป ให้สร้างโทเค็นเฉพาะแอปโดยใช้ createAppSpecificSmsToken()
ส่งโทเค็นนี้ไปยัง
แอปหรือบริการอื่นที่ส่งข้อความ SMS ยืนยันได้
ป้อนหมายเลขโทรศัพท์ของผู้ใช้โดยอัตโนมัติ
แอปของคุณอาจอนุญาตให้ผู้ใช้ป้อนหมายเลขโทรศัพท์ของอุปกรณ์โดยอัตโนมัติเพื่อให้บริการการขายหรือการสนับสนุนที่มีประสิทธิภาพมากขึ้น
หากต้องการรองรับฟังก์ชันนี้ในอุปกรณ์ที่ขับเคลื่อนโดยบริการ Google Play คุณไม่ควร
ประกาศสิทธิ์ READ_PHONE_STATE
แต่ให้ใช้ไลบรารีหมายเลขโทรศัพท์
คำแนะนำแทน
กรองการโทร
แอปอาจกรองการโทรเพื่อหาการโทรที่เป็นสแปมเพื่อลดการหยุดชะงักที่ไม่จำเป็นสำหรับผู้ใช้
หากต้องการรองรับฟังก์ชันการทำงานนี้ อย่าประกาศสิทธิ์ READ_PHONE_STATE
แต่ให้ใช้ API ของ
CallScreeningService
แทน
โทรออก
แอปของคุณอาจมีฟีเจอร์ที่ช่วยให้โทรออกได้โดยแตะข้อมูลของรายชื่อติดต่อ
หากต้องการรองรับฟังก์ชันการทำงานนี้ ให้ใช้การดำเนินการ Intent
ACTION_DIAL
แทนการดำเนินการ ACTION_CALL
ACTION_CALL
ต้องใช้สิทธิ์CALL_PHONE
ในเวลาติดตั้ง
ซึ่งจะป้องกันไม่ให้อุปกรณ์ที่โทรออกไม่ได้ เช่น แท็บเล็ตบางรุ่น ติดตั้งแอปพลิเคชันของคุณ
หยุดสื่อชั่วคราวเมื่อแอปถูกขัดจังหวะ
หากผู้ใช้ได้รับโทรศัพท์หรือมีการปลุกที่ผู้ใช้กำหนดค่าไว้ แอปของคุณควรหยุดการเล่นสื่อชั่วคราวจนกว่าแอปจะได้รับโฟกัสเสียงอีกครั้ง
หากต้องการรองรับฟังก์ชันการทำงานนี้ ให้ประกาศ READ_PHONE_STATE
permission ให้ใช้ตัวแฮนเดิลเหตุการณ์
onAudioFocusChange()
แทน ซึ่งจะทำงานโดยอัตโนมัติเมื่อระบบเปลี่ยนโฟกัสเสียง
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้โฟกัส
เสียง
สแกนบาร์โค้ด
Android รองรับ Google Code Scanner API ซึ่งขับเคลื่อนโดยบริการ Google Play และช่วยให้คุณถอดรหัสบาร์โค้ดได้โดยไม่ต้อง ประกาศสิทธิ์เข้าถึงกล้อง API นี้ช่วยรักษาความเป็นส่วนตัวของผู้ใช้และลดโอกาสที่คุณจะต้องสร้าง UI ที่กำหนดเองสำหรับกรณีการใช้งานการสแกนบาร์โค้ด
API จะสแกนบาร์โค้ดและส่งคืนเฉพาะผลการสแกนไปยังแอปของคุณเท่านั้น ระบบจะประมวลผลรูปภาพในอุปกรณ์ และ Google จะไม่จัดเก็บข้อมูลหรือผลการสแกนใดๆ
หากแอปต้องรองรับกรณีการใช้งานหรือรูปแบบบาร์โค้ดที่ซับซ้อน หรือหากต้องใช้ UI ที่กำหนดเอง ให้ใช้ API การสแกนบาร์โค้ดของ ML Kit แทน
รีเซ็ตสิทธิ์ที่ไม่ได้ใช้
Android มีหลายวิธีในการรีเซ็ตสิทธิ์รันไทม์ที่ไม่ได้ใช้กลับไปเป็น สถานะเริ่มต้นที่ถูกปฏิเสธ
ขอสิทธิ์รันไทม์
เมื่อประเมินแล้วว่าแอปของคุณต้องประกาศและขอสิทธิ์รันไทม์ ให้ทำตามเวิร์กโฟลว์ที่เฉพาะเจาะจงเพื่อดำเนินการดังกล่าว
อธิบายเหตุผลที่แอปของคุณต้องมีสิทธิ์
การใช้ requestPermissions()
จะแสดงกล่องโต้ตอบที่ระบุสิทธิ์ที่แอปของคุณต้องการใช้ แต่ไม่ได้อธิบายเหตุผล ซึ่งอาจทำให้ผู้ใช้สับสน
โปรดอ่านรายละเอียดและคำแนะนำเพิ่มเติมเกี่ยวกับวิธีและเวลาที่ควรแสดงกล่องโต้ตอบนี้ในคำแนะนำด้านการออกแบบ
จัดการการปฏิเสธสิทธิ์
แอปของคุณควรช่วยให้ผู้ใช้เข้าใจผลกระทบของการปฏิเสธสิทธิ์ ทั้งก่อนและหลังจากที่ผู้ใช้เลือกปฏิเสธ