Android 14'te, kullanıcıların belirli bir türdeki tüm medyalara erişim izni vermek yerine kitaplıklarındaki belirli resim ve videolara erişmesine izin veren Seçili Fotoğraflar Erişimi'ni kullanıma sunuyoruz.
Bu değişiklik yalnızca uygulamanız Android 14 (API düzeyi 34) veya sonraki sürümleri hedefliyorsa etkinleştirilir. Henüz fotoğraf seçiciyi kullanmıyorsanız resim ve videoları seçerken tutarlı bir deneyim sağlamak için bu özelliği uygulamanızda uygulamanızı öneririz. Böylece, depolama izni istemek zorunda kalmadan kullanıcı gizliliğini de geliştirebilirsiniz.
Depolama izinlerini kullanarak kendi galeri seçiciyi kullanıyorsanız ve uygulamanız üzerinde tam kontrole sahip olmanız gerekiyorsa uygulamanızı yeni READ_MEDIA_VISUAL_USER_SELECTED
iznini kullanacak şekilde uyarlayın. Uygulamanız yeni izni kullanmıyorsa sistem, uygulamanızı uyumluluk modunda çalıştırır.
Hedef SDK | READ_MEDIA_VISUAL_USER_SELECTED açıklandı |
Seçilen Fotoğraflar Erişimi etkinleştirildi | Kullanıcı Deneyimi Davranışı |
---|---|---|---|
SDK 33 | Hayır | Hayır | Yok |
Evet | Evet | Uygulama tarafından kontrol edilir | |
SDK 34 | Hayır | Evet | Sistem tarafından kontrol edilir (uyumlu davranış) |
Evet | Evet | Uygulama tarafından kontrol edilir |
Kendi galeri seçiciyi oluşturun veya uyarlayın
Kendi galeri seçicinizi oluşturmak için kapsamlı geliştirme ve bakım işlemleri gerekir. Ayrıca uygulamanızın açık kullanıcı izni almak için depolama izinleri istemesi gerekir. Kullanıcılar bu istekleri reddedebilir veya uygulamanız Android 14 yüklü bir cihazda çalışıyorsa ve uygulamanız Android 14 (API düzeyi 34) veya sonraki sürümleri hedefliyorsa seçili medyaya erişimi sınırlandırabilir. Aşağıdaki resimde, izin isteme ve yeni seçenekleri kullanarak medya seçme örneği gösterilmektedir.
Bu bölümde, MediaStore
kullanarak kendi galeri seçicinizi oluşturmak için önerilen yaklaşım gösterilmektedir. Uygulamanız için zaten bir galeri seçiciniz varsa ve tam denetime sahip olmanız gerekiyorsa uygulamanızı uyarlamak için bu örnekleri kullanabilirsiniz. Uygulamanızı, Seçilen Fotoğraflar Erişimini işleyecek şekilde güncellemezseniz sistem, uygulamanızı uyumluluk modunda çalıştırır.
İzin iste
Öncelikle, OS sürümüne bağlı olarak Android manifest'inde doğru depolama izinlerini isteyin:
<!-- Devices running Android 12L (API level 32) or lower -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- Devices running Android 13 (API level 33) or higher -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- To handle the reselection within the app on devices running Android 14
or higher if your app targets Android 14 (API level 34) or higher. -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
Ardından, işletim sistemi sürümüne bağlı olarak doğru çalışma zamanı izinlerini isteyin:
// Register ActivityResult handler
val requestPermissions = registerForActivityResult(RequestMultiplePermissions()) { results ->
// Handle permission requests results
// See the permission example in the Android platform samples: https://github.com/android/platform-samples
}
// Permission request logic
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VIDEO))
} else {
requestPermissions.launch(arrayOf(READ_EXTERNAL_STORAGE))
}
Bazı uygulamalar izin gerektirmez
Android 10 (API düzeyi 29) sürümünden itibaren, uygulamaların paylaşılan depolama alanına dosya eklemek için depolama izinlerine ihtiyacı yoktur. Bu, uygulamaların galeriye resim ekleyebileceği, video kaydedip paylaşılan depolama alanına kaydedebileceği veya depolama izni istemeden PDF faturaları indirebileceği anlamına gelir. Uygulamanız yalnızca paylaşılan depolama alanına dosya ekliyor ve resim veya videoları sorgulamıyorsa, depolama izni istemeyi durdurmanız ve AndroidManifest.xml
sayfanızda API 28 maxSdkVersion
değeri ayarlamanız gerekir:
<!-- No permission is needed to add files to shared storage on Android 10 (API level 29) or higher -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
Medya yeniden seçimini yönetme
Android 14'teki Seçili Fotoğraflar Erişimi özelliği sayesinde, uygulamanız medya yeniden seçimini kontrol etmek için yeni READ_MEDIA_VISUAL_USER_SELECTED
iznini almalı ve uygulamanızın arayüzünü, kullanıcıların uygulamanıza farklı resim ve video grubuna erişmesine izin verecek şekilde güncellemelidir. Aşağıdaki resimde, izin isteme ve medyayı yeniden seçme örneği gösterilmektedir:
Seçim iletişim kutusu açıldığında, istenen izinlere bağlı olarak fotoğraflar, videolar veya her ikisi de gösterilir. Örneğin, READ_MEDIA_IMAGES
izni olmadan READ_MEDIA_VIDEO
iznini istediğinizde kullanıcıların dosya seçmesi için kullanıcı arayüzünde yalnızca videolar gösterilir.
// Allow the user to select only videos
requestPermissions.launch(arrayOf(READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))
Uygulamanızın, cihazın fotoğraf kitaplığına tam, kısmi veya reddedilmiş erişimi olup olmadığını kontrol edebilir ve arayüzünüzü buna göre güncelleyebilirsiniz. Bu izinleri başlangıçta değil, depolama alanına erişmesi gerektiğinde isteyin. Kullanıcı, erişimi uygulamanızı kapatmadan ayarlardan değiştirebileceği için izin izninin onStart
ile onResume
uygulama yaşam döngüsü geri çağırmaları arasında değişebileceğini unutmayın.
if (
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
(
ContextCompat.checkSelfPermission(context, READ_MEDIA_IMAGES) == PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(context, READ_MEDIA_VIDEO) == PERMISSION_GRANTED
)
) {
// Full access on Android 13 (API level 33) or higher
} else if (
Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
ContextCompat.checkSelfPermission(context, READ_MEDIA_VISUAL_USER_SELECTED) == PERMISSION_GRANTED
) {
// Partial access on Android 14 (API level 34) or higher
} else if (ContextCompat.checkSelfPermission(context, READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED) {
// Full access up to Android 12 (API level 32)
} else {
// Access denied
}
Cihaz kitaplığını sorgulama
Doğru depolama izinlerine erişiminizin olduğunu doğruladıktan sonra cihaz kitaplığını sorgulamak için MediaStore
ile etkileşimde bulunabilirsiniz (izin verilen erişim kısmi veya tam olsun da aynı yaklaşım geçerlidir):
data class Media(
val uri: Uri,
val name: String,
val size: Long,
val mimeType: String,
)
// Run the querying logic in a coroutine outside of the main thread to keep the app responsive.
// Keep in mind that this code snippet is querying only images of the shared storage.
suspend fun getImages(contentResolver: ContentResolver): List<Media> = withContext(Dispatchers.IO) {
val projection = arrayOf(
Images.Media._ID,
Images.Media.DISPLAY_NAME,
Images.Media.SIZE,
Images.Media.MIME_TYPE,
)
val collectionUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Query all the device storage volumes instead of the primary only
Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
} else {
Images.Media.EXTERNAL_CONTENT_URI
}
val images = mutableListOf<Media>()
contentResolver.query(
collectionUri,
projection,
null,
null,
"${Images.Media.DATE_ADDED} DESC"
)?.use { cursor ->
val idColumn = cursor.getColumnIndexOrThrow(Images.Media._ID)
val displayNameColumn = cursor.getColumnIndexOrThrow(Images.Media.DISPLAY_NAME)
val sizeColumn = cursor.getColumnIndexOrThrow(Images.Media.SIZE)
val mimeTypeColumn = cursor.getColumnIndexOrThrow(Images.Media.MIME_TYPE)
while (cursor.moveToNext()) {
val uri = ContentUris.withAppendedId(collectionUri, cursor.getLong(idColumn))
val name = cursor.getString(displayNameColumn)
val size = cursor.getLong(sizeColumn)
val mimeType = cursor.getString(mimeTypeColumn)
val image = Media(uri, name, size, mimeType)
images.add(image)
}
}
return@withContext images
}
Bu kod snippet'i, MediaStore
ile nasıl etkileşim kurulacağını göstermek amacıyla basitleştirilmiştir.
Üretime hazır bir uygulamada, iyi performans sağlamak için çağrı kitaplığı gibi bir sayfayla numaralandırmayı kullanın.
Son seçimi sorgula
Android 15 ve sonraki sürümler ile Android 14 ve sonraki sürümleri çalıştıran ve Google Play sistem güncellemesi desteği sunan uygulamalar, QUERY_ARG_LATEST_SELECTION_ONLY
etkinleştirilerek kullanıcının kısmi erişim sırasında yaptığı son resim ve videoları sorgulayabilir:
if (getExtensionVersion(Build.VERSION_CODES.U) >= 12) {
val queryArgs = bundleOf(
QUERY_ARG_SQL_SORT_ORDER to "${Images.Media.DATE_ADDED} DESC"
QUERY_ARG_LATEST_SELECTION_ONLY to true
)
contentResolver.query(collectionUri, projection, queryArgs, null)
}
Cihaz yeni sürüme geçirildiğinde fotoğraf ve video erişimi korunur
Uygulamanızın eski bir Android sürümünden Android 14'e yükseltilen bir cihazda olduğu durumlarda sistem, kullanıcının fotoğraf ve videolarına tam erişime sahip olmaya devam eder ve uygulamanıza otomatik olarak bazı izinler verir. Kesin davranış, cihaz Android 14'e geçmeden önce uygulamanıza verilen izin grubuna bağlıdır.
Android 13'teki izinler
Aşağıdaki durumu göz önünde bulundurun:
- Uygulamanız Android 13 çalıştıran bir cihaza yüklendi.
- Kullanıcı, uygulamanız için
READ_MEDIA_IMAGES
veREAD_MEDIA_VIDEO
iznini verdi. - Ardından cihaz, uygulamanız yüklüyken Android 14'e geçer.
- Uygulamanız Android 14 (API düzeyi 34) veya sonraki sürümleri hedeflemeye başladı.
Bu durumda uygulamanız, kullanıcının fotoğraf ve videolarına tam erişime sahip olmaya devam eder.
Sistem, uygulamanıza otomatik olarak verilen READ_MEDIA_IMAGES
ve READ_MEDIA_VIDEO
izinlerini de saklar.
Android 12 ve önceki sürümlerdeki izinler
Aşağıdaki durumu göz önünde bulundurun:
- Uygulamanız Android 13 çalıştıran bir cihaza yüklendi.
- Kullanıcı, uygulamanız için
READ_EXTERNAL_STORAGE
veyaWRITE_EXTERNAL_STORAGE
iznini verdi. - Ardından cihaz, uygulamanız yüklüyken Android 14'e geçer.
- Uygulamanız Android 14 (API düzeyi 34) veya sonraki sürümleri hedeflemeye başladı.
Bu durumda uygulamanız, kullanıcının fotoğraf ve videolarına tam erişime sahip olmaya devam eder.
Sistem ayrıca uygulamanıza otomatik olarak READ_MEDIA_IMAGES
ve READ_MEDIA_VIDEO
izinlerini de verir.
En iyi uygulamalar
Bu bölümde, READ_MEDIA_VISUAL_USER_SELECTED
izninin kullanımıyla ilgili bazı en iyi uygulamalar yer almaktadır. Daha fazla bilgi için izinlerle ilgili en iyi uygulamalarımıza göz atın.
İzin durumunu kalıcı olarak depolama
İzin durumunu SharedPreferences
veya DataStore
dahil olmak üzere kalıcı bir şekilde depolamayın. Depolanan durum, gerçek durumla senkronize olmayabilir. İzin durumu; izin sıfırlama,
uygulama hazırda bekleme, uygulamanızın ayarlarında kullanıcı tarafından başlatılan bir değişiklik veya uygulamanız arka plana geçtikten sonra değişebilir. Bunun yerine, ContextCompat.checkSelfPermission()
kullanarak depolama alanı izinlerini kontrol edin.
Fotoğraflara ve videolara tam erişim sahibi olduğunuzu varsaymayın
Android 14'te yapılan değişikliklere bağlı olarak uygulamanızın, cihazın fotoğraf kitaplığına yalnızca kısmi erişimi olabilir. Uygulama, ContentResolver
kullanılarak sorgulandığında MediaStore
verilerini önbelleğe alıyorsa önbellek güncel olmayabilir.
- Depolanmış bir önbelleğe güvenmek yerine,
MediaStore
öğesini her zamanContentResolver
kullanarak sorgulayın. - Uygulamanız ön plandayken sonuçları bellekte tutun.
- Kullanıcı, izin ayarlarını kullanarak tam erişimden kısmi erişime geçebileceğinden, uygulamanız
onResume
uygulamasının yaşam döngüsü boyunca ilerlediğinde sonuçları yenileyin.
URI erişimini geçici olarak kabul et
Kullanıcı, sistem izinleri iletişim kutusunda Fotoğraf ve video seçin'i belirlerse uygulamanızın seçilen fotoğraflara ve videolara erişimi bir süre sonra sona erer.
Uygulamanız, yetkilileri ne olursa olsun herhangi bir Uri
cihazına erişememe durumlarında her zaman ele almalıdır.
Seçilebilir medya türünü izne göre filtrele
Seçim iletişim kutusu, istenen izin türüne karşı hassas:
- Yalnızca
READ_MEDIA_IMAGES
istendiğinde sadece seçilebilecek resimler gösterilir. - Yalnızca
READ_MEDIA_VIDEO
istendiğinde yalnızca seçilebilecek video gösterilir. - Hem
READ_MEDIA_IMAGES
hem deREAD_MEDIA_VIDEO
istendiğinde tüm fotoğraf kitaplığı seçilebilir olarak gösterilir.
Uygulamanızın kullanım alanlarına bağlı olarak, kötü bir kullanıcı deneyimini önlemek için doğru izinleri istediğinizden emin olmalısınız. Bir özellik yalnızca videoların seçilmesini bekliyorsa yalnızca READ_MEDIA_VIDEO
isteğinde bulunun.
Tek bir işlemle izin isteme
Kullanıcıların birden fazla sistem çalışma zamanı iletişim kutusu görmesini önlemek için tek bir işlemde READ_MEDIA_VISUAL_USER_SELECTED
, ACCESS_MEDIA_LOCATION
ve "medya okuma" izinlerini (READ_MEDIA_IMAGES
, READ_MEDIA_VIDEO
veya her ikisi) isteyin.
Kullanıcıların, seçimlerini yönetmesine izin ver
Kullanıcı kısmi erişim modunu seçtiğinde uygulamanız, cihazın fotoğraf kitaplığının boş olduğunu varsaymamalı ve kullanıcının daha fazla dosya vermesine izin vermelidir.
Kullanıcı, bazı görsel medya dosyalarına erişim izni vermeden izin ayarları aracılığıyla tam erişimden kısmi erişime geçiş yapmaya karar verebilir.
Uyumluluk modu
Depolama izinlerini kullanarak kendi galeri seçiciyi kullanıyor ancak
uygulamanızı yeni READ_MEDIA_VISUAL_USER_SELECTED
iznini kullanacak şekilde uyarlamadıysanız sistem, kullanıcının medya seçmesi veya yeniden seçmesi gerektiğinde uygulamanızı uyumluluk modunda çalıştırır.
İlk medya seçimi sırasındaki davranış
İlk seçim sırasında, bir kullanıcı "Fotoğraf ve video seçin"i seçerse (Şekil 1'e bakın) uygulama oturumu sırasında READ_MEDIA_IMAGES
ve READ_MEDIA_VIDEO
izinleri verilir. Böylece, geçici izin verilir ve kullanıcı tarafından seçilen fotoğraf ve videolara geçici erişim sağlanır. Uygulamanız arka plana geçtiğinde veya kullanıcı uygulamanızı aktif olarak öldürdüğünde, sistem nihayetinde bu izinleri reddeder. Bu davranış diğer tek seferlik izinlerle aynıdır.
Medya yeniden seçimi sırasında davranış
Uygulamanızın daha sonra başka fotoğraf ve videolara erişmesi gerekirse READ_MEDIA_IMAGES
iznini veya READ_MEDIA_VIDEO
iznini tekrar manuel olarak istemeniz gerekir. Sistem, ilk izin isteğiyle aynı akışı izleyerek kullanıcılardan fotoğraf ve video seçmelerini ister (bkz. Şekil 2).
Uygulamanız, izinlerle ilgili en iyi uygulamaları takip ediyorsa bu değişiklik uygulamanızı bozmamalıdır. Bu durum, özellikle uygulamanız URI erişiminin korunduğunu varsaymıyorsa, sistem izin durumunu sakladığında veya izin değiştikten sonra görüntülenen resim grubunu yeniliyorsa geçerlidir. Ancak bu davranış, uygulamanızın kullanım alanına bağlı olarak ideal olmayabilir. Kullanıcılarınıza en iyi deneyimi sunmak için READ_MEDIA_VISUAL_USER_SELECTED
iznini kullanarak doğrudan bu davranışı işleyecek fotoğraf seçiciyi uygulamanızı veya uygulamanızın galeri seçiciyi uyarlamanızı öneririz.