Comment faire apparaître la liste des sons de notification disponibles sur Android

Je crée des notifications dans mon application Android et souhaite avoir une option dans mes préférences pour définir le son utilisé pour la notification. Je sais que dans l’application Paramètres, vous pouvez choisir un son de notification par défaut dans une liste. D’où vient cette liste et est-il possible pour moi d’afficher la même liste dans ma demande?

Il suffit de copier / coller du code d’une de mes applications qui fait ce que vous recherchez.

Ceci est dans un gestionnaire onClick d’un bouton intitulé “set ringtone” ou quelque chose de similaire:

Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone"); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null); this.startActivityForResult(intent, 5); 

Et ce code capture le choix fait par l’utilisateur:

  @Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { if (resultCode == Activity.RESULT_OK && requestCode == 5) { Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (uri != null) { this.chosenRingtone = uri.toSsortingng(); } else { this.chosenRingtone = null; } } } 

Aussi, je conseille à mes utilisateurs d’installer l’application “Rings Extended” sur Android Market. Ensuite, chaque fois que cette boîte de dialog est ouverte sur leur appareil, par exemple depuis mon application ou depuis le menu des parameters du téléphone, l’utilisateur aura le choix supplémentaire de choisir l’un des fichiers MP3 stockés sur son appareil, et pas seulement les sonneries intégrées.

Ou juste coller ceci dans vos préférences XML:

   

Contenu complet de mon exemple XML uniquement pour le contexte:

       

C’est la méthode que j’utilise pour obtenir une liste des sons de notification disponibles sur le téléphone 🙂

 public Map getNotifications() { RingtoneManager manager = new RingtoneManager(this); manager.setType(RingtoneManager.TYPE_NOTIFICATION); Cursor cursor = manager.getCursor(); Map list = new HashMap<>(); while (cursor.moveToNext()) { String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX); String notificationUri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX); list.put(notificationTitle, notificationUri); } return list; } 

EDIT: Ceci est pour le commentaire concernant la façon de définir le son dans le NotificationCompat.Builder. Cette méthode obtient à la place l’identifiant de la sonnerie, qui est ce que le téléphone utilise, au lieu du titre lisible par l’homme que l’autre méthode a obtenu. Combinez l’URI et l’ID, et vous avez l’emplacement des sonneries.

 public ArrayList getNotificationSounds() { RingtoneManager manager = new RingtoneManager(this); manager.setType(RingtoneManager.TYPE_NOTIFICATION); Cursor cursor = manager.getCursor(); ArrayList list = new ArrayList<>(); while (cursor.moveToNext()) { String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX); String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX); list.add(uri + "/" + id); } return list; } 

Le code ci-dessus renverra une liste de chaînes comme “content: // media / internal / audio / media / 27” .. vous pouvez alors transmettre l’une de ces chaînes en Uri dans le fichier .setSound () comme:

 .setSound(Uri.parse("content://media/internal/audio/media/27")) 

J’espère que c’était assez clair 🙂