2011-08-22 78 views
8

Tôi đã nhìn thấy rất nhiều ví dụ về cách đặt nhạc chuông mặc định, nhưng những gì tôi quan tâm hơn là có thể điền danh sách hộp thả xuống chứa nhạc chuông có sẵn trên điện thoại. Vì vậy, danh sách mà mọi người nhìn thấy khi họ thay đổi nhạc chuông của họ trong cài đặt android, tôi muốn có thể liệt kê tất cả những thứ đó.Lấy danh sách các Nhạc chuông sẵn có trong Android

Điều gần nhất tôi tìm thấy là here, nhưng một lần nữa, đây chỉ là để đặt nhạc chuông mặc định. Có ý kiến ​​gì không? Nó có thể vào hoặc ra khỏi ringtonemanager.

Trả lời

14

RingtoneManager là những gì bạn đang tìm kiếm. Bạn chỉ cần sử dụng setType để đặt TYPE_RINGTONE và sau đó lặp lại trên Con trỏ được cung cấp bởi getCursor.

Đây là một ví dụ làm việc của một phương pháp giả thuyết rằng trả về một mảng của URI, với sự khác biệt nhỏ duy nhất mà nó đang tìm kiếm cảnh báo thay vì nhạc chuông:

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

Tôi nhận được 'StaleDataException' (* Đã cố gắng truy cập con trỏ sau khi đã đóng. *) Khi đặt điện thoại vào chế độ ngủ và đánh thức lại sau khi sử dụng mã này. Không đóng con trỏ dường như sửa chữa nó - Tôi cho rằng 'RingtoneManager' trả về một con trỏ được quản lý? – eWolf

+1

@eWolf Trạng thái 'getCursor' [docs] (https://developer.android.com/reference/android/media/RingtoneManager.html#getCursor%28%29): ' Con trỏ được trả về sẽ là cùng một con trỏ trả về mỗi lần phương thức này được gọi, do đó không đóng() con trỏ. Con trỏ có thể tắt() một cách an toàn. Nếu RingtoneManager (Activity) không được sử dụng, người gọi nên quản lý con trỏ trả về thông qua vòng đời hoạt động của nó để ngăn chặn rò rỉ con trỏ.' – user650881

+0

@ user650881: điều kỳ lạ là [hủy kích hoạt] (https://developer.android. com/reference/android/database/Cursor.html # deactivate% 28% 29) không còn được dùng nữa kể từ API 16 (Android 4.1 Jellybean). [Xem mã] (https://github.com/android/platform_frameworks_base/blob/kitkat-release/media/java/android/media/RingtoneManager.java#L360) có vẻ như giải pháp tốt nhất là tạo một thể hiện của RingtoneManager để có một con trỏ hợp lệ mới (hoặc giữ con trỏ cho đến khi nó thực sự được sử dụng). – Diego

12

này sẽ trả lại cho bạn những tiêu đề và uri của tất cả nhạc chuông có sẵn. Làm với họ những gì bạn muốn!

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

Để có được nhạc chuông chính xác uri bạn cần phải thêm một giá trị của cursor.getString (RingtoneManager.ID_COLUMN_INDEX)). Vì vậy, nó sẽ là Uri uri = Uri.parse (notificationUri + "/" + cursor.getString (RingtoneManager.ID_COLUMN_INDEX)). Sau đó, bạn có thể nhận nhạc chuông bằng RingtoneManager.getRingtone (ngữ cảnh, tiếng Uri) và phát nhạc chuông, ví dụ. – blyabtroi

+0

@blyabtroi Cảm ơn bạn. Bạn đã cứu ngày của tôi! –

+0

cách lấy tiêu đề/tên nhạc chuông –

Các vấn đề liên quan