Android : l’enfer pour accéder aux fichiers du téléphone !


Pour une application qui propose de jouer un son utilisateur, il me semble normal de proposer l’utilisation des musiques/sons disponibles sur le téléphone.

Et pourtant, la mise en place d’un tel mécanisme est loin d’être simple. A tel point que j’ai carrément fait une nouvelle application uniquement pour développer un tel mécanisme. Mes objectifs étaient de pouvoir choisir un fichier son (*.wav, *.ohh, etc.) depuis les préférences de l’application, de fournir une gestion de liste de fichiers son et de pouvoir faire une lecture d’un fichier lorsqu’il est sélectionné dans la liste. Pour faire plaisir aux enfants, je suis parti sur le développement d’une boite à meuh.

Dans le détails, ce qui est évident, c’est de faire une page “settings” (très simple avec l’aide d’android studio), et d’ajouter la permission d’accéder au stockage du téléphone.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Comme la gestion de liste d’éléments n’est pas au top dans les préférences (pas de gestion dynamique des éléments, pas possible d’associer une action à l’événement de sélection), nous basculons alors dans une nouvelle fenêtre dédiée. Là encore, une simple déclaration dans le fichier de configuration des préférences permet d’ouvrir une nouvelle activité lorsque nous sélectionnons la préférence.

<Preference
    app:key="customSoundActivity"
    app:summary="@string/custom_sound_picker_activity_summary"
    app:title="@string/custom_sound_picker_activity_title">
    <intent
        android:targetClass="fr.atpar.boitameuh.ringtone.RingtonePickerActivity"
        android:targetPackage="fr.atpar.boitameuh" />
</Preference>

Ensuite, la mise en place de la liste d’éléments sonores. Et c’est là que cela se complique. Nous avons à notre disposition la classe ListView qui pourrait tout à fait nous convenir dans un premier temps, ou une alternative plus performante et moderne mais obsolète, la classe RecyclerView. Si si, c’est possible, Android l’a fait 🙂

Comme j’aimerais avoir deux sections, une pour les sons fournis par l’application et une pour les sons utilisateurs. Que j’aimerais jouer le fichier son lors de sa sélection et aussi intégrer le bouton d’ajout de nouveau son directement dans la liste. Et que l’exemple trouvé dans le code source du framework android (les paramètres de gestion de la sonnerie du téléphone) se base sur RecyclerView. Je suis parti sur cette solution 🙂

3 fichiers xml et 31 classes plus tard, j’ai enfin “la” gestion de sons qui me convient ! Enfin, presque … la lecture du fichier son ne se déclenche pas systématiquement (petit problème de la gestion asynchrone du fichier media et la préemption des ressources audio du téléphone), la gestion de la suppression des fichiers utilisateurs est moche (bouton remove qui apparait sur un appui long), pas de vérification sur l’existence des fichiers utilisateurs (pourtant, ils peuvent être supprimés à tout moment du téléphone) et l’accès aux fichiers media du téléphone qui est encore perfectible (surtout pour les fichiers *.amr qui correspondent aux enregistrements audio fait directement depuis votre téléphone). Bon, des améliorations qui pourront attendre l’intégration dans l’application cible.

https://gitlab.com/atpar/boitameuh

 

 

 


Leave a Reply

Your email address will not be published. Required fields are marked *