Tüm Android uygulamaları sınırlı erişime sahip bir korumalı alanda çalışır. Uygulamanızın kendi korumalı alanının dışında kaynak veya bilgi kullanması gerekiyorsa çalışma zamanı izni beyan edebilir ve bu erişimi sağlayan bir izin isteği oluşturabilirsiniz. Bu adımlar, izinleri kullanma iş akışının bir parçasıdır.
Tehlikeli izinler beyan ettiyseniz ve uygulamanız Android 6.0 (API düzeyi 23) veya sonraki sürümleri çalıştıran bir cihaza yüklendiyse çalışma zamanında bu kılavuzdaki adımları uygulayarak tehlikeli izinleri istemeniz gerekir.
Tehlikeli bir izin beyan etmezseniz veya uygulamanız Android 5.1 (API düzeyi 22) ya da daha düşük sürümleri çalıştıran bir cihaza yüklenmişse izinler otomatik olarak verilir ve bu sayfadaki kalan adımların hiçbirini tamamlamanız gerekmez.
Temel ilkeler
Çalışma zamanında izin istemeyle ilgili temel ilkeler şunlardır:
- Kullanıcı bunu gerektiren özellikle etkileşim kurmaya başladığında, bağlam içinde izin isteyin.
- Kullanıcıyı engellemeyin. Her zaman eğitim amaçlı kullanıcı arayüzü akışını iptal etme seçeneği sunun (ör. izin almanın gerekçesini açıklayan bir akış).
- Kullanıcı bir özelliğin ihtiyaç duyduğu izni reddeder veya iptal ederse uygulamanızı kullanmaya devam edebilmesi için muhtemelen izni gerektiren özelliği devre dışı bırakarak uygulamanızın düzeyini düşürün.
- Herhangi bir sistem davranışı varsayımında bulunmayın. Örneğin, izinlerin aynı izin grubunda yer aldığını varsaymayın. İzin grubu yalnızca bir uygulama yakından alakalı izinler istediğinde sistemin kullanıcıya sunulan sistem iletişim kutularının sayısını en aza indirmesine yardımcı olur.
İzin isteme iş akışı
Uygulamanızda çalışma zamanında istenen izinleri beyan etmeden ve istemeden önce uygulamanızın bunu yapması gerekip gerekmediğini değerlendirin. Uygulamanızda fotoğraf çekme, medya oynatmayı duraklatma ve alakalı reklamlar gösterme gibi birçok kullanım alanını izin beyan etmenize gerek kalmadan yerine getirebilirsiniz.
Uygulamanızın çalışma zamanında istenen izinleri beyan etmesi ve istemesi gerektiğini düşünüyorsanız aşağıdaki adımları tamamlayın:
- Uygulamanızın manifest dosyasında, uygulamanızın istemesi gerekebilecek izinleri belirtin.
- Uygulamanızın kullanıcı deneyimini, uygulamanızdaki belirli işlemlerin belirli çalışma zamanı izinleriyle ilişkilendirilecek şekilde tasarlayın. Kullanıcılara, uygulamanızın gizli kullanıcı verilerine erişmesi için izin vermelerini gerektirebilecek işlemleri bildirin.
- Kullanıcının uygulamanızda belirli gizli kullanıcı verilerine erişim gerektiren görevi veya işlemi çağırmasını bekleyin. Bu sırada uygulamanız bu verilere erişmek için gerekli çalışma zamanı iznini isteyebilir.
Uygulamanızın gerektirdiği kullanıcının çalışma zamanı iznini önceden verip vermediğini kontrol edin. Öyleyse uygulamanız gizli kullanıcı verilerine erişebilir. Çalışmıyorsa bir sonraki adıma geçin.
Söz konusu izni gerektiren bir işlemi her gerçekleştirdiğinizde izniniz olup olmadığını kontrol etmeniz gerekir.
Uygulamanızın bir gerekçe gösterip göstermeyeceğini kontrol edin ve uygulamanızın çalışma zamanında istenen izni neden vermesi gerektiğini açıklayın. Sistem, uygulamanızın bir gerekçe göstermemesi gerektiğini belirlerse kullanıcı arayüzü öğesi göstermeden doğrudan sonraki adıma geçin.
Ancak sistem, uygulamanızın bir gerekçe göstermesi gerektiğini belirlerse gerekçeyi kullanıcıya bir kullanıcı arayüzü öğesinde sunun. Bu gerekçeyle uygulamanızın hangi verilere erişmeye çalıştığını ve çalışma zamanında istenen izni vermesi durumunda uygulamanın kullanıcıya ne gibi avantajlar sağlayabileceğini net bir şekilde açıklayın. Kullanıcı gerekçeyi kabul ettikten sonra bir sonraki adıma geçin.
Uygulamanızın gizli kullanıcı verilerine erişmek için ihtiyaç duyduğu çalışma zamanı iznini isteyin. Sistem, izinlere genel bakış sayfasında gösterilene benzer bir çalışma zamanı izni istemi görüntüler.
Kullanıcının yanıtını (çalışma zamanı izni vermeyi veya reddetmeyi seçip seçmediğini) kontrol edin.
Kullanıcı, uygulamanıza izin verdiyse özel kullanıcı verilerine erişebilirsiniz. Kullanıcı bunun yerine izni reddetmişse uygulama deneyiminizi zarif bir şekilde düşürerek bu izinle korunan bilgiler olmadan kullanıcıya işlevsellik kazandırabilirsiniz.
Şekil 1'de bu işlemle ilişkili iş akışı ve kararlar gösterilmektedir:
Uygulamanıza daha önce izin verilip verilmediğini belirleme
Kullanıcının uygulamanıza daha önce belirli bir izin verip vermediğini kontrol etmek için bu izni ContextCompat.checkSelfPermission()
yöntemine iletin. Bu yöntem, uygulamanızın izne sahip olup olmadığına bağlı olarak PERMISSION_GRANTED
veya PERMISSION_DENIED
değerini döndürür.
Uygulamanızın neden bu izne ihtiyacı olduğunu açıklayın
requestPermissions()
yöntemini çağırdığınızda sistem tarafından gösterilen izinler iletişim kutusu, uygulamanızın hangi izni istediğini belirtir ancak bunun nedenini belirtmez. Bazı durumlarda, kullanıcı bu işlemi zor bulabilir. requestPermissions()
çağırmadan önce kullanıcıya uygulamanızın neden izin istediğini açıklamak iyi bir fikirdir.
Araştırmalar, uygulamanın neden bu izne ihtiyaç duyduğunu bilirlerse (örneğin, uygulamanın temel bir özelliğini desteklemek veya reklam vermek için iznin gerekip gerekmediğini) kullanıcıların izin istekleri konusunda çok daha rahat davrandıklarını gösteriyor. Sonuç olarak, bir izin grubuna giren API çağrılarının yalnızca bir kısmını kullanıyorsanız bu izinlerden hangilerini neden kullandığınızı açıkça listelemeniz yardımcı olur. Örneğin, yalnızca yaklaşık konum kullanıyorsanız bunu uygulama açıklamanızda veya uygulamanızla ilgili yardım makalelerinde kullanıcıya bildirin.
Belirli koşullar altında, kullanıcıların hassas verilere erişimi hakkında gerçek zamanlı olarak bilgilendirilmesi de yararlı olur. Örneğin, kameraya veya mikrofona erişiyorsanız uygulamanızın bir yerinde veya bildirim tepsisinde (uygulama arka planda çalışıyorsa) bildirim simgesini kullanarak durumu kullanıcıya bildirmek iyi bir fikirdir. Böylece, gizlice veri topluyormuşsunuz gibi görünmez.
Son olarak, uygulamanızda bir şeyin çalışması için izin istemeniz gerekiyorsa ancak bunun nedeni kullanıcı açısından net değilse kullanıcıya neden en hassas izinlere ihtiyacınız olduğunu bildirmenin bir yolunu bulun.
ContextCompat.checkSelfPermission()
yöntemi PERMISSION_DENIED
sonucunu döndürürse shouldShowRequestPermissionRationale()
yöntemini çağırın.
Bu yöntem true
sonucunu döndürürse kullanıcıya eğitici bir kullanıcı arayüzü gösterin. Bu kullanıcı arayüzünde, kullanıcının etkinleştirmek istediği özellik için neden belirli bir izne ihtiyaç duyulduğunu açıklayın.
Ayrıca, uygulamanız konum, mikrofon veya kamera ile ilgili izin isterse uygulamanızın bu bilgilere neden erişmesi gerektiğini açıklayın.
İzin iste
Kullanıcı eğitici bir kullanıcı arayüzünü görüntüledikten sonra veya döndürülen shouldShowRequestPermissionRationale()
değeri, eğitici bir kullanıcı arayüzü göstermenize gerek olmadığını belirttikten sonra izin isteyin. Kullanıcılar bir sistem izni iletişim kutusu görür. Burada uygulamanıza belirli bir izin verip vermemeyi seçebilirler.
Bunu yapmak için sistemin izin istek kodunu sizin yerinize yönetmesine izin verdiğiniz AndroidX kitaplığında yer alan RequestPermission
sözleşmesini kullanın. RequestPermission
sözleşmesini kullanmak mantığınızı daha basit hale getirdiğinden mümkün olduğunda önerilen çözüm budur. Ancak gerekirse izin isteğinin bir parçası olarak istek kodunu kendiniz de yönetebilir ve bu istek kodunu izin geri çağırma mantığınıza ekleyebilirsiniz.
Sistemin izin isteği kodunu yönetmesine izin ver
Sistemin bir izin isteğiyle ilişkili istek kodunu yönetmesine izin vermek için modülünüzün build.gradle
dosyasına aşağıdaki kitaplıklara bağımlılıkları ekleyin:
androidx.activity
, 1.2.0 veya sonraki sürümlerandroidx.fragment
, 1.3.0 veya sonraki sürümler
Ardından, aşağıdaki sınıflardan birini kullanabilirsiniz:
- Tek bir izin istemek için
RequestPermission
değerini kullanın. - Aynı anda birden fazla izin istemek için
RequestMultiplePermissions
özelliğini kullanın.
RequestPermission
sözleşmesinin nasıl kullanılacağı aşağıdaki adımlarda gösterilmektedir. Süreç, RequestMultiplePermissions
sözleşmesinde hemen hemen aynıdır.
Etkinliğinizin veya parçanızın başlatma mantığında, bir
ActivityResultCallback
uygulamasınıregisterForActivityResult()
çağrısına geçirin.ActivityResultCallback
, uygulamanızın kullanıcının izin isteğine verdiği yanıtı nasıl işleyeceğini tanımlar.ActivityResultLauncher
türündekiregisterForActivityResult()
döndürülen değeri için bir referans girmeyi unutmayın.Gerektiğinde sistem izinleri iletişim kutusunu görüntülemek için önceki adımda kaydettiğiniz
ActivityResultLauncher
örneğindelaunch()
yöntemini çağırın.launch()
çağrıldıktan sonra sistem izinleri iletişim kutusu görünür. Kullanıcı seçim yaptığında, sistem önceki adımda tanımladığınızActivityResultCallback
uygulamanızı eşzamansız olarak çağırır.Not: Uygulamanız,
launch()
araması yaptığınızda görünen iletişim kutusunu özelleştiremez. Kullanıcıya daha fazla bilgi veya bağlam sağlamak için uygulamanızın kullanıcı arayüzünü değiştirerek kullanıcıların, uygulamanızdaki bir özelliğin neden belirli bir izne ihtiyaç duyduğunu daha kolay anlamasını sağlayın. Örneğin, özelliği etkinleştiren düğmedeki metni değiştirebilirsiniz.Ayrıca, sistem izni iletişim kutusundaki metin, istediğiniz izinle ilişkili izin grubuna referansta bulunur. Bu izin gruplandırması, sistemin kullanım kolaylığı için tasarlanmıştır. Uygulamanız, belirli bir izin grubunun içinde veya dışında bulunan izinlere dayalı olmamalıdır.
Aşağıdaki kod snippet'i, izin yanıtının nasıl işleneceğini gösterir:
Kotlin
// Register the permissions callback, which handles the user's response to the // system permissions dialog. Save the return value, an instance of // ActivityResultLauncher. You can use either a val, as shown in this snippet, // or a lateinit var in your onAttach() or onCreate() method. val requestPermissionLauncher = registerForActivityResult(RequestPermission() ) { isGranted: Boolean -> if (isGranted) { // Permission is granted. Continue the action or workflow in your // app. } else { // Explain to the user that the feature is unavailable because the // feature requires a permission that the user has denied. At the // same time, respect the user's decision. Don't link to system // settings in an effort to convince the user to change their // decision. } }
Java
// Register the permissions callback, which handles the user's response to the // system permissions dialog. Save the return value, an instance of // ActivityResultLauncher, as an instance variable. private ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new RequestPermission(), isGranted -> { if (isGranted) { // Permission is granted. Continue the action or workflow in your // app. } else { // Explain to the user that the feature is unavailable because the // feature requires a permission that the user has denied. At the // same time, respect the user's decision. Don't link to system // settings in an effort to convince the user to change their // decision. } });
Bu kod snippet'i, izin olup olmadığını kontrol etmek ve gerektiğinde kullanıcıdan izin istemek için önerilen işlemi gösterir:
Kotlin
when { ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION ) == PackageManager.PERMISSION_GRANTED -> { // You can use the API that requires the permission. } shouldShowRequestPermissionRationale(...) -> { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...) } else -> { // You can directly ask for the permission. // The registered ActivityResultCallback gets the result of this request. requestPermissionLauncher.launch( Manifest.permission.REQUESTED_PERMISSION) } }
Java
if (ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION) == PackageManager.PERMISSION_GRANTED) { // You can use the API that requires the permission. performAction(...); } else if (shouldShowRequestPermissionRationale(...)) { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...); } else { // You can directly ask for the permission. // The registered ActivityResultCallback gets the result of this request. requestPermissionLauncher.launch( Manifest.permission.REQUESTED_PERMISSION); }
İzin isteği kodunu kendiniz yönetme
Sistemin izin isteği kodunu yönetmesine izin vermeye alternatif olarak izin isteği kodunu kendiniz yönetebilirsiniz. Bunu yapmak için requestPermissions()
çağrısına istek kodunu ekleyin.
Aşağıdaki kod snippet'i, istek kodu kullanarak nasıl izin isteyeceğinizi gösterir:
Kotlin
when { ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION ) == PackageManager.PERMISSION_GRANTED -> { // You can use the API that requires the permission. performAction(...) } shouldShowRequestPermissionRationale(...) -> { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...) } else -> { // You can directly ask for the permission. requestPermissions(CONTEXT, arrayOf(Manifest.permission.REQUESTED_PERMISSION), REQUEST_CODE) } }
Java
if (ContextCompat.checkSelfPermission( CONTEXT, Manifest.permission.REQUESTED_PERMISSION) == PackageManager.PERMISSION_GRANTED) { // You can use the API that requires the permission. performAction(...); } else if (shouldShowRequestPermissionRationale(...)) { // In an educational UI, explain to the user why your app requires this // permission for a specific feature to behave as expected, and what // features are disabled if it's declined. In this UI, include a // "cancel" or "no thanks" button that lets the user continue // using your app without granting the permission. showInContextUI(...); } else { // You can directly ask for the permission. requestPermissions(CONTEXT, new String[] { Manifest.permission.REQUESTED_PERMISSION }, REQUEST_CODE); }
Kullanıcı, sistem izinleri iletişim kutusuna yanıt verdikten sonra, sistem, uygulamanızda onRequestPermissionsResult()
kullanımını çağırır. Sistem, aşağıdaki kod snippet'inde gösterildiği gibi, tanımladığınız istek kodunu ve izin iletişim kutusuna kullanıcı yanıtını iletir:
Kotlin
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { when (requestCode) { PERMISSION_REQUEST_CODE -> { // If request is cancelled, the result arrays are empty. if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { // Permission is granted. Continue the action or workflow // in your app. } else { // Explain to the user that the feature is unavailable because // the feature requires a permission that the user has denied. // At the same time, respect the user's decision. Don't link to // system settings in an effort to convince the user to change // their decision. } return } // Add other 'when' lines to check for other // permissions this app might request. else -> { // Ignore all other requests. } } }
Java
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_CODE: // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission is granted. Continue the action or workflow // in your app. } else { // Explain to the user that the feature is unavailable because // the feature requires a permission that the user has denied. // At the same time, respect the user's decision. Don't link to // system settings in an effort to convince the user to change // their decision. } return; } // Other 'case' lines to check for other // permissions this app might request. } }
Konum izni iste
Konum izinleri istediğinizde diğer çalışma zamanı izinleriyle aynı en iyi uygulamaları izleyin. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri ve nasıl talep edeceğiniz, uygulamanızın kullanım alanıyla ilgili konum gereksinimlerine bağlıdır.
Ön plan konumu
Uygulamanız, konum bilgilerini yalnızca bir kez veya belirli bir süre boyunca paylaşan ya da alan bir özellik içeriyorsa bu özellik ön planda konum erişimi gerektirir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:
- Navigasyon uygulamasında bulunan bir özellik, kullanıcıların adım adım yol tarifi almalarını sağlar.
- Bir mesajlaşma uygulamasındaki özellik, kullanıcıların mevcut konumlarını başka bir kullanıcıyla paylaşmasına olanak tanır.
Uygulamanızın bir özelliği aşağıdaki durumlardan birinde cihazın mevcut konumuna erişirse sistem, uygulamanızı ön plan konumunu kullanıyor olarak kabul eder:
- Uygulamanıza ait bir etkinlik görünür durumda.
Uygulamanız bir ön plan hizmeti çalıştırıyor. Bir ön plan hizmeti çalışırken sistem, kalıcı bir bildirim göstererek kullanıcı farkındalığını artırır. Uygulamanız, arka plana yerleştirildiğinde (örneğin, kullanıcı cihazındaki Ana sayfa düğmesine bastığında veya cihazının ekranını kapattığında) erişmeye devam eder.
Android 10 (API düzeyi 29) ve sonraki sürümlerde aşağıdaki kod snippet'inde gösterildiği gibi ön plan hizmet türünü
location
olarak beyan etmeniz gerekir. Android'in önceki sürümlerinde bu ön plan hizmet türünü belirtmeniz önerilir.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements go here. --> </service>
Aşağıdaki snippet'te gösterildiği gibi uygulamanız ACCESS_COARSE_LOCATION
izni veya ACCESS_FINE_LOCATION
izni istediğinde ön planda konum ihtiyacını beyan etmiş olursunuz:
<manifest ... > <!-- Include this permission any time your app needs location information. --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Include only if your app benefits from precise location access. --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> </manifest>
Arka planda konum
Uygulamanın içindeki bir özellik sürekli olarak diğer kullanıcılarla konum bilgisi paylaşıyorsa veya Geofencing API'yi kullanıyorsa uygulama arka planda konum erişimi gerektirir. Aşağıda konuyla ilgili birkaç örnek verilmiştir:
- Aile konum paylaşımı uygulamasındaki bir özellik, kullanıcıların sürekli olarak aile üyeleriyle konum paylaşmasına olanak tanır.
- Bir IoT uygulamasında bulunan bir özellik, kullanıcıların ev cihazlarını yapılandırmasına olanak tanır. Böylece kullanıcı evden çıktığında kapanır ve eve döndüğünde tekrar açılır.
Sistem, ön plan konumu bölümünde açıklananlar dışında herhangi bir durumda cihazın mevcut konumuna erişen uygulamanızı arka planda konum bilgisi kullanıyor olarak kabul eder. Arka planda konum doğruluğu, ön plan konum doğruluğu ile aynıdır. Bu doğruluk, uygulamanızın beyan ettiği konum izinlerine bağlıdır.
Android 10 (API düzeyi 29) ve sonraki sürümlerde, çalışma zamanında arka planda konum erişimi istemek için uygulamanızın manifest dosyasında ACCESS_BACKGROUND_LOCATION
iznini beyan etmeniz gerekir. Android'in önceki sürümlerinde, uygulamanız ön planda konum erişimi aldığında otomatik olarak arka planda konum erişimini de alır.
<manifest ... > <!-- Required only when requesting background location access on Android 10 (API level 29) and higher. --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> </manifest>
İzin reddini işleme
Uygulamanız bir izin isteğini reddederse uygulamanın bu izni reddetmenin ne gibi sonuçlar doğuracağını anlamasına yardımcı olması gerekir. Uygulamanız özellikle, izinleri eksik olduğu için çalışmayan özelliklerden kullanıcıları haberdar etmelidir. Bunu yaparken aşağıdaki en iyi uygulamaları göz önünde bulundurun:
Kullanıcının dikkatini yönlendirin. Uygulamanızın kullanıcı arayüzünde, gerekli izne sahip olmadığı için işlevselliğin sınırlı olduğu belirli bir bölümü vurgulayın. Yapabileceğiniz işlemlere örnekler:
- Özelliğin sonuçlarının veya verilerinin nerede görüneceğine dair bir mesaj gösterin.
- Hata simgesi ve rengi içeren farklı bir düğme görüntüleyin.
Net olun. Genel bir mesaj göstermeyin. Bunun yerine, uygulamanız gerekli izne sahip olmadığı için hangi özelliklerin kullanılamadığını açıkça belirtin.
Kullanıcı arayüzünü engellemeyin. Diğer bir deyişle, kullanıcıların uygulamanızı kullanmaya devam etmesini engelleyen tam ekran uyarı mesajı göstermeyin.
Uygulamanız aynı zamanda kullanıcının bir izni reddetme kararına da saygı göstermelidir. Android 11'den (API düzeyi 30) itibaren kullanıcı, uygulamanızın bir cihaza yüklendiği süre boyunca belirli bir izin için Reddet'e birden fazla kez dokunursa uygulamanız bu izni tekrar isterse kullanıcı sistem izinleri iletişim kutusunu görmez. Kullanıcının işlemi, "bir daha sorma" imasında bulunur. Önceki sürümlerde kullanıcılar, önceden "tekrar sorma" onay kutusu veya seçeneği belirlemediği sürece uygulamanız her izin istediğinde sistem izinleri iletişim kutusunu görüyordu.
Kullanıcı bir izin isteğini birden çok kez reddederse bu, kalıcı ret olarak kabul edilir. Kullanıcılardan yalnızca belirli bir özelliğe erişmeleri gerektiğinde izin istemek çok önemlidir. Aksi takdirde, izinleri yeniden isteme imkanını yanlışlıkla kaybedebilirsiniz.
Belirli durumlarda izin, kullanıcı herhangi bir işlem yapmadan otomatik olarak reddedilebilir. (Ayrıca bir izin de otomatik olarak verilebilir.) Otomatik davranış hakkında herhangi bir varsayımda bulunmamak önemlidir. Uygulamanızın izin gerektiren işlevlere erişmesi gerektiğinde, uygulamanıza hâlâ bu iznin verilip verilmediğini kontrol edin.
Uygulama izinleri isterken en iyi kullanıcı deneyimini sağlamak için Uygulama izinleri en iyi uygulamaları konusuna da bakın.
Test ve hata ayıklama sırasında ret durumunu denetle
Bir uygulamanın izinlerinin kalıcı olarak reddedilip reddedilmediğini belirlemek için (hata ayıklama ve test amacıyla) aşağıdaki komutu kullanın:
adb shell dumpsys package PACKAGE_NAME
Burada PACKAGE_NAME, incelenecek paketin adıdır.
Komutun çıktısı aşağıdaki gibi görünen bölümler içerir:
... runtime permissions: android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED] ...
Kullanıcı tarafından bir kez reddedilen izinler USER_SET
tarafından işaretlenir.
İki kez Reddet seçeneği seçildiğinde kalıcı olarak reddedilen izinler USER_FIXED
tarafından işaretlenir.
Test kullanıcılarının test sırasında istek iletişim kutusunu görmelerini sağlamak için uygulamanızda hata ayıklamayı tamamladıktan sonra bu işaretleri sıfırlayın. Bunu yapmak için şu komutu kullanın:
adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed
PERMISSION_NAME, sıfırlamak istediğiniz iznin adıdır.
Android uygulama izinlerinin tam listesini görmek için permissions API referans sayfasını ziyaret edin.
Tek seferlik izinler
Android 11'den (API düzeyi 30) itibaren, uygulamanız konum, mikrofon veya kamera ile ilgili bir izin istediğinde kullanıcılara yönelik izinler iletişim kutusunda Yalnızca bu sefer adlı bir seçenek bulunur (Şekil 2'de gösterildiği gibi). Kullanıcı iletişim kutusunda bu seçeneği belirlerse uygulamanıza geçici bir tek seferlik izin verilir.
Daha sonra uygulamanız ilgili verilere, uygulamanızın davranışına ve kullanıcı hareketlerine bağlı olarak bir süre boyunca erişebilir:
- Uygulamanızın etkinliği görünür durumdayken, uygulamanız verilere erişebilir.
- Kullanıcı uygulamanızı arka plana gönderirse uygulamanız kısa bir süre için verilere erişmeye devam edebilir.
- Etkinlik görünür durumdayken bir ön plan hizmeti başlatırsanız ve kullanıcı uygulamanızı arka plana taşırsa uygulamanız, ön plan hizmeti durana kadar verilere erişmeye devam edebilir.
İzin iptal edildiğinde uygulama işlemi sona erer
Kullanıcı, sistem ayarlarında olduğu gibi tek seferlik izni iptal ederse uygulamanız, bir ön plan hizmeti başlatmış olsanız bile bu verilere erişemez. Her türlü izinde olduğu gibi, kullanıcı uygulamanızın bir defalık iznini iptal ederse uygulamanızın süreci sonlandırılır.
Kullanıcı uygulamanızı tekrar açtığında ve uygulamanızdaki bir özellik konuma, mikrofona veya kameraya erişim istediğinde kullanıcıdan tekrar izin istenir.
Kullanılmayan izinleri sıfırla
Android, kullanılmayan çalışma zamanı izinlerini varsayılan, reddedildi durumuna sıfırlamak için birkaç yol sunar:
- Uygulamanızın çalışma zamanında kullanılmayan bir izne erişimini proaktif olarak kaldırabileceğiniz bir API.
- Kullanılmayan uygulamaların izinlerini otomatik olarak sıfırlayan bir sistem mekanizması.
Uygulama erişimini kaldırma
Android 13 (API düzeyi 33) ve sonraki sürümlerde, uygulamanızın artık ihtiyaç duymadığı çalışma zamanı izinlerine erişimini kaldırabilirsiniz. Uygulamanızı güncellerken bu adımı uygulayarak kullanıcıların, uygulamanızın neden belirli izinleri istemeye devam ettiğini anlama olasılığını artırın. Bu bilgiler kullanıcıların uygulamanıza güvenini kazanmaya yardımcı olur.
Bir çalışma zamanı iznine erişimi kaldırmak için bu iznin adını revokeSelfPermissionOnKill()
öğesine iletin.
Çalışma zamanı izinleri grubuna erişimi aynı anda kaldırmak için izin adları koleksiyonunu revokeSelfPermissionsOnKill()
'e iletin.
İzin kaldırma süreci eşzamansız olarak gerçekleşir ve uygulamanızın UID'siyle ilişkili tüm işlemler sonlandırılır.
Sistemin, uygulamanızın izinlere erişimini kaldırması için uygulamanızla bağlantılı tüm işlemlerin sonlandırılması gerekir. API'yi çağırdığınızda, bu işlemleri sonlandırmanın güvenli olduğu zamanı sistem belirler. Genellikle sistem, uygulamanız ön plan yerine arka planda uzun süre çalışana kadar bekler.
Uygulamanızın artık belirli çalışma zamanı izinlerine erişim gerektirmediğini kullanıcıya bildirmek için kullanıcı uygulamanızı bir sonraki açışında bir iletişim kutusu gösterin. Bu iletişim kutusu, izinlerin listesini içerebilir.
Kullanılmayan uygulamaların izinlerini otomatik olarak sıfırla
Uygulamanız Android 11 (API düzeyi 30) veya sonraki bir sürümü hedefliyorsa ve birkaç ay boyunca kullanılmıyorsa sistem, kullanıcının uygulamanıza verdiği hassas çalışma zamanı izinlerini otomatik olarak sıfırlayarak kullanıcı verilerini korur. Uygulamayı hazırda bekletme ile ilgili kılavuzdan daha fazla bilgi edinin.
Gerekirse varsayılan işleyici olma isteği
Bazı uygulamalar, arama kayıtları ve SMS mesajlarıyla ilgili hassas kullanıcı bilgilerine erişime bağlıdır. Arama kayıtlarına ve SMS mesajlarına özgü izinleri istemek ve uygulamanızı Play Store'da yayınlamak istiyorsanız, bu çalışma zamanı izinlerini istemeden önce kullanıcıdan uygulamanızı temel sistem işlevi için varsayılan işleyici olarak ayarlamasını istemeniz gerekir.
Kullanıcılara bir varsayılan işleyici istemi göstermeyle ilgili yardım da dahil olmak üzere varsayılan işleyiciler hakkında daha fazla bilgi için yalnızca varsayılan işleyicilerde kullanılan izinler hakkındaki kılavuza bakın.
Test amacıyla tüm çalışma zamanı izinlerini verin
Bir emülatöre veya test cihazına uygulama yüklediğinizde tüm çalışma zamanı izinlerini otomatik olarak vermek istiyorsanız aşağıdaki kod snippet'inde gösterildiği gibi adb shell install
komutu için -g
seçeneğini kullanın:
adb shell install -g PATH_TO_APK_FILE
Ek kaynaklar
İzinler hakkında daha fazla bilgi için şu makaleleri okuyun:
İzin isteme hakkında daha fazla bilgi için izin örneklerini inceleyin ve
Ayrıca, gizlilikle ilgili en iyi uygulamaları gösteren bu codelab'i de tamamlayabilirsiniz.