ย่อคำขอสิทธิ์

เราขอแนะนำให้คุณลดการใช้สิทธิ์ในแอปให้เหลือน้อยที่สุดเพื่อเป็นส่วนหนึ่งของการปรับปรุงคุณภาพแอปและปกป้องความเป็นส่วนตัวของผู้ใช้ ซึ่งจะช่วยให้ผู้ใช้ค้นพบและใช้แอปคุณภาพสูงที่มอบสภาพแวดล้อมการใช้งานที่ปลอดภัย

การขอสิทธิ์จากผู้ใช้จะขัดขวางขั้นตอนการทำงานของผู้ใช้ และผู้ใช้สามารถปฏิเสธคำขอของคุณได้ นอกจากนี้ ทุกครั้งที่คุณประกาศสิทธิ์ใหม่ คุณต้อง ตรวจสอบวิธีที่แอปขอและแชร์ข้อมูลผู้ใช้ สิทธิ์และ API บางอย่างที่มีความละเอียดอ่อนเป็นพิเศษกำหนดให้คุณต้องเปิดเผยข้อมูลในแอปเกี่ยวกับการเข้าถึงข้อมูล การเก็บรวบรวม การใช้งาน และการแชร์ข้อมูล

มีวิธีอื่นๆ มากมายในการลดการใช้สิทธิ์ให้เหลือน้อยที่สุด ดังนี้

  • ใช้ตัวเลือกที่มีความละเอียดต่ำกว่าสำหรับการเข้าถึงสิทธิ์ข้อมูลผู้ใช้เมื่อเหมาะสม เช่น ขอข้อมูลตำแหน่งคร่าวๆ แทนตำแหน่งที่แน่นอนเมื่อไม่จำเป็น
  • ใช้ตัวเลือกและตัวเลือกสิทธิ์ที่ให้สิทธิ์เข้าถึงสิทธิ์ที่มีความละเอียดอ่อน ในสถานการณ์ที่กำหนดขอบเขต เช่น ตัวเลือก รูปภาพ, ตัวเลือก รายชื่อติดต่อ และ ปุ่ม ตำแหน่ง
  • เรียก API ที่อนุญาตให้แอปทำงานตามฟังก์ชันการทำงานที่เลือกได้โดยไม่ต้องประกาศสิทธิ์
  • เรียกใช้ Intent หรือตัวจัดการเหตุการณ์ที่เฉพาะเจาะจงเพื่อทำงานตามฟังก์ชันการทำงานแทนการประกาศสิทธิ์
  • ระบบมีสัญญาในตัวสำหรับการดำเนินการกับไฟล์ต่างๆ และยังรองรับสัญญาที่กำหนดเองด้วย

หากคุณต้องประกาศสิทธิ์ ให้เคารพการตัดสินใจของผู้ใช้เสมอและ เตรียมวิธีลดประสบการณ์การใช้งานแอปของคุณลงอย่างค่อยเป็นค่อยไป

หน้านี้อธิบายกรณีการใช้งานหลายกรณีที่แอปของคุณสามารถดำเนินการได้โดยไม่ต้องประกาศว่าต้องใช้สิทธิ์ใดๆ

แสดงสถานที่ใกล้เคียง

แอปของคุณอาจต้องทราบตำแหน่งคร่าวๆ ของผู้ใช้ ซึ่งมีประโยชน์สำหรับการแสดงข้อมูลที่อิงตามตำแหน่ง เช่น ร้านอาหารที่อยู่ใกล้เคียง กรณีการใช้งานตำแหน่งแต่ละกรณีมีชุดข้อกำหนดเฉพาะของตนเองสำหรับความแม่นยำและระยะเวลาการเข้าถึง โดยส่วนใหญ่ต้องการเพียงการประมาณคร่าวๆ ของสถานที่ที่ผู้ใช้อยู่ หากคุณกำลังติดตั้งใช้งานฟังก์ชันการทำงานในแอปที่ขึ้นอยู่กับตำแหน่งของผู้ใช้ ให้พิจารณาตัวเลือกต่อไปนี้เพื่อช่วยคุณเลือกแนวทางการเข้าถึงที่เหมาะสม

  • หากฟังก์ชันการทำงานของแอปต้องใช้ตำแหน่งที่แน่นอน แต่เฉพาะในบางช่วงเวลาขณะใช้งานแอป เช่น "ค้นหาใกล้ฉัน" หรือการป้อนที่อยู่สำหรับการซื้อขายทางออนไลน์โดยอัตโนมัติ การใช้ปุ่มตำแหน่งน่าจะเป็นตัวเลือกที่ดีที่สุดในการลดความยุ่งยากของผู้ใช้และการพึ่งพาสิทธิ์ที่มีขอบเขตกว้างขึ้น
  • หากแอปต้องใช้ตำแหน่งบ่อยๆ ให้ประกาศสิทธิ์ ACCESS_COARSE_LOCATION สิทธิ์นี้จะให้การประมาณตำแหน่งของอุปกรณ์ จากบริการตำแหน่งตามที่อธิบายไว้ในเอกสารประกอบ เกี่ยวกับ ความแม่นยำของตำแหน่งคร่าวๆ
  • หากแอปต้องใช้ตำแหน่งไม่บ่อยนักหรือเพียงครั้งเดียว ให้ลองขอให้ผู้ใช้ป้อนที่อยู่หรือรหัสไปรษณีย์แทน

