Cara meminta izin dari Layanan di Android Marshmallow

101

Di Android Marshmallow, izin harus diminta saat runtime saat diperlukan, bukan sekaligus saat aplikasi diinstal. Namun, sepertinya saya hanya dapat meminta izin dari suatu Aktivitas, yang menjadi masalah karena aplikasi saya hanya berisi Layanan. (Mengapa begitu, Anda mungkin bertanya? Aplikasi ini memiliki tampilan jam Android Wear yang dipaketkan di dalamnya, dan yang dilakukan ponsel hanyalah mencari foto di sekitar untuk dikirim ke jam tangan - tidak perlu Aktivitas. Tetapi aplikasi ini memerlukan izin lokasi.)

Jadi, adakah cara untuk meminta izin dari Layanan? Atau entah bagaimana memaksa untuk diberikan izin pada waktu penginstalan seperti di masa lalu?

Tony Wickham
sumber
masalah ini juga di dalam kelas Aplikasi
itzhar
Coba ini mungkin work stackoverflow.com/a/41221852/5488468
Bipin Bharti
Perpustakaan saya untuk menangani izin runtime dengan mudah dari Konteks apa pun dan juga menangani "Jangan tanya lagi". github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Jawaban:

47

requestPermission()hanya dapat dipanggil dari Activitydan bukan a Service(tidak seperti checkPermission()yang hanya membutuhkan PackageManager). Jadi, Anda perlu melakukan pekerjaan ekstra untuk menyiasatinya; Anda perlu memberikannya Activitydi aplikasi Anda dan, misalnya, Anda Servicedapat memeriksa izin yang diperlukannya dan jika izin tersebut belum diberikan, itu dapat membuat pemberitahuan dan yang dapat memberi tahu pengguna dengan pesan singkat deskriptif tentang mengapa ada pemberitahuan dan apa yang perlu terjadi ketika mereka mengeklik pemberitahuan, dll.

Ali Naddaf
sumber
Ini adalah solusi yang diusulkan Benjamin Poiesz . Anda dapat mendengarkan podcast ini dari 23:40
xiaomi
Anda juga bisa memanggil requestPermission () di dalam fragmen.
Misagh Emamverdi
3
Apa solusi untuk kasus layanan latar belakang yang berjalan yang memeriksa pembaruan lokasi secara berkala dan saya hanya mematikan izin lokasi di pengaturan. Karena tidak ada aktivitas, ini menyebabkan layanan saya macet ketika saya membuka kembali aplikasi
stud91
1
@ stud91 Paling tidak, tangkap pengecualian keamanan atau izin kueri setiap kali Anda meminta pembaruan lokasi. Ini akan mencegah aplikasi Anda mogok (meskipun Anda tidak akan mendapatkan lokasi apa pun jika izin telah dicabut). Bahkan lebih baik: periksa izin, dan jika tidak ada, tampilkan pemberitahuan yang membawa pengguna ke Aktivitas yang hanya merupakan placeholder untuk dialog izin.
pengguna149408
8
Begini cara saya menyelesaikannya: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… Dapat dipanggil dari Contextmana saja yang juga diimplementasikan OnRequestPermissionsResultCallback. Fungsinya mirip dengan standar requestPermission().
pengguna149408
15

Saya setuju, ini sangat merepotkan untuk layanan, saya pikir Anda harus melaporkan masalah di halaman Pratinjau Pengembang Android untuk ini.

Saat ini, menurut saya solusi terbaik adalah memeriksa izin layanan, dan menampilkan pemberitahuan jika izin tidak ada. Lebih baik lagi, buat DialogActivity untuk meminta izin ketika pengguna menekan notifikasi.

Derek Fung
sumber
7

Lihat perpustakaan PermissionEverywhere . Ini memungkinkan Anda untuk meminta izin dari konteks apa pun.

Ini membuat pemberitahuan mengklik yang membuka aktivitas yang meminta izin.

Kode contoh dari halaman github perpustakaan: -

@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
      }
  }
Heisenberg
sumber
1
Saya sudah mencoba versi async dalam sebuah Layanan dan tidak berhasil. onComplete tidak pernah dipanggil
Leo Droidcoder
Ide bagus, tapi tidak tersedia di repositori
naXa
2
Paket ini berhasil untuk saya, terima kasih atas sarannya. Namun, saya perhatikan bahwa saya tidak mencoba versi asinkron. Selain itu, bagi mereka yang mengalami masalah dalam menggunakan PermissionEverywhere, pastikan Anda mendeklarasikan aktivitas helper dalam manifes Anda DAN pastikan bahwa saat Anda mendeklarasikannya, aktivitas tersebut terkait dengan paket yang benar (jika Anda menggunakan PermissionEverywheresebagai paket terpisah). Butuh waktu lama bagi saya untuk menyadari bahwa sebenarnya saya tidak menentukan PermissionEverywherepaket dalam manifes.
pengguna3570982
Saya menjalankan PermissionEverywhereaplikasi demo dan tidak berhasil.
Ixx
2

Ada perpustakaan yang sangat sederhana yang memungkinkan melakukan hal ini. Anda dapat memeriksa izin dari mana saja (bahkan dari layanan), berdasarkan apakah aplikasi berada di latar depan atau latar belakang, aplikasi tersebut menampilkan dialog normal atau menghasilkan pemberitahuan yang meminta izin. Kode ini sangat mudah dipahami dan juga sangat mudah digunakan.

Cobalah: Izin Android

Nishkarsh
sumber
-2

Anda dapat menggunakan ResultReceiveruntuk membuat penerima jawaban pengguna, lalu meneruskannya sebagai panggilan balik ke Aktivitas, melalui notifikasi PendingIntent. Referensi

Farrux Bahodirov
sumber