Android 11 uygulamaları için kısa rehber: İzinler, bildirimler ve uyumluluk
Android 11 gizliliği güçlendirdi: Tek seferlik izinler ve otomatik iptal (auto-revoke) geldi, targetSdk≥30 için Kapsamlı Depolama (Scoped Storage) zorunlu hale getirildi, Konuşmalar/Baloncuklar (Conversation/Bubbles) eklendi ve MANAGE_EXTERNAL_STORAGE kuralları sıkılaştırıldı — temel adımlar: MediaStore/SAF/uygulamaya özel depolamaya geçiş yapmak, izin isteme mantığını kontrol etmek ve bildirimleri MessagingStyle/Person formatına uygun hale getirmek.
İzinler ve sistem davranışı
Hemen dikkate alınması gerekenler ve bunların nasıl uygulanacağı:
- Tek seferlik izinler: Kullanıcı erişimi "yalnızca bu sefer" verebilir. Kritik işlevsellik her başlatıldığında izni kontrol edin ve anlaşılır bir gerekçe (rationale) hazırlayın.
- Otomatik iptal (Auto-revoke): Sistem, kullanılmayan uygulamaların hassas çalışma zamanı izinlerini sıfırlar. İşlevsellik başlatıldığında izinleri kontrol edin ve gerekirse yeniden isteyin.
- Arka plan konum erişimi: Önce ön plan konum iznini isteyin, ardından gerekirse arka plan iznini talep edin; Google Play gerekçelendirme talep eder.
Uygulama
- Erişimden önce her zaman ContextCompat.checkSelfPermission ile kontrol yapın.
- Reddedilme durumunda açıklama gösterin ve sistem ayarlarına deep link önerin.
- Kritik özellikler (yedekleme, dosya yöneticileri) için kullanıcıya neden erişime ihtiyaç duyulduğunu önceden açıklayın.
İşlevsellik sürekli olarak haklara bağımlıysa, otomatik iptal sonrası kullanıcı kaybını önlemek için açıklama içeren bir ekran ve "Ayarları Aç" düğmesi uygulayın.
Kapsamlı Depolama ve dosya erişimi — nereye geçilmeli ve tüm dosya erişimi ne zaman gerekli?
Temel ilke: Paylaşılan depolama alanında keyfi erişimi kısıtlamak. Dosyalarla çalışmanın yolları:
Dosya erişim yöntemlerinin karşılaştırılması
| Yöntem | Ne sağlar? | Ne zaman kullanılmalı? |
|---|---|---|
| Uygulamaya özel dizinler (getExternalFilesDir) | Uygulamanın özel klasöründe tam erişim | Yalnızca uygulama tarafından işlenen dosyalar için |
| MediaStore API | İndekslenmiş veritabanı üzerinden medya içeriğini okuma/yazma | Fotoğraf, video, ses için — önerilen yöntem |
| Storage Access Framework (SAF) | Kullanıcının seçtiği klasörlere/dosyalara erişim | Belge ve keyfi dosyalar için, kullanıcı seçimi gerektiğinde |
| MANAGEEXTERNALSTORAGE | Tüm paylaşılan dosya sistemine erişim | Yalnızca dosya yöneticileri/yedekleme uygulamaları için — Play Console'da beyan gerektirir |
Pratik geçiş adımları
- Environment.getExternalStorageDirectory ve Android/data'ya yapılan tüm doğrudan erişimleri denetleyin; bunları uygulamaya özel dizin/MediaStore/SAF ile değiştirin.
- Toplu işlemleri MediaStore'un batch yöntemleriyle test edin ve G/Ç işlemlerini UI akışı dışında gerçekleştirin.
- Gerçekten MANAGE_EXTERNAL_STORAGE gerekiyorsa, yayınlama için bir beyan hazırlayın ve izni etkinleştirme diyalogunu anlaşılır şekilde uygulayın. Yerel hata ayıklama için adb üzerinden geçici olarak izin verilebilir: adb shell appops set <PACKAGE_NAME> MANAGE_EXTERNAL_STORAGE allow
MANAGE_EXTERNAL_STORAGE'u "her ihtimale karşı" eklemeyin — Google Play gerekçelendirmeyi sıkı bir şekilde denetler.
Bildirimler: Konuşmalar, Baloncuklar ve bildirim geçmişi davranışı
Bildirim uygulamasında değiştirilmesi gerekenler:
- Konuşmalar bölümüne düşmek için Notification.MessagingStyle kullanın, Person nesnelerini ve shortcutId'yi bağlayın.
- Baloncukları desteklemek için doğru BubbleMetadata ile Notification oluşturun ve balon oluşturulduktan hemen sonra bildirimi silmeyin (belgelere göre bastırma bayraklarını kullanın).
- Kullanıcıların sistem bildirim geçmişi aracılığıyla yakın zamanda kapatılan bildirimleri geri yükleyebileceğini öngörün; medya kontrolleri ve hızlı ayarlarla davranışı test edin.
Pratik ipuçları
- Bildirimleri API 30+ gerçek cihazlarda test edin, Konuşmalar bölümündeki görünürlüğü ve Baloncukların çalışmasını kontrol edin.
- Mesaj gönderirken mevcut notificationId'yi güncelleyin, FLAG_UPDATE_CURRENT ile PendingIntent kullanın.
Yaygın hatalar
- File API'de EACCES / Permission denied: Nedeni — kapsamlı depolama. Çözüm — verileri uygulamaya özel dizine/MediaStore/SAF'e taşıyın.
- Toplu işlemlerde yavaşlama: Çözüm — MediaStore toplu işlemlerini kullanın ve G/Ç işlemlerini arka planda gerçekleştirin.
- Bildirimler Konuşma/Baloncuğa dönüşmüyor: MessagingStyle, Person ve shortcutId'yi kontrol edin.
- Uzun süreli kullanım dışı kalma sonrası özellikler "bozuldu": Otomatik iptali kontrol edin ve başlangıçta izin kontrolü ekleyin.
- MANAGE_EXTERNAL_STORAGE nedeniyle Play Console'da reddedilme: Bunu kaldırın veya eksiksiz bir beyan ve kullanım senaryoları açıklaması hazırlayın.
SSS
- targetSdk'yi hemen 30'a yükseltmek gerekir mi? Geçiş işlemini yerel olarak test etmeniz ve targetSdk güncellemesini önceden planlamanız önerilir — yükseltmeden sonra API 30'ın tüm kısıtlamalarına uyulması gerekir.
- Bir iznin kullanıcı tarafından sıfırlanıp sıfırlanmadığını nasıl kontrol edebilirim? İşlemden önce her zaman checkSelfPermission ile kontrol yapın ve reddedilme durumunda gerekçe gösterin/ayarlara yönlendirin.
- Testler için kapsamlı depolamayı geçici olarak atlamak mümkün mü? Hata ayıklama için adb komutları veya emülatördeki özel bayraklar kullanılır, ancak üretim ortamında buna güvenilemez.
- Medya içeriği için hangisi daha etkilidir — MediaStore mu yoksa SAF mi? MediaStore, fotoğraf/video/ses için en iyi seçimdir; SAF, belgeler ve kullanıcı klasörleri için uygundur.
targetSdk'yı 30'a yükseltmeden önce kontrol listesi
- Paylaşılan depolamaya yapılan doğrudan erişimlerin denetlenmesi.
- Verilerin uygulamaya özel dizine veya MediaStore'a taşınması.
- İzin isteme mantığının güncellenmesi (tek seferlik, gerekçe, otomatik iptal).
- Bildirimlerin MessagingStyle/Person/shortcutId formatına uygun hale getirilmesi.
- Gerekliyse MANAGE_EXTERNAL_STORAGE için beyan hazırlanması.
Gerekirse, projeniz için manifest geçiş planı ve MediaStore/SAF kod örnekleri hazırlayabilirim veya AndroidManifest.xml dosyanızı ve izin listenizi inceleyebilirim — tercih ettiğiniz seçeneği belirtin.