กรณีการใช้งานอื่นๆ อาจต้องมีการประมาณตำแหน่งของอุปกรณ์ที่แม่นยำยิ่งขึ้น ซึ่งเป็นเพียงกรณีที่คุณประกาศสิทธิ์ ACCESS_FINE_LOCATION ได้

สร้างและเข้าถึงไฟล์

Android ช่วยให้คุณสร้างและเข้าถึงไฟล์ได้โดยไม่ต้องประกาศสิทธิ์ใดๆ ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูลหรือเซ็นเซอร์

เปิดไฟล์สื่อ

แอปของคุณอาจอนุญาตให้ผู้ใช้เลือกจากรูปภาพและวิดีโอของตนเอง เช่น สำหรับไฟล์แนบในข้อความหรือรูปโปรไฟล์

หากต้องการรองรับฟังก์ชันการทำงานนี้ ให้ใช้เครื่องมือเลือกรูปภาพ เครื่องมือเลือกรูปภาพไม่จำเป็นต้องใช้สิทธิ์รันไทม์ใดๆ เมื่อผู้ใช้โต้ตอบกับตัวเลือกรูปภาพเพื่อเลือกรูปภาพหรือวิดีโอที่จะแชร์กับแอป ระบบจะให้สิทธิ์เข้าถึงแบบอ่านชั่วคราวแก่ URI ที่เชื่อมโยงกับไฟล์สื่อที่เลือก

หากแอปต้องเข้าถึงไฟล์สื่อโดยไม่ใช้เครื่องมือเลือกรูปภาพ คุณไม่จำเป็นต้องประกาศสิทธิ์พื้นที่เก็บข้อมูลใดๆ ดังนี้

  • หากคุณเข้าถึงไฟล์สื่อที่แอปของคุณสร้างขึ้น แอปของคุณจะมีสิทธิ์เข้าถึง ไฟล์เหล่านี้ใน MediaStore อยู่แล้ว
  • หากคุณเข้าถึงไฟล์สื่อที่แอปอื่นสร้างขึ้น ให้ใช้ Storage Access Framework

เปิดเอกสาร

แอปของคุณอาจแสดงเอกสารที่ผู้ใช้สร้างขึ้น ไม่ว่าจะในแอปของคุณหรือในแอปอื่น ตัวอย่างที่พบบ่อยคือไฟล์ข้อความ

ในกรณีนี้ ให้ประกาศ READ_EXTERNAL_STORAGE เพื่อความเข้ากันได้กับอุปกรณ์รุ่นเก่าเท่านั้น ตั้งค่า android:maxSdkVersion เป็น 28

ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้ ทั้งนี้ขึ้นอยู่กับว่าแอปใดเป็นผู้สร้างเอกสาร

ถ่ายรูป

ผู้ใช้อาจถ่ายรูปในแอปของคุณโดยใช้แอปกล้องถ่ายรูปของระบบที่ติดตั้งไว้ล่วงหน้า

ในกรณีนี้ อย่าประกาศสิทธิ์ 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() จะแสดงกล่องโต้ตอบที่ระบุสิทธิ์ที่แอปต้องการใช้ แต่ไม่ได้อธิบายเหตุผล ซึ่งอาจทำให้ผู้ใช้สงสัย

อ่าน คำแนะนำในการออกแบบเพื่อดูรายละเอียดและคำแนะนำเพิ่มเติมเกี่ยวกับวิธีและเวลาที่จะแสดงกล่องโต้ตอบนี้

จัดการการปฏิเสธสิทธิ์

แอปของคุณควรช่วยให้ผู้ใช้เข้าใจผลที่ตามมาของการปฏิเสธสิทธิ์ทั้งก่อนและหลังที่ผู้ใช้เลือกที่จะทำเช่นนั้น

อ่านคำแนะนำในการออกแบบ