Mit Android 14 wird der Zugriff auf ausgewählte Fotos eingeführt, mit dem Nutzer Apps erlauben können Zugriff auf bestimmte Bilder und Videos in ihrer Mediathek haben, Zugriff auf alle Medien eines bestimmten Typs.
Diese Änderung wird nur aktiviert, wenn deine App auf Android 14 (API-Level 34) oder höher liegen. Falls Sie die Bildauswahl noch nicht verwenden, sollten Sie sie in Ihrer App, um eine einheitliche Auswahl von Bildern und Videos zu ermöglichen die den Datenschutz für Nutzer verbessert, ohne dass Sie Speicherplatz anfordern müssen. Berechtigungen.
Wenn Sie mit Speicherberechtigungen eine eigene Galerieauswahl verwenden und
Sie haben die volle Kontrolle über Ihre Implementierung, passen Sie Ihre Implementierung an.
um die neue Berechtigung READ_MEDIA_VISUAL_USER_SELECTED
zu verwenden. Wenn Ihre App
die neue Berechtigung nicht verwendet, führt das System Ihre App in einer kompatiblen
Modus an.
Ziel-SDK | READ_MEDIA_VISUAL_USER_SELECTED deklariert |
Zugriff auf ausgewählte Fotos aktiviert | UX-Verhalten |
---|---|---|---|
SDK 33 | Nein | Nein | – |
Ja | Ja | Von der App gesteuert | |
SDK 34 | Nein | Ja | Vom System gesteuert (kompatibles Verhalten) |
Ja | Ja | Von der App gesteuert |
Eigene Galerieauswahl erstellen oder anpassen
Das Erstellen einer eigenen Galerieauswahl erfordert umfangreiche Entwicklungs- und Pflegemaßnahmen. und Ihre App muss Speicherberechtigungen anfordern, um die ausdrückliche Nutzereinwilligung einzuholen. Nutzer können diese Anfragen ablehnen. Wenn deine App auf einem Gerät mit Android 14 und deine App auf Android 14 (API-Level 34) oder höher ausgerichtet, Limit Zugriff auf ausgewählte Medien. In der folgenden Abbildung sehen Sie ein Beispiel für und die Medienauswahl mit den neuen Optionen.
<ph type="x-smartling-placeholder">In diesem Abschnitt wird der empfohlene Ansatz zum Erstellen Ihrer eigenen Galerie veranschaulicht.
Auswahl mit MediaStore
. Wenn Sie bereits eine Galerieauswahl für Ihre App haben
und die volle Kontrolle behalten müssen, können Sie diese Beispiele nutzen,
Implementierung. Wenn Sie Ihre Implementierung nicht für die Verarbeitung von „Ausgewählte“
Fotoszugriff verwenden möchten, führt das System Ihre App im Kompatibilitätsmodus aus.
Berechtigungen anfordern
Fordere zunächst im Android-Manifest die richtigen Speicherberechtigungen an. je nach Betriebssystemversion:
<!-- 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" />
Fordern Sie dann je nach Betriebssystemversion die richtigen Laufzeitberechtigungen an:
// 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))
}
Einige Apps benötigen keine Berechtigungen
Ab Android 10 (API-Level 29) benötigen Apps keine Speicherberechtigungen mehr, um sie hinzuzufügen
Dateien in den freigegebenen Speicher verschieben. Das bedeutet, dass Apps
Bilder zur Galerie hinzufügen können,
können Sie Videos aufzeichnen und in einem gemeinsam genutzten Speicher speichern oder PDF-Rechnungen herunterladen,
ohne Speicherberechtigungen anfordern zu müssen. Wenn Ihre App Dateien nur für freigegebene Dateien
und keine Bilder oder Videos abfragen, sollten Sie keinen Speicherplatz mehr anfordern
Berechtigungen und legen Sie eine maxSdkVersion
von API 28 in Ihrer AndroidManifest.xml
fest:
<!-- 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" />
Medienauswahl bearbeiten
Mit der Funktion „Zugriff auf ausgewählte Fotos“ in Android 14 sollte Ihre App die
Neue READ_MEDIA_VISUAL_USER_SELECTED
-Berechtigung zur Steuerung von Medien
eine neue Auswahl zu treffen und die Benutzeroberfläche Ihrer App zu aktualisieren, damit Nutzer Ihrer App Zugriff gewähren können
mit anderen Bildern und Videos. Die folgende Abbildung zeigt ein Beispiel für
Berechtigungen anfordern und Medien noch einmal auswählen:
Beim Öffnen des Auswahldialogfelds werden Fotos, Videos oder beides angezeigt, je nachdem,
zu den angeforderten Berechtigungen. Wenn Sie beispielsweise
Nur READ_MEDIA_VIDEO
-Berechtigung ohne die READ_MEDIA_IMAGES
-Berechtigung
werden Videos auf der Benutzeroberfläche angezeigt, damit Nutzer Dateien auswählen können.
// Allow the user to select only videos
requestPermissions.launch(arrayOf(READ_MEDIA_VIDEO, READ_MEDIA_VISUAL_USER_SELECTED))
Sie können prüfen, ob Ihre App vollständigen, teilweisen oder verweigerten Zugriff auf die
Fotogalerie und aktualisieren Sie Ihre Benutzeroberfläche entsprechend. Diese Berechtigungen anfordern
wenn die App Speicherzugriff benötigt, und nicht beim Start. Beachten Sie, dass die
Das Erteilen von Berechtigungen kann zwischen der onStart
- und der onResume
-App geändert werden
Lebenszyklus-Callbacks verwenden, da der Nutzer den Zugriff in den Einstellungen ändern kann, ohne
Schließen deiner App.
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
}
Gerätebibliothek abfragen
Nachdem Sie überprüft haben, ob Sie Zugriff auf die richtigen Speicherberechtigungen haben, können Sie
Interagieren Sie mit MediaStore
, um die Gerätebibliothek abzufragen (derselbe Ansatz funktioniert
ob der gewährte Zugriff teilweise oder vollständig ist):
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
}
Dieses Code-Snippet wurde vereinfacht, um die Interaktion mit MediaStore
zu veranschaulichen.
Verwenden Sie in einer produktionsreifen App die Paginierung z. B. mit dem Paging
, um eine gute Leistung zu gewährleisten.
Letzte Auswahl abfragen
Apps mit Android 15 und höher und Android 14, die Google Play-Systemupdates unterstützen, können
die letzte Auswahl von Bildern und Videos abfragen, die der Nutzer bei Teilzugriff erstellt hat
durch Aktivieren von QUERY_ARG_LATEST_SELECTION_ONLY
:
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)
}
Der Zugriff auf Fotos und Videos bleibt erhalten, wenn das Gerät aktualisiert wird
Wenn sich deine App auf einem Gerät befindet, das ein Upgrade von einer früheren Android-Version Android 14 hat das System weiterhin vollen Zugriff auf die Fotos und Außerdem werden deiner App automatisch einige Berechtigungen gewährt. Die genaue hängt von den Berechtigungen ab, die Ihrer App vor dem wird das Gerät auf Android 14 aktualisiert.
Berechtigungen von Android 13
Betrachten Sie die folgende Situation:
- Deine App ist auf einem Gerät mit Android 13 installiert.
- Der Nutzer hat die Berechtigung
READ_MEDIA_IMAGES
und dieREAD_MEDIA_VIDEO
-Berechtigung für deine App. - Während die App noch installiert ist, wird das Gerät dann auf Android 14 aktualisiert.
- Deine App ist ab Android 14 (API-Level 34) ausgerichtet.
In diesem Fall hat Ihre App weiterhin vollen Zugriff auf die Fotos und Videos des Nutzers.
Außerdem behält das System die Berechtigungen READ_MEDIA_IMAGES
und READ_MEDIA_VIDEO
bei.
die Ihrer App automatisch gewährt wird.
Berechtigungen von Android 12 und niedriger
Betrachten Sie die folgende Situation:
- Deine App ist auf einem Gerät mit Android 13 installiert.
- Der Nutzer hat die Berechtigung
READ_EXTERNAL_STORAGE
oder dieWRITE_EXTERNAL_STORAGE
-Berechtigung für deine App. - Solange deine App noch installiert ist, wird das Gerät dann auf Android 14 aktualisiert.
- Deine App ist ab Android 14 (API-Level 34) ausgerichtet.
In diesem Fall hat Ihre App weiterhin vollen Zugriff auf die Fotos und Videos des Nutzers.
Außerdem erteilt das System die Berechtigung READ_MEDIA_IMAGES
und die
READ_MEDIA_VIDEO
automatisch die Berechtigung für deine App.
Best Practices
Dieser Abschnitt enthält mehrere Best Practices für die Verwendung des
Berechtigung „READ_MEDIA_VISUAL_USER_SELECTED
“. Weitere Informationen finden Sie in
unseren Best Practices für das Erteilen von Berechtigungen.
Berechtigungsstatus nicht dauerhaft speichern
Speichern Sie den Berechtigungsstatus nicht dauerhaft, einschließlich
SharedPreferences
oder DataStore
. Der gespeicherte Status ist möglicherweise nicht synchron mit
den tatsächlichen Zustand. Der Berechtigungsstatus kann sich nach dem Zurücksetzen der Berechtigung ändern.
App-Ruhezustand, eine vom Nutzer initiierte Änderung der App-Einstellungen oder
geht Ihre App in den Hintergrund. Prüfen Sie stattdessen mit
ContextCompat.checkSelfPermission()
Kein uneingeschränkter Zugriff auf Fotos und Videos
Aufgrund der Änderungen in Android 14 ist deine App möglicherweise nur teilweise
Zugriff auf die Fotogalerie des Geräts. Wenn die Anwendung MediaStore
-Daten im Cache speichert
Bei der Abfrage mit ContentResolver
ist der Cache möglicherweise nicht auf dem neuesten Stand.
- Fragen Sie
MediaStore
immer mitContentResolver
ab, anstatt sich auf ein Cache gespeichert werden. - Die Ergebnisse werden gespeichert, während die App im Vordergrund ausgeführt wird.
- Aktualisieren Sie die Ergebnisse, wenn Ihre App den Lebenszyklus der
onResume
-Anwendung durchläuft da der Nutzer möglicherweise über die Berechtigungseinstellungen.
URI-Zugriff als temporär behandeln
Wenn der Nutzer in den Systemberechtigungen die Option Fotos und Videos auswählen auswählt
, läuft der Zugriff Ihrer App auf die ausgewählten Fotos und Videos nach einer gewissen Zeit ab.
Deine App sollte immer für den Fall geeignet sein, keinen Zugriff auf Uri
zu haben,
unabhängig von ihrer Befugnis.
Auswählbaren Medientyp nach Berechtigung filtern
Im Auswahldialogfeld wird der angeforderte Berechtigungstyp berücksichtigt:
- Wenn Sie nur
READ_MEDIA_IMAGES
anfordern, werden nur Bilder angezeigt, die ausgewählt werden können. - Wenn Sie nur
READ_MEDIA_VIDEO
anfordern, ist nur das Video auswählbar. - Wenn Sie sowohl
READ_MEDIA_IMAGES
als auchREAD_MEDIA_VIDEO
anfordern, Fotogalerie auswählen.
Je nach Anwendungsfall Ihrer App sollten Sie
um eine schlechte
User Experience zu vermeiden. Wenn für eine Funktion
Videos ausgewählt werden. Achten Sie darauf, nur READ_MEDIA_VIDEO
anzufordern.
Berechtigungen in einem Vorgang anfordern
Um zu verhindern, dass Nutzer mehrere Dialogfelder zur Systemlaufzeit sehen, fordern Sie den
READ_MEDIA_VISUAL_USER_SELECTED
, ACCESS_MEDIA_LOCATION
und „Medien lesen“
Berechtigungen (READ_MEDIA_IMAGES
, READ_MEDIA_VIDEO
oder beides) in einem
.
Nutzern erlauben, ihre Auswahl zu verwalten
Wenn der Nutzer den Teilzugriffsmodus auswählt, sollte Ihre App nicht davon ausgehen, dass Die Fotogalerie auf dem Gerät ist leer und der Nutzer sollte weitere erlauben Dateien.
Der Nutzer kann sich entscheiden, über die ohne Zugriff auf einige visuelle Mediendateien gewähren.
Kompatibilitätsmodus
Wenn Sie eine eigene Galerieauswahl mit Speicherberechtigungen verwenden, dies aber nicht
deine App angepasst hat, um das neue READ_MEDIA_VISUAL_USER_SELECTED
zu verwenden
aktiviert, führt das System Ihre App immer dann im Kompatibilitätsmodus aus, wenn der Nutzer
muss Medien auswählen oder erneut auswählen.
Verhalten bei der ersten Medienauswahl
Wenn ein Nutzer bei der ersten Auswahl die Option „Fotos und Videos auswählen“ auswählt (siehe
Abbildung 1), sind die Berechtigungen READ_MEDIA_IMAGES
und READ_MEDIA_VIDEO
die während der App-Sitzung gewährt wird,
temporären Zugriff auf die vom Nutzer ausgewählten Fotos und Videos Wenn sich Ihre App
oder wenn der Nutzer Ihre App aktiv beendet,
wird das System schließlich
diese Berechtigungen verweigert. Dieses Verhalten entspricht den anderen einmaligen Berechtigungen.
Verhalten bei der Medienauswahl
Wenn Ihre App später Zugriff auf weitere Fotos und Videos benötigt,
muss die Berechtigung READ_MEDIA_IMAGES
oder den
Berechtigung „READ_MEDIA_VIDEO
“. Das System folgt dem gleichen Ablauf wie bei
Nutzer werden aufgefordert, Fotos und Videos auszuwählen (siehe
Abbildung 2).
Wenn deine App den Best Practices für Berechtigungen entspricht, sollte diese Änderung nicht
zerstören Sie Ihre App. Dies gilt insbesondere, wenn Ihre App nicht davon ausgeht, dass diese URI
des Zugriffs beibehalten, speichert den Status der Systemberechtigungen oder aktualisiert
angezeigt werden, nachdem sich die Berechtigung geändert hat. Dieses Verhalten ist jedoch möglicherweise
je nach Anwendungsfall Ihrer App ideal. Damit wir Ihnen ein optimales Erlebnis bieten können,
Nutzern empfehlen wir die Bildauswahl oder die Anpassung der
App-Galerieauswahl, um dieses Verhalten direkt über die
READ_MEDIA_VISUAL_USER_SELECTED
-Berechtigung.