GetExternalStoreDirectory() obsolète avec le SDK 29 problème photo android 10

android
android développement

Bonjour à toutes et tous.

Dans le développement d’application Android, il faut parfois modifier certaines parties de son code lors de l’apparition d’un nouvelle version d’Android.

Il est vrai, que cela est très contrariant de devoir recréer toute une fonctionnalité d’une application et de modifier une partie de son code alors que celui-ci fonctionnait très bien auparavant lors d’une mise à jour de sécurité ou à l’ajout d’une nouvelle version du SDK.

C’est le cas, par exemple pour la création de dossier avec le SDK 29, notamment pour dans mon cas le stockage et l’emplacement des photos sur la mémoire du périphérique Android.

Environement.getExternalStorageDirectory () java is deprecated

Comme l’annonce le titre, la fonction ou méthode : Environment.getExternalStorageDirectory() est obsolète avec le SDK 29, voir la page Google développeur .

Cette fonction permet d’interagir avec la périphérique de stockage de la machine Android pour la gestion des dossiers et fichiers : lecture, création, modification de fichiers.

Donc, si vous avez une application sur le google play store avec par exemple la partie photo qui ne fonctionne plus avec Android 10, c’est très probablement à cause de la gestion de fichier et notamment la méthode : Environment.getExternalStorageDirectory().getAbsolutePath()

Comment feinter cette méthode obsolète simplement

Il existe un moyen de feinter simplement, sans trop toucher au code de votre application tout en compilant votre application pour que celle-ci soit utilisable avec le SDK 29 ou supérieur.

Il suffit de rajouter cette ligne de code dans votre fichier AndroidManifest.xml, dans la balise application.

android:requestLegacyExternalStorage="true"

Exemple, extrait de mon fichier AndroidManifest.xml.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="friend.lol.com.dating"
>


    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <uses-feature android:name="android.hardware.location.gps" />
    <application
        android:requestLegacyExternalStorage="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        <uses-library android:name="org.apache.http.legacy" android:required="false" />
        <meta-data android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

        <activity android:name="friend.lol.com.dating.MainActivity"
            android:theme="@style/AppTheme.NoActionBar"
            android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Voila normalement, avec ceci tout devait revenir dans l’ordre. Par contre la méthode est toujours obsolète, donc je vous conseille d’utiliser la bonne méthode, au lieu de feinter avec cet astuce.

La bonne méthode ou comment migrer

Pour mon application, j’ai fais plusieurs test pour pouvoir migrer avec la bonne méthode.

Mon ancienne méthode :

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/friend.lol.com.dating/images/imageprincipal/");

Voici donc son équivalence avec la nouvelle méthode, notez qu’il faut importer un Context :

File file = new File(context.getExternalFilesDir(null), "../images/imageprincipal/");

Cette nouvelle méthode fait exactement la même chose que getExternalStorageDirectory() mais est 100 % compatible avec le SDK 29.

Par contre cette nouvelle méthode ne fonctionne pas avec les SDK antérieur, donc il faut juste comparer les SDK et implémenter la bonne méthode au bon SDK.Exemple :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
File file = new File(context.getExternalFilesDir(null), "../images/imageprincipal/");

} else {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/friend.lol.com.dating/images/imageprincipal/");

}

Si le SDK de l’appareil Android est égal ou supérieur au SDK 29, j’utilise la nouvelle méthode, sinon l’ancienne.

Comme-ceci votre application sera prête pour les version supérieur de Android.

Voila, j’espère vois avoir aider, bon code à toutes et tous et bonne journée.

Soyez le premier à commenter

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*