在安卓系统中获取可用铃声列表

15

我看到了很多设置默认铃声的例子,但我更感兴趣的是能够填充下拉框列表,并列出手机上可用的铃声。因此,当人们在Android设置中更改铃声时看到的列表,我想能够列出所有这些铃声。

我找到的最接近的东西是这里,但这只是用于设置默认铃声。有没有任何想法?它可以在ringtonemanager内或外。


请选择一个答案。 - Murphybro2
2个回答

27

这将返回所有可用铃声的标题和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;
}

5
为了获取正确的铃声URI,您需要添加一个值 cursor.getString(RingtoneManager.ID_COLUMN_INDEX)。因此,它将是 Uri uri = Uri.parse(notificationUri + "/" + cursor.getString(RingtoneManager.ID_COLUMN_INDEX))。之后,您可以通过 RingtoneManager.getRingtone(context, uri) 获取铃声并播放,例如。 - blyabtroi
@blyabtroi 谢谢你。你救了我的一天! - shinilms
如何获取铃声的标题/名称 - Sagar

16

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;

当我把手机休眠并在使用此代码后将其唤醒时,我收到了一个 StaleDataException (尝试在关闭游标后访问游标)。不关闭游标似乎可以解决它——我猜想 RingtoneManager 返回的是一个受管理的游标? - eflorico
1
@eWolf getCursor 文档 说明:返回的游标将是每次调用此方法时返回的相同游标,因此不要关闭(close())游标。游标可以安全地被deactivate()。如果没有使用RingtoneManager(Activity),则调用者应通过其活动的生命周期来管理返回的游标,以防止泄漏游标。 - user650881
@user650881:奇怪的是,自API 16(Android 4.1 JellyBean)起,deactivate已被弃用。查看代码,似乎最好的解决方案是创建一个新的RingtoneManager实例来获取一个新的有效游标(或者保持游标直到它真正被使用)。 - Diego
如何获取我正在使用的铃声的名称/标题Ringtone r = RingtoneManager.getRingtone(this, ringtoneURI) String ringToneName = r.getTitle(this)在OPPO上我没有得到真实的名称 - Sagar
@SagarHudge 这样做更容易 rm.getRingtone(rmCursor.position).getTitle(context) - olfek
应该像这样访问铃声信息:cursor.getString(RingtoneManager.URI_COLUMN_INDEX);。 这样会更快,详见此处的答案。 - olfek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接