86

Android Marshmallow'da, bir uygulama yüklendiğinde, hepsi bir defada olmak yerine, gerektiğinde izinler çalışma zamanında istenmelidir. Ancak, uygulamanızın yalnızca Hizmetleri içerdiğinden bir sorun olan bir Etkinlikten izin isteğinde bulunabiliyorum. (Neden böyle bir soru sorabilirsin? Uygulamanın içinde bir Android Wear saat yüzü var, ve tüm telefon yok saatine göndermek için yakındaki fotoğrafları aramak gerekiyor - Etkinlik gerekmiyor. Ama burası konum izinleri gerektiriyor.)Android Marshmallow'da bir Hizmetten izin isteme

Hizmetlerden izin almak için herhangi bir yol var mı? Ya da bir şekilde izinlerin geçmişte olduğu gibi yükleme zamanında verilmesini zorunlu kılıyor mu?

+0

Uygulama sınıfının – itzhar

+0

içeride de bu sorun çalışma zamanı izinleri uygulamayı iş http://stackoverflow.com/a/41221852/5488468 –

+0

Benim kütüphane olabilir bu deneyin:

denemeye Do Herhangi bir Bağlamdan kolayca ve "Tekrar sorma" işlemlerini gerçekleştirir. https://github.com/nabinbhandari/Android-Permissions –

cevap

11

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

Şu anda, en iyi çözüm hizmet izni almak ve izin eksikse bildirimi göstermek olduğunu düşünüyorum. Daha da iyisi, kullanıcılar bildirime bastığında izin istemek için bir DialogActivity oluşturun.

33

requestPermission() sadece (sadece PackageManager gerektirir checkPermission() aksine) bir Service bir Activity olup çağrılabilir. Bu yüzden etrafta dolaşmak için fazladan iş yapmalısınız; Uygulamanızda bir Activity sağlamanız gerekir ve örneğin, Service, ihtiyaç duyduğu izinleri kontrol edebilir ve henüz onaylanmadıysa, bir bildirim oluşturabilir ve kullanıcıya neden açıklayıcı bir kısa mesaj gönderebilir? Bir bildirim ve bildirime tıklandığında ne olması gerekir.

+0

Bu, [Benjamin Poiesz] 'in (https://plus.google.com/111703124687948696691/posts) önerdiği çözümdür. Bu [podcast] 'ı (http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html) 23:40 – xiaomi

+0

'dan dinleyebilirsiniz. Ayrıca requestPermission() parçasının iç kısmını da arayabilirsiniz. –

+3

Yer güncellemeleri için periyodik olarak denetlenen bir arka plan hizmetinin durumu için çözüm nedir ve yalnızca ayarlarda konum iznini kapatıyorum.Hiçbir etkinlik olmadığından, bu, hizmetimi yeniden açtığımda hizmetimin çökmesine neden olur – stud91

-3

Kullanıcı yanıtını bir alıcı oluşturmak için ResultReceiver numaralı telefonu kullanabilir, daha sonra bunu bildirimin PendingIntent aracılığıyla Aktiviteye geri arama olarak iletebilirsiniz. Reference

8

PermissionEverywhere kütüphanesine bir göz atın. Herhangi bir içerikten izin almanızı sağlar.

İzin istediği bir etkinliği açtığı bir bildirim oluşturur. Kütüphanenin 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 uyumsuz sürümü denedim ve çalışmadı. onComplete hiçbir zaman –

+0

olarak adlandırılmamıştır İyi bir fikir, ancak depoda mevcut değil – naXa

+0

Bu paket benim için çalıştı, öneriniz için teşekkürler. Yine de, uyumsuz sürümü denemedim. Ayrıca, 'PermissionEverywhere' kullanarak sorun yaşayanlar için, manifestinizde yardım etkinliğini bildirdiğinizden emin olun VE bunu bildirdiğinizde, doğru pakete bağlı olduğundan emin olun (eğer 'PermissionEverywhere' kullanıyorsanız ayrı paket). Bildiride 'PermissionEverywhere' paketini aslında belirtmediğimi farketmem uzun zaman aldı. – user3570982

2

tam bunu sağlayan çok basit bir kütüphane bulunmaktadır. Uygulamanın ön planda veya arka planda olup olmadığına bağlı olarak izinleri herhangi bir yerden (bir hizmetten bile) kontrol edebilir, normal iletişim kutusunu gösterir veya izin isteyen bir bildirim oluşturur. Kodun anlaşılması gerçekten çok kolay ve kullanımı gerçekten çok kolay. Android Permissions

2
@SuppressLint("NewApi") 
public void checkPerm() 
{ 
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {....} 
} 
İlgili konular