2015-09-22 28 views
8

kaldırıp compileSdkVersion i GPS Dinleyici LocationListener uygulayan bir sınıf olduğu gps güncellemesini durdurmak için kodKonum Yöneticisi ben robot stüdyo kullanıyorum güncellemeler izni

if(locationManager != null){ 
      locationManager.removeUpdates(GPSListener.this); 
     } 

altında kullandığımı 23 olduğunu.

ama removeUpdates doğrultusunda i tiftik uyarı altına alıyorum

Çağrı kullanıcı tarafından reddedilebilir izin gerektirir: izni varsa kod açıkça görmek için kontrol etmelidir (ile checkPermission) veya potansiyel işlemek SecurityException

Yukarıdaki kodda sorun nedir anlamıyorum. Bildirim dosyasında ek izin almanız gerekir?

Saygılarımızla. Konum API işlevi aramadan önce

+1

https://developer.android.com/preview/features/runtime-permissions.html – Kuffs

cevap

26

SDK 23 olduğundan,/ihtiyaç izni kontrol etmek gerekir.

if (locationManager != null) { 
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
      || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
     locationManager.removeUpdates(GPSListener.this); 
    } 
} 

'sen' (bu uygulama) doğru izinlere sahip olmadığını kontrol etmek olan checkSelfPermission() yok: İşte bunu nasıl bir örnektir. Başka bir işlemin doğru izinlere sahip olup olmadığını kontrol etmek için de checkPermission() vardır.

Notlar Bu çalışma zamanı kontrol gerçekleştiriyor yanındaki

  • , AndroidManifest ilgili izinleri gerektiren hala gereklidir. senin targetSdk < 23 ise
  • , sen benim dk API 14 ve 23 gereklidir çünkü
+0

teşekkürler Tim. Sorunumu çözdü. –

+8

Hedefinizin <23 olması durumunda, bunun yerine ContextCompat.checkSelfPermission() yöntemini kullanmanız gerektiğini unutmayın. –

+0

Ağlamak istiyorum. Uygulamanın, zaten bağlı bir konum listelemeyi konum yöneticisinden kaldırmak için neden izin alması gerekiyor? –

14

Ben checkSelfPermission() kullanmak mümkün değildi yerine (JerryBrady sayesinde) ContextCompat.checkSelfPermission() kullanmalıdır. bilerek da yapabilirsiniz trycatch bir SecurityException için.

Örnek:

try { 
    locationManager.removeUpdates(GPSListener.this); 
} catch (SecurityException e) { 
    Log.e("PERMISSION_EXCEPTION","PERMISSION_NOT_GRANTED"); 
} 
+0

Soru dk API ile hiçbir ilişkisi yoktur hedef sdk sürümü 23. içindir. –

+2

Soru uygulaması 23 hedefliyor anlamına gelmez ki "compileSdkVersion 23" içindi. Tam Android M desteği ile geriye dönük uyumluluk istiyorsanız, bunun yerine ContextCompat.checkSelfPermission() kullanın ve işe yarayacaktır. –

+1

Üzgünüm. Bunu farketmedim. Ama bence bu seçeneği kullanmanın hala yararlı olduğunu düşünüyorum. –

5

ContextCompat ilgili Jerry Brady'nin yorumuna eklemek için bu < 23 tam kodu olması ise:

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
       || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
-1

İşte benim çözümdür!

if (Build.VERSION.SDK_INT >= 23) { 

       if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
         || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 

        lm.removeUpdates(this); 
       } 
      } 
      else 
      { 
       lm.removeUpdates(this); 

      }