Android Marshmallow'da bir Hizmetten nasıl izin istenir?


101

Android Marshmallow'da izinler, bir uygulama yüklendiğinde bir kerede değil, gerektiğinde çalışma zamanında istenmelidir. Ancak, uygulamam yalnızca Hizmetler içerdiğinden, yalnızca bir Etkinlikten izin talep edebiliyorum, bu bir sorun. (Neden diye sorabilirsiniz? Uygulamanın içinde bir Android Wear saat yüzü var ve telefonun yaptığı tek şey saate göndermek için yakındaki fotoğrafları aramaktır - Aktivite gerekmez. Ancak konum izinleri gerektirir.)

Öyleyse, bir Hizmetten izin istemenin herhangi bir yolu var mı? Ya da bir şekilde izinleri geçmişte olduğu gibi yükleme sırasında verilmeye zorlar mı?


bu sorun Uygulama sınıfında da
itzhar


Kitaplığım, herhangi bir Bağlamdan çalışma zamanı izinlerini kolayca işlemek için ve ayrıca "Bir daha sorma" seçeneğini de ele alıyor. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Yanıtlar:


47

requestPermission()yalnızca an'dan çağrılabilir Activityve Servicea'dan çağrılabilir ( checkPermission()yalnızca gerektirdiğinden farklı olarak PackageManager). Bu nedenle, bunun üstesinden gelmek için fazladan iş yapmanız gerekiyor; Activityuygulamanızda bir tane sağlamanız gerekir ve örneğin, Serviceihtiyaç duyduğu izinleri kontrol edebilirsiniz ve henüz verilmemişse, bir bildirim oluşturabilir ve bu, kullanıcıyı neden olduğu konusunda açıklayıcı bir kısa mesajla bilgilendirebilir. bir bildirim ve bildirime tıkladıklarında ne olması gerektiği vb.


Benjamin Poiesz'in önerdiği çözüm budur . Bu podcast'i 23
40'tan

Parça içinde requestPermission () da çağırabilirsiniz.
Misagh Emamverdi

3
Konum güncellemeleri için periyodik olarak kontrol eden bir arka plan hizmeti durumunda çözüm nedir ve ayarlarda konum iznini kapatıyorum. Herhangi bir etkinlik olmadığından, bu, uygulamayı yeniden
açtığımda hizmetimin

1
@ stud91 En azından, her konum güncellemesi talep ettiğinizde güvenlik istisnalarını yakalayın veya izinleri sorgulayın. Bu, uygulamanızın kilitlenmesini önleyecektir (ancak izin iptal edilmişse herhangi bir konum alamazsınız). Daha da iyisi: izni kontrol edin ve eksikse, kullanıcıyı izinler iletişim kutusu için yalnızca bir yer tutucu olan bir Etkinliğe götüren bir bildirim görüntüleyin.
user149408

8
Bunu nasıl çözdüm : github.com/mvglasow/satstat/blob/master/src/com/vonglasow/…Context Ayrıca uygulayan herhangi birinden çağrılabilir OnRequestPermissionsResultCallback. İşlevsellik standarda benzer requestPermission().
user149408

15

Kabul ediyorum, bu hizmetler için çok zahmetli, bunun için Android Geliştirici Önizlemesi sayfasında bir sorun bildirmeniz gerektiğini düşünüyorum.

Şu anda en iyi çözümün servis izni olup olmadığını kontrol etmek ve izin eksikse bildirimde bulunmak olduğunu düşünüyorum. Daha da iyisi, kullanıcılar bildirime bastığında izin istemek için bir DialogActivity oluşturun.


7

PermissionEverywhere kitaplığına bir göz atın . Herhangi bir bağlamdan izin istemenize izin verir.

İzin isteyen bir etkinliği açtığı bir bildirim oluşturur.

Kitaplığın github sayfasından örnek kod: -

@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
Bir Hizmette eşzamansız sürümü denedim ve işe yaramadı. onComplete hiçbir zaman çağrılmıyor
Leo Droidcoder

İyi fikir, ancak depoda mevcut değil
naXa

2
Bu paket benim için çalıştı, öneri için teşekkürler. Eşzamansız sürümü denemediğimi not etmeliyim. Ayrıca, kullanımda sorun yaşayanlar için PermissionEverywhere, manifestinizde yardımcı etkinliği bildirdiğinizden ve bunu bildirirken doğru pakete ( PermissionEverywhereayrı bir paket olarak kullanıyorsanız) bağlı olduğundan emin olun . Bildiride PermissionEverywherepaketi gerçekten belirtmediğimi anlamam uzun zaman aldı .
user3570982

Koştum PermissionEverywhere'ın demo uygulaması ve çalışma yoktu.
Ixx

3

Tam olarak bunu yapmaya izin veren çok basit bir kütüphane var. Uygulamanın ön planda mı yoksa arka planda mı olduğuna bağlı olarak herhangi bir yerden (bir hizmetten bile) izinleri kontrol edebilirsiniz, ya normal iletişim kutusu gösterir ya da izinler isteyen bir bildirim oluşturur. Kodun anlaşılması gerçekten çok kolay ve kullanımı da gerçekten çok kolay.

Bir deneyin: Android İzinleri


-2

ResultReceiverKullanıcıların cevabının bir alıcısını oluşturmak için kullanabilirsiniz , ardından bunu bildirimler aracılığıyla Aktiviteye geri arama olarak iletebilirsiniz PendingIntent. Referans

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.