เราขอแนะนำให้คุณลดการใช้สิทธิ์ในแอปให้เหลือน้อยที่สุดเพื่อเป็นส่วนหนึ่งของการปรับปรุงคุณภาพแอปและปกป้องความเป็นส่วนตัวของผู้ใช้ ซึ่งจะช่วยให้ผู้ใช้ค้นพบและใช้แอปคุณภาพสูงที่มอบสภาพแวดล้อมการใช้งานที่ปลอดภัย
การขอสิทธิ์จากผู้ใช้จะขัดขวางขั้นตอนการทำงานของผู้ใช้ และผู้ใช้สามารถปฏิเสธคำขอของคุณได้ นอกจากนี้ ทุกครั้งที่คุณประกาศสิทธิ์ใหม่ คุณต้อง ตรวจสอบวิธีที่แอปขอและแชร์ข้อมูลผู้ใช้ สิทธิ์และ API บางอย่างที่มีความละเอียดอ่อนเป็นพิเศษกำหนดให้คุณต้องเปิดเผยข้อมูลในแอปเกี่ยวกับการเข้าถึงข้อมูล การเก็บรวบรวม การใช้งาน และการแชร์ข้อมูล
มีวิธีอื่นๆ มากมายในการลดการใช้สิทธิ์ให้เหลือน้อยที่สุด ดังนี้
- ใช้ตัวเลือกที่มีความละเอียดต่ำกว่าสำหรับการเข้าถึงสิทธิ์ข้อมูลผู้ใช้เมื่อเหมาะสม เช่น ขอข้อมูลตำแหน่งคร่าวๆ แทนตำแหน่งที่แน่นอนเมื่อไม่จำเป็น
- ใช้ตัวเลือกและตัวเลือกสิทธิ์ที่ให้สิทธิ์เข้าถึงสิทธิ์ที่มีความละเอียดอ่อน ในสถานการณ์ที่กำหนดขอบเขต เช่น ตัวเลือก รูปภาพ, ตัวเลือก รายชื่อติดต่อ และ ปุ่ม ตำแหน่ง
- เรียก API ที่อนุญาตให้แอปทำงานตามฟังก์ชันการทำงานที่เลือกได้โดยไม่ต้องประกาศสิทธิ์
- เรียกใช้ Intent หรือตัวจัดการเหตุการณ์ที่เฉพาะเจาะจงเพื่อทำงานตามฟังก์ชันการทำงานแทนการประกาศสิทธิ์
- ระบบมีสัญญาในตัวสำหรับการดำเนินการกับไฟล์ต่างๆ และยังรองรับสัญญาที่กำหนดเองด้วย
หากคุณต้องประกาศสิทธิ์ ให้เคารพการตัดสินใจของผู้ใช้เสมอและ เตรียมวิธีลดประสบการณ์การใช้งานแอปของคุณลงอย่างค่อยเป็นค่อยไป
หน้านี้อธิบายกรณีการใช้งานหลายกรณีที่แอปของคุณสามารถดำเนินการได้โดยไม่ต้องประกาศว่าต้องใช้สิทธิ์ใดๆ
แสดงสถานที่ใกล้เคียง
แอปของคุณอาจต้องทราบตำแหน่งคร่าวๆ ของผู้ใช้ ซึ่งมีประโยชน์สำหรับการแสดงข้อมูลที่อิงตามตำแหน่ง เช่น ร้านอาหารที่อยู่ใกล้เคียง กรณีการใช้งานตำแหน่งแต่ละกรณีมีชุดข้อกำหนดเฉพาะของตนเองสำหรับความแม่นยำและระยะเวลาการเข้าถึง โดยส่วนใหญ่ต้องการเพียงการประมาณคร่าวๆ ของสถานที่ที่ผู้ใช้อยู่ หากคุณกำลังติดตั้งใช้งานฟังก์ชันการทำงานในแอปที่ขึ้นอยู่กับตำแหน่งของผู้ใช้ ให้พิจารณาตัวเลือกต่อไปนี้เพื่อช่วยคุณเลือกแนวทางการเข้าถึงที่เหมาะสม
- หากฟังก์ชันการทำงานของแอปต้องใช้ตำแหน่งที่แน่นอน แต่เฉพาะในบางช่วงเวลาขณะใช้งานแอป เช่น "ค้นหาใกล้ฉัน" หรือการป้อนที่อยู่สำหรับการซื้อขายทางออนไลน์โดยอัตโนมัติ การใช้ปุ่มตำแหน่งน่าจะเป็นตัวเลือกที่ดีที่สุดในการลดความยุ่งยากของผู้ใช้และการพึ่งพาสิทธิ์ที่มีขอบเขตกว้างขึ้น
- หากแอปต้องใช้ตำแหน่งบ่อยๆ ให้ประกาศสิทธิ์
ACCESS_COARSE_LOCATIONสิทธิ์นี้จะให้การประมาณตำแหน่งของอุปกรณ์ จากบริการตำแหน่งตามที่อธิบายไว้ในเอกสารประกอบ เกี่ยวกับ ความแม่นยำของตำแหน่งคร่าวๆ - หากแอปต้องใช้ตำแหน่งไม่บ่อยนักหรือเพียงครั้งเดียว ให้ลองขอให้ผู้ใช้ป้อนที่อยู่หรือรหัสไปรษณีย์แทน
กรณีการใช้งานอื่นๆ อาจต้องมีการประมาณตำแหน่งของอุปกรณ์ที่แม่นยำยิ่งขึ้น
ซึ่งเป็นเพียงกรณีที่คุณประกาศสิทธิ์
ACCESS_FINE_LOCATION ได้
สร้างและเข้าถึงไฟล์
Android ช่วยให้คุณสร้างและเข้าถึงไฟล์ได้โดยไม่ต้องประกาศสิทธิ์ใดๆ ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูลหรือเซ็นเซอร์
เปิดไฟล์สื่อ
แอปของคุณอาจอนุญาตให้ผู้ใช้เลือกจากรูปภาพและวิดีโอของตนเอง เช่น สำหรับไฟล์แนบในข้อความหรือรูปโปรไฟล์
หากต้องการรองรับฟังก์ชันการทำงานนี้ ให้ใช้เครื่องมือเลือกรูปภาพ เครื่องมือเลือกรูปภาพไม่จำเป็นต้องใช้สิทธิ์รันไทม์ใดๆ เมื่อผู้ใช้โต้ตอบกับตัวเลือกรูปภาพเพื่อเลือกรูปภาพหรือวิดีโอที่จะแชร์กับแอป ระบบจะให้สิทธิ์เข้าถึงแบบอ่านชั่วคราวแก่ URI ที่เชื่อมโยงกับไฟล์สื่อที่เลือก
หากแอปต้องเข้าถึงไฟล์สื่อโดยไม่ใช้เครื่องมือเลือกรูปภาพ คุณไม่จำเป็นต้องประกาศสิทธิ์พื้นที่เก็บข้อมูลใดๆ ดังนี้
- หากคุณเข้าถึงไฟล์สื่อที่แอปของคุณสร้างขึ้น แอปของคุณจะมีสิทธิ์เข้าถึง ไฟล์เหล่านี้ใน MediaStore อยู่แล้ว
- หากคุณเข้าถึงไฟล์สื่อที่แอปอื่นสร้างขึ้น ให้ใช้ Storage Access Framework
เปิดเอกสาร
แอปของคุณอาจแสดงเอกสารที่ผู้ใช้สร้างขึ้น ไม่ว่าจะในแอปของคุณหรือในแอปอื่น ตัวอย่างที่พบบ่อยคือไฟล์ข้อความ
ในกรณีนี้ ให้ประกาศ READ_EXTERNAL_STORAGE เพื่อความเข้ากันได้กับอุปกรณ์รุ่นเก่าเท่านั้น ตั้งค่า android:maxSdkVersion เป็น 28
ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้ ทั้งนี้ขึ้นอยู่กับว่าแอปใดเป็นผู้สร้างเอกสาร
- หากผู้ใช้สร้างเอกสารในแอปของคุณ ให้เข้าถึงเอกสารโดยตรง
- หากผู้ใช้สร้างเอกสารในแอปอื่น ให้ใช้ Storage Access Framework
ถ่ายรูป
ผู้ใช้อาจถ่ายรูปในแอปของคุณโดยใช้แอปกล้องถ่ายรูปของระบบที่ติดตั้งไว้ล่วงหน้า
ในกรณีนี้ อย่าประกาศสิทธิ์ CAMERA แต่ให้เรียกใช้การดำเนินการผ่าน Intent
ACTION_IMAGE_CAPTURE แทน
บันทึกวิดีโอ
ผู้ใช้อาจบันทึกวิดีโอในแอปของคุณโดยใช้แอปกล้องถ่ายรูปของระบบที่ติดตั้งไว้ล่วงหน้า
ในกรณีนี้ อย่าประกาศสิทธิ์ CAMERA แต่ให้เรียกใช้การดำเนินการผ่าน Intent
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 ได้โดยไม่ต้องประกาศสิทธิ์ใดๆ ที่เกี่ยวข้องกับการโทรหรือ SMS
ป้อนรหัสผ่านแบบใช้งานครั้งเดียวโดยอัตโนมัติ
แอปของคุณอาจป้อนรหัสผ่านแบบใช้งานครั้งเดียวที่ส่งไปยังอุปกรณ์ของผู้ใช้โดยอัตโนมัติเพื่อยืนยันตัวตนของผู้ใช้ เพื่อปรับปรุงเวิร์กโฟลว์การตรวจสอบสิทธิ์แบบ 2 ปัจจัย
หากต้องการรองรับฟังก์ชันการทำงานนี้ในอุปกรณ์ที่ใช้บริการ Google Play อย่าประกาศสิทธิ์ READ_SMS แต่ให้ใช้ SMS Retriever API แทน
ในอุปกรณ์อื่นๆ หากแอปกำหนดเป้าหมายเป็น Android 8.0 (ระดับ API 26) ขึ้นไป ให้สร้างโทเค็นเฉพาะแอปโดยใช้ createAppSpecificSmsToken() ส่งโทเค็นนี้ไปยังแอปหรือบริการอื่นที่สามารถส่ง SMS ยืนยันได้
ยืนยันหมายเลขโทรศัพท์ของผู้ใช้
วิธีที่แนะนำคือ Digital Credentials API เพื่อให้แอปของคุณยืนยันหมายเลขโทรศัพท์ของผู้ใช้ได้อย่างปลอดภัย การใช้ API นี้โดยตรงหรือผ่านผู้รวบรวมข้อมูลที่เข้ากันได้หลากหลายจะช่วยให้คุณยืนยันข้อมูลบัญชีผู้ใช้ได้อย่างน่าเชื่อถือโดยไม่ต้องขอสิทธิ์ที่มีความละเอียดอ่อนของอุปกรณ์ หากต้องการโซลูชัน Firebase โปรดดู การยืนยันหมายเลขโทรศัพท์ของ Firebase
หรือคุณจะยืนยันหมายเลขโทรศัพท์ของผู้ใช้โดยใช้รหัสผ่านแบบใช้งานครั้งเดียวก็ได้ โดยใช้ SMS Retriever API
ป้อนหมายเลขโทรศัพท์ของผู้ใช้โดยอัตโนมัติ
แอปของคุณอาจอนุญาตให้ผู้ใช้ป้อนหมายเลขโทรศัพท์ของอุปกรณ์โดยอัตโนมัติเพื่อเพิ่มประสิทธิภาพการขายหรือการสนับสนุน
หากต้องการรองรับฟังก์ชันการทำงานนี้ในอุปกรณ์ที่ใช้บริการ Google Play อย่าประกาศสิทธิ์ READ_PHONE_STATE แต่ให้ใช้ไลบรารีคำแนะนำหมายเลขโทรศัพท์Phone Number
Hint แทน
กรองการโทร
แอปของคุณอาจกรองการโทรเพื่อหาสแปมเพื่อลดการขัดจังหวะที่ไม่จำเป็นสำหรับผู้ใช้
หากต้องการรองรับฟังก์ชันการทำงานนี้ อย่าประกาศสิทธิ์ READ_PHONE_STATE
แต่ให้ใช้ CallScreeningService API แทน
โทรออก
แอปของคุณอาจมีความสามารถในการโทรออกโดยการแตะข้อมูลของรายชื่อติดต่อ
หากต้องการรองรับฟังก์ชันการทำงานนี้ ให้ใช้การดำเนินการผ่าน Intent ACTION_DIAL แทน การดำเนินการ ACTION_CALL ACTION_CALL ต้องใช้สิทธิ์ CALL_PHONE ในเวลาติดตั้ง ซึ่งจะป้องกันไม่ให้อุปกรณ์ที่ไม่สามารถโทรออกได้ เช่น แท็บเล็ตบางรุ่น ติดตั้งแอปพลิเคชันของคุณ
หยุดสื่อชั่วคราวเมื่อแอปถูกขัดจังหวะ
หากผู้ใช้รับสายโทรศัพท์หรือมีการปลุกที่ผู้ใช้กำหนดค่าไว้ แอปของคุณควรหยุดการเล่นสื่อชั่วคราวจนกว่าแอปจะได้รับโฟกัสเสียงอีกครั้ง
หากต้องการรองรับฟังก์ชันการทำงานนี้ อย่าประกาศสิทธิ์ READ_PHONE_STATE
แต่ให้ใช้ตัวจัดการเหตุการณ์ onAudioFocusChange() ซึ่งจะทำงาน
โดยอัตโนมัติเมื่อระบบเปลี่ยนโฟกัสเสียง ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้โฟกัสเสียง
implement audio focus
สแกนบาร์โค้ด
Android รองรับ Google Code Scanner API ซึ่งขับเคลื่อนโดย บริการ Google Play ซึ่งช่วยให้คุณถอดรหัสบาร์โค้ดได้โดยไม่ต้องประกาศ สิทธิ์เข้าถึงกล้อง API นี้ช่วยรักษาความเป็นส่วนตัวของผู้ใช้และลดโอกาสที่คุณจะต้องสร้าง UI ที่กำหนดเองสำหรับกรณีการใช้งานการสแกนบาร์โค้ด
API จะสแกนบาร์โค้ดและส่งคืนเฉพาะผลการสแกนไปยังแอปของคุณเท่านั้น ระบบจะประมวลผลรูปภาพในอุปกรณ์ และ Google จะไม่จัดเก็บข้อมูลหรือผลการสแกนใดๆ
หากแอปต้องรองรับกรณีการใช้งานหรือรูปแบบบาร์โค้ดที่ซับซ้อน หรือหากต้องใช้ UI ที่กำหนดเอง ให้ใช้ ML Kit Barcode Scanning API แทน
รีเซ็ตสิทธิ์ที่ไม่ได้ใช้
Android มีหลายวิธีในการรีเซ็ตสิทธิ์รันไทม์ที่ไม่ได้ใช้ให้กลับไปอยู่ในสถานะเริ่มต้นที่ถูกปฏิเสธ
ขอสิทธิ์รันไทม์
เมื่อประเมินแล้วว่าแอปของคุณต้องประกาศและขอสิทธิ์รันไทม์ ให้ทำตามเวิร์กโฟลว์ที่เฉพาะเจาะจง
อธิบายเหตุผลที่แอปต้องใช้สิทธิ์
การใช้ requestPermissions() จะแสดงกล่องโต้ตอบที่ระบุสิทธิ์ที่แอปต้องการใช้ แต่ไม่ได้อธิบายเหตุผล ซึ่งอาจทำให้ผู้ใช้สงสัย
อ่าน คำแนะนำในการออกแบบเพื่อดูรายละเอียดและคำแนะนำเพิ่มเติมเกี่ยวกับวิธีและเวลาที่จะแสดงกล่องโต้ตอบนี้
จัดการการปฏิเสธสิทธิ์
แอปของคุณควรช่วยให้ผู้ใช้เข้าใจผลที่ตามมาของการปฏิเสธสิทธิ์ทั้งก่อนและหลังที่ผู้ใช้เลือกที่จะทำเช่นนั้น