วิธีขอสิทธิ์จากบริการใน Android Marshmallow


101

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

มีวิธีใดบ้างในการขอสิทธิ์จากบริการ? หรือบังคับให้อนุญาตในเวลาติดตั้งเหมือนในอดีตหรือไม่


ปัญหานี้ยังอยู่ในคลาส Application
itzhar

ลองทำดูนะครับstackoverflow.com/a/41221852/5488468
Bipin Bharti

ห้องสมุดของฉันสามารถจัดการสิทธิ์รันไทม์ได้อย่างง่ายดายจากบริบทใด ๆ และยังจัดการกับ "อย่าถามอีก" github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

คำตอบ:


47

requestPermission()สามารถเรียกได้จาก an Activityและไม่ใช่Service(ไม่เหมือนกับcheckPermission()ที่ต้องการเท่านั้นPackageManager) ดังนั้นคุณต้องทำงานพิเศษเพื่อหลีกเลี่ยงสิ่งนั้น คุณจำเป็นต้องระบุActivityในแอปของคุณและตัวอย่างเช่นคุณServiceสามารถตรวจสอบสิทธิ์ที่ต้องการและหากยังไม่ได้รับอนุญาตก็สามารถสร้างการแจ้งเตือนและสามารถแจ้งให้ผู้ใช้ทราบด้วยข้อความสั้น ๆ ที่อธิบายถึงสาเหตุที่มี การแจ้งเตือนและสิ่งที่ต้องเกิดขึ้นเมื่อคลิกที่การแจ้งเตือน ฯลฯ


นี่คือทางออกที่Benjamin Poieszเสนอ คุณสามารถฟังพอดคาสต์นี้ได้ตั้งแต่เวลา 23:40 น.
xiaomi

คุณยังสามารถเรียก requestPermission () ภายในแฟรกเมนต์
Misagh Emamverdi

3
วิธีแก้ปัญหาสำหรับกรณีของบริการพื้นหลังที่ทำงานอยู่ตรวจสอบการอัปเดตตำแหน่งเป็นระยะ ๆ และฉันเพิ่งปิดการอนุญาตตำแหน่งในการตั้งค่า เนื่องจากไม่มีกิจกรรมนี้ทำให้บริการของฉันหยุดทำงานเมื่อฉันเปิดแอปอีกครั้ง
stud91

1
@ stud91 อย่างน้อยที่สุดให้ตรวจจับข้อยกเว้นด้านความปลอดภัยหรือขออนุญาตทุกครั้งที่คุณร้องขอการอัปเดตตำแหน่ง วิธีนี้จะป้องกันไม่ให้แอปของคุณหยุดทำงาน (แม้ว่าคุณจะไม่ได้รับตำแหน่งใด ๆ หากสิทธิ์ถูกเพิกถอน) ที่ดีไปกว่านั้น: ตรวจสอบการอนุญาตและหากไม่มีให้แสดงการแจ้งเตือนที่นำผู้ใช้ไปยังกิจกรรมซึ่งเป็นเพียงตัวยึดสำหรับกล่องโต้ตอบสิทธิ์
user149408

8
นี่คือวิธีที่ฉันแก้ไข: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/…สามารถเรียกจากสิ่งใดก็ได้Contextที่ใช้OnRequestPermissionsResultCallbackเช่นกัน requestPermission()การทำงานจะคล้ายกับมาตรฐาน
user149408

15

ฉันยอมรับว่านี่เป็นปัญหามากสำหรับบริการฉันคิดว่าคุณควรรายงานปัญหาในหน้าตัวอย่างนักพัฒนา Android สำหรับสิ่งนี้

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


7

ดูไลบรารีPermissionEverywhere ช่วยให้คุณสามารถขออนุญาตจากบริบทใด ๆ

จะสร้างการแจ้งเตือนโดยคลิกที่จะเปิดกิจกรรมเพื่อขออนุญาต

โค้ดตัวอย่างจากหน้า github ของไลบรารี: -

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }

1
ฉันได้ลองใช้เวอร์ชัน async ในบริการแล้ว แต่ไม่ได้ผล onComplete ไม่เคยถูกเรียก
Leo Droidcoder

เป็นความคิดที่ดี แต่ไม่มีในพื้นที่เก็บข้อมูล
naXa

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

ฉันใช้งานPermissionEverywhereแอปสาธิต แต่ไม่ได้ผล
Ixx

2

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

ลองดูสิ: สิทธิ์ของ Android


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.