Google Play Hizmetleri ve Çalışma Zamanı İzinleri

Android 6.0 Marshmallow sürümünden itibaren Bu izin modelini, uygulama yükleme sürecini basitleştiren izin modeli otomatik güncelleme sürecini takip edin. İzinler daha önce değil, çalışma zamanında isteniyor nasıl kullanacağınızı göstereceğim. Ayrıca, kullanıcılar belirli izinleri reddetmeyi seçebilir. Kullanıcılara bu esnekliği sağlamak için uygulamanızın Kullanıcı belirli bir izni etkinleştirdiğinde veya devre dışı bıraktığında beklenen değer.

Google Play Hizmetleri'nin kendisinde kullanıcıların seçebileceği çalışma zamanı izinleri vardır tarafından özel olarak istenen bu izinlerden ayrı olarak bir uygulamadır. Google Play Hizmetleri, ihtiyaç duyduğu tüm izinleri otomatik olarak alır API'lerini desteklemeye başladı. Ancak uygulamanız yine de çalışma zamanını kontrol edip istemelidir bir kullanıcının sorunları çözdüğü durumlarda ve hataları uygun şekilde ele alarak Google Play hizmetlerine, uygulamanızın kullandığı bir API için gereken izni reddetti.

Kullanıcının beklentilerini karşılayacak şekilde izinlerin ayarlanmasıyla ilgili biraz zaman alabilir. Aşağıdaki en iyi uygulamalar, düşünmenizi sağlar.

Ön koşullar

AndroidManifest.xml dosyanızda izinleri beyan etmeniz gerekir. Örneğin:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Yönergeler

API'leri çağırmadan önce izinleri doğrulama

AndroidManifest.xml dosyası varsa gerekli izne sahip olduğunuzdan emin olun . Bu işlem, checkSelfPermission yöntemi kullanılarak yapılabilir. ActivityCompat veya ContextCompat.

Çağrı false (yanlış) değerini döndürürse bu, izinlerin verilmediği ve bunları istemek için requestPermissions kullanmalıdır. Buna verilecek yanıt bir geri çağırmada döndürülür.

Örneğin:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {
  // Check Permissions Now
  ActivityCompat.requestPermissions(this,
      new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
      REQUEST_LOCATION);
} else {
  // permission has been granted, continue as usual
  Task<Location> locationResult = LocationServices
      .getFusedLocationProviderClient(this /** Context */)
      .getLastLocation();
}

İstek izni geri çağırmasını uygulama

Uygulamanızın ihtiyaç duyduğu izin kullanıcı tarafından Şu soruyu sormak için requestPermissions yöntemi çağrılmalıdır: kabul etmesini sağlar. Kullanıcının yanıtı onRequestPermissionsResult geri arama. Uygulamanız bunu uygulayın ve döndürülen değerleri her zaman kontrol edin çünkü istek reddedildi veya iptal edildi. Ayrıca, şu adresten birden fazla izin isteyebilir ve bu izinleri kontrol edebilirsiniz: Aşağıdaki örnek yalnızca tek bir izni kontrol eder.

public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions,
                                       int[] grantResults) {
    if (requestCode == REQUEST_LOCATION) {
        if(grantResults.length == 1
           && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // We can now safely use the API we requested access to
            Task<Location> locationResult = LocationServices
                .getFusedLocationProviderClient(this /** Context */)
                .getLastLocation();
        } else {
            // Permission was denied or request was cancelled
        }
    }
}

İzin gerekçesini göster

Uygulamanızın istediği izinler uygulamanızın temel özellikleri için gerekliyse kullanıcı daha önce izin isteğini reddettiyse, uygulamanız tekrar izin istemeden önce ek açıklama görüntüleyin. Kullanıcı Sayısı izninin nedenini anladığında izin verme ihtimalleri daha yüksektir. neye ihtiyacı olduğunu ve ona hemen fayda sağlayacağını konuşmuştuk.

Bu durumda, requestPermissions numaralı telefondan önce şu numarayı aramanız gerekir: shouldShowRequestPermissionRationale Geri dönerse true (doğruysa) ile ilgili ek bağlam görüntüleyecek bazı kullanıcı izni gerekir.

Örneğin, kodunuz aşağıdaki gibi görünebilir:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {
    // Check Permissions Now
    private static final int REQUEST_LOCATION = 2;

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Display UI and wait for user interaction
    } else {
        ActivityCompat.requestPermissions(
            this, new String[]{Manifest.permission.LOCATION_FINE},
            ACCESS_FINE_LOCATION);
    }
} else {
    // permission has been granted, continue as usual
    Task<Location> locationResult = LocationServices
        .getFusedLocationProviderClient(this /** Context */)
        .getLastLocation();
}

Bağlantı hatalarını işleme

Uygulamanız kullanımdan kaldırılan GoogleApiClient hizmetini kullanıyorsa connect(), Google Play Hizmetleri tüm özelliklere sahip olduğunu ve gerekli izinlere sahip olmalısınız. Herhangi bir izin grubu olduğunda connect() başarısız olur Google Play hizmetlerinin kendisi için gereken eksik.

connect() çağrısı başarısız olursa uygulamanızın şunları işlediğinden emin olun: bağlantı hatasını doğru şekilde önleyin. Google Play Hizmetleri kendisinin izinleri eksik. Şunlar için startResolutionForResult() yöntemini çağırabilirsiniz: Sorunları düzeltmek için kullanıcı akışını başlatın.

Örneğin:

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (mResolvingError) {
        // Already attempting to resolve an error.
        return;
    } else if (result.hasResolution()) {
        try {
            mResolvingError = true;
            result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
        } catch (SendIntentException e) {
            // There was an error with the resolution intent. Try again.
            mGoogleApiClient.connect();
        }
    } else {
        // Show dialog using GooglePlayServicesUtil.getErrorDialog()
        showErrorDialog(result.getErrorCode());
        mResolvingError = true;
    }
}

GoogleApi tabanlı daha yeni API çağrıları otomatik olarak istemci bir Activity veya sistem tepsisi bildirimi (eğer ise istemci bir Context ile örneklendirildiğinde) kullanıcının izinlerin çözümleme niyetine değineceğiz. Şu süre geçtikten sonra aramalar sıraya alınır ve yeniden denenir: izin verildi.