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.