【问题标题】:Getting a list of available Ringtones in Android获取 Android 中可用铃声的列表
【发布时间】:2011-08-22 16:55:41
【问题描述】:

我已经看到很多关于如何设置默认铃声的示例,但我更感兴趣的是能够填充一个下拉框列表,其中填充了手机上可用的铃声。因此,当人们在 android 设置中更改铃声时看到的列表,我希望能够列出所有这些。

我找到的最接近的东西是here,但这只是为了设置默认铃声。有什么想法吗?可以在铃声管理器中,也可以在铃声管理器中。

【问题讨论】:

  • 请选择一个答案

标签: android audio drop-down-menu ringtone


【解决方案1】:

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

【讨论】:

  • 要获得正确的铃声 uri,您需要添加 cursor.getString(RingtoneManager.ID_COLUMN_INDEX)) 的值。所以它将是 Uri uri = Uri.parse(notificationUri + "/" + cursor.getString(RingtoneManager.ID_COLUMN_INDEX))。之后,你可以通过 RingtoneManager.getRingtone(context, uri) 获取铃声并播放它,例如。
  • @blyabtroi 谢谢。你拯救了我的一天!
  • 如何获取铃声的标题/名称
【解决方案2】:

RingtoneManager 是您正在寻找的。您只需要使用setType 设置TYPE_RINGTONE,然后遍历getCursor 提供的Cursor。

这是一个返回 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 返回一个托管游标?
  • @eWolf getCursor docs 状态: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.
  • @user650881:奇怪的是 deactivate 自 API 16(Android 4.1 JellyBean)以来已被弃用。 Looking at the code 似乎最好的解决方案是创建一个 RingtoneManager 的新实例以拥有一个新的有效光标(或保留光标直到它真正被使用)。
  • 如何获取我在 oppo 上使用的铃声的名称/标题Ringtone r = RingtoneManager.getRingtone(this, ringtoneURI) String ringToneName = r.getTitle(this) 我没有得到真实姓名`
  • @SagarHudge 这样更容易rm.getRingtone(rmCursor.position).getTitle(context)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多