2011-08-22 38 views
8

我已經看到了很多關於如何設置默認鈴聲的例子,但是我更感興趣的是能夠填充一個下拉框列表,其中填充了可用的鈴聲電話。所以人們看到他們在android設置中更改鈴聲時的列表,我希望能夠列出所有這些。獲取Android版可用鈴聲列表

我發現的最接近的東西是here,但同樣這只是設置默認的鈴聲。任何想法的人?它可以進入或退出鈴聲管理器。

回答

14

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; 
+0

當使用此代碼後,手機進入休眠狀態並再次喚醒時,出現'StaleDataException'(*嘗試訪問遊標關閉後的*)。不關閉遊標似乎修復它 - 我想'RingtoneManager'返回一個託管光標? – eWolf

+1

@eWolf'getCursor' [docs](https://developer.android.com/reference/android/media/RingtoneManager.html#getCursor%28%29)狀態: '返回的遊標將是相同的遊標每次調用這個方法時都返回,所以不要關閉()遊標。光標可以安全地關閉()。 如果沒有使用RingtoneManager(Activity),調用者應該通過其活動的生命週期管理返回的遊標,以防止遊標泄漏。' – user650881

+0

@ user650881:奇怪的是[deactivate](https://developer.android。 com/reference/android/database/Cursor.html#deactivate%28%29)自API 16(Android 4.1 JellyBean)以來已棄用。 [看代碼](https://github.com/android/platform_frameworks_base/blob/kitkat-release/media/java/android/media/RingtoneManager.java#L360)似乎最好的解決方案是創建一個新的RingtoneManager實例擁有一個新的有效光標(或保持光標直到它真的被使用)。 – Diego

12

這將返回你的標題和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); 

     list.put(notificationTitle, notificationUri); 
    } 

    return list; 
} 
+4

要得到正確的鈴聲uri你需要添加一個cursor.getString(RingtoneManager.ID_COLUMN_INDEX))的值。所以它會是Uri uri = Uri.parse(notificationUri +「/」+ cursor.getString(RingtoneManager.ID_COLUMN_INDEX))。之後,您可以通過RingtoneManager.getRingtone(context,uri)獲取鈴聲並播放它,例如。 – blyabtroi

+0

@blyabtroi謝謝。你救了我的一天! –

+0

如何獲取鈴聲的標題/名稱 –