Получение списка доступных рингтонов в Android

Я видел множество примеров того, как установить мелодию звонка по умолчанию, но меня больше интересует возможность заполнить раскрывающийся список доступных мелодий звонка на телефоне. Итак, список, который люди видят, когда они меняют рингтон в настройках Android, я хочу иметь возможность перечислить все это.

Самое близкое, что я нашел, это здесь, но опять же это только для установки мелодии звонка по умолчанию. Любые идеи? Это может быть в менеджере рингтонов или вне его.


person user877244    schedule 22.08.2011    source источник
comment
Пожалуйста, выберите ответ   -  person Murphybro2    schedule 09.09.2019


Ответы (2)


Это вернет вам название и uri всех доступных мелодий. Делай с ними что хочешь!

public Map<String, String> getNotifications() {
    RingtoneManager manager = new RingtoneManager(this);
    manager.setType(RingtoneManager.TYPE_RINGTONE);
    Cursor cursor = manager.getCursor();

    Map<String, String> list = new HashMap<>();
    while (cursor.moveToNext()) {
        String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
        String notificationUri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX) + "/" + cursor.getString(RingtoneManager.ID_COLUMN_INDEX);

        list.put(notificationTitle, notificationUri);
    }

    return list;
}
person Murphybro2    schedule 17.04.2015
comment
Чтобы получить правильный uri рингтона, вам нужно добавить значение cursor.getString(RingtoneManager.ID_COLUMN_INDEX)). Таким образом, это будет Uri uri = Uri.parse(notificationUri + / + cursor.getString(RingtoneManager.ID_COLUMN_INDEX)). После этого вы можете получить рингтон с помощью RingtoneManager.getRingtone(context, uri) и воспроизвести его, например. - person blyabtroi; 14.10.2015
comment
@blyabtroi Спасибо. Вы спасли мой день! - person shinilms; 02.01.2017
comment
как получить название/название рингтона - person Sagar; 09.03.2018

RingtoneManager — это то, что вам нужно. Вам просто нужно использовать setType, чтобы установить TYPE_RINGTONE, а затем перебрать курсор, предоставленный getCursor.

Это рабочий пример гипотетического метода, который возвращает массив URI с той лишь небольшой разницей, что он ищет будильники вместо мелодий звонка:

RingtoneManager ringtoneMgr = new RingtoneManager(this);
ringtoneMgr.setType(RingtoneManager.TYPE_ALARM);
Cursor alarmsCursor = ringtoneMgr.getCursor();
int alarmsCount = alarmsCursor.getCount();
if (alarmsCount == 0 && !alarmsCursor.moveToFirst()) {
    return null;
}
Uri[] alarms = new Uri[alarmsCount];
while(!alarmsCursor.isAfterLast() && alarmsCursor.moveToNext()) {
    int currentPosition = alarmsCursor.getPosition();
    alarms[currentPosition] = ringtoneMgr.getRingtoneUri(currentPosition);
}
alarmsCursor.close();
return alarms;
person Diego    schedule 25.09.2012
comment
Я получил StaleDataException (Попытка доступа к курсору после того, как он был закрыт.) при переводе телефона в спящий режим и его повторном пробуждении после использования этого кода. Не закрытие курсора, кажется, исправляет это — я полагаю, RingtoneManager возвращает управляемый курсор? - person eWolf; 03.02.2014
comment
@eWolf Состояние getCursor документов: The returned cursor will be the same cursor returned each time this method is called, so do not close() the cursor. The cursor can be deactivate() safely. If RingtoneManager(Activity) was not used, the caller should manage the returned cursor through its activity's life cycle to prevent leaking the cursor. - person user650881; 18.11.2014
comment
@user650881: странно, что деактивировать устарел, начиная с API 16 (Android 4.1 JellyBean). Глядя на код кажется, что лучшим решением является создание нового экземпляра RingtoneManager, чтобы иметь новый действительный курсор (или сохранить курсор до тех пор, пока он действительно не будет использован). - person Diego; 18.11.2014
comment
как получить имя/название мелодии звонка, которую я используюRingtone r = RingtoneManager.getRingtone(this, ringtoneURI) String ringToneName = r.getTitle(this) на oppo, я не получаю настоящее имя ` - person Sagar; 09.03.2018
comment
@SagarHudge Так проще rm.getRingtone(rmCursor.position).getTitle(context) - person daka; 14.06.2018
comment
Должен быть доступ к информации о рингтоне следующим образом: cursor.getString(RingtoneManager.URI_COLUMN_INDEX);. Это намного быстрее, см. ответ здесь - person daka; 15.12.2018