Teilweisen Zugriff auf Fotos und Videos gewähren

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

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">
</ph> Die
Abbildung 1: In dem neuen Dialogfeld können Nutzer bestimmte und Videos, die sie in Ihrer App verfügbar machen möchten. können Sie den vollständigen Zugriff gewähren oder verweigern.

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:

<ph type="x-smartling-placeholder">
</ph> Die
Abbildung 2: In dem neuen Dialogfeld können Nutzer auch neu auswählen, und Videos, die sie für Ihre App verfügbar machen möchten.

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:

  1. Deine App ist auf einem Gerät mit Android 13 installiert.
  2. Der Nutzer hat die Berechtigung READ_MEDIA_IMAGES und die READ_MEDIA_VIDEO-Berechtigung für deine App.
  3. Während die App noch installiert ist, wird das Gerät dann auf Android 14 aktualisiert.
  4. 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:

  1. Deine App ist auf einem Gerät mit Android 13 installiert.
  2. Der Nutzer hat die Berechtigung READ_EXTERNAL_STORAGE oder die WRITE_EXTERNAL_STORAGE-Berechtigung für deine App.
  3. Solange deine App noch installiert ist, wird das Gerät dann auf Android 14 aktualisiert.
  4. 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 mit ContentResolver 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 auch READ_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.