2010-04-27 39 views
56

Tôi đang tạo thông báo trong ứng dụng Android của mình và muốn có tùy chọn trong tùy chọn của tôi để đặt âm thanh được sử dụng cho thông báo. Tôi biết rằng trong ứng dụng Cài đặt, bạn có thể chọn âm thanh thông báo mặc định từ danh sách. Danh sách đó đến từ đâu và có cách nào để tôi hiển thị cùng một danh sách trong đơn đăng ký của tôi không?Cách hiển thị danh sách các âm thanh thông báo có sẵn trên Android

Trả lời

92

Chỉ cần sao chép/dán một số mã từ một trong các ứng dụng của tôi thực hiện những gì bạn đang tìm kiếm.

Đây là trong một handler onClick của một nút có nhãn "thiết lập nhạc chuông" hoặc một cái gì đó tương tự:

Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); 
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "Select Tone"); 
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null); 
this.startActivityForResult(intent, 5); 

Và mã này nắm bắt được sự lựa chọn của người dùng:

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) 
{ 
    if (resultCode == Activity.RESULT_OK && requestCode == 5) 
    { 
      Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 

      if (uri != null) 
      { 
       this.chosenRingtone = uri.toString(); 
      } 
      else 
      { 
       this.chosenRingtone = null; 
      } 
     }    
    } 

Ngoài ra, tôi khuyên người dùng của tôi cài đặt ứng dụng "Đã mở rộng vòng" từ Android Market. Sau đó, bất cứ khi nào hộp thoại này được mở trên thiết bị của họ, chẳng hạn như từ ứng dụng của tôi hoặc từ menu cài đặt của điện thoại, người dùng sẽ có thêm lựa chọn để chọn bất kỳ mp3 nào được lưu trữ trên thiết bị của họ, chứ không phải nhạc chuông được cài sẵn.

+0

Cảm ơn you.I am khả năng hiển thị nhạc chuông thành công sử dụng mã của bạn Nhưng trong ** onActivityResult() ** phương pháp tôi nhận được lỗi " Không thể tham chiếu tĩnh đến phương thức không tĩnh getParcelableExtra (String) từ gõ Intent "tại dòng của bạn" Uri uri = Intent.getParcelableExtra (RingtoneManager.EXTRA_RINGTONE_PICKED_URI); " – Dharmendra

+1

Dòng đó nên đọc "Uri uri = intent.getParcelableExtra ...". Lưu ý lowecase "i" trong "intent". Chỉ cần một lỗi đánh máy trên mã trên. – zeh

+0

Mã hữu ích và ghi nhớ thư nhỏ trong intent.getParcelableExtra ... Cảm ơn rất nhiều – djk

46

Hoặc chỉ cần dính này trong tùy chọn XML của bạn:

<RingtonePreference android:showDefault="true" 
    android:key="Audio" android:title="Alarm Noise" 
    android:ringtoneType="notification" /> 

nội dung đầy đủ của XML mẫu của tôi chỉ dành riêng cho bối cảnh:

<?xml version="1.0" encoding="UTF-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<EditTextPreference android:title="Some value" 
        android:key="someval" 
        android:summary="Please provide some value" /> 
<EditTextPreference android:title="Some other value" 
        android:key="someval2" 
        android:summary="Please provide some other value" /> 
<RingtonePreference android:showDefault="true" 
    android:key="Audio" android:title="Alarm Noise" 
    android:ringtoneType="notification" /> 

</PreferenceScreen> 
+0

Cái này trông đẹp hơn .. – Mohsen

13

Đây là phương pháp tôi sử dụng để có được một danh sách các âm thanh thông báo có sẵn trong điện thoại :)

public Map<String, String> getNotifications() { 
    RingtoneManager manager = new RingtoneManager(this); 
    manager.setType(RingtoneManager.TYPE_NOTIFICATION); 
    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; 
} 

EDIT: Đây là nhận xét về cách đặt âm thanh trong NotificationCompat.Builder. Phương pháp này thay vì nhận được ID của nhạc chuông đó là những gì điện thoại sử dụng, thay vì TITLE có thể đọc được bằng con người mà phương pháp khác nhận được. Kết hợp các uri và id, và bạn có vị trí nhạc chuông.

public ArrayList<String> getNotificationSounds() { 
    RingtoneManager manager = new RingtoneManager(this); 
    manager.setType(RingtoneManager.TYPE_NOTIFICATION); 
    Cursor cursor = manager.getCursor(); 

    ArrayList<String> list = new ArrayList<>(); 
    while (cursor.moveToNext()) { 
     String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX); 
     String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX); 

     list.add(uri + "/" + id); 
    } 

    return list; 
} 

Đoạn mã trên sẽ trả về một danh sách các chuỗi như "nội dung: // media/nội/âm thanh/truyền thông/27" .. sau đó bạn có thể vượt qua một trong những chuỗi như là một Uri vào. setSound() như:

.setSound(Uri.parse("content://media/internal/audio/media/27")) 

Hy vọng rằng rõ ràng đủ :)

+0

Thật tuyệt, nhưng làm thế nào để bạn đặt âm thanh được phát bằng NotificationCompat.Builder.setSound (uri)? Thiết lập một trong những Uri đọc từ RingtoneManager không làm việc – infero

+0

Tôi đã chỉnh sửa bài viết với câu trả lời @infero, hy vọng nó rõ ràng và giải quyết vấn đề của bạn! – Murphybro2

+0

cảm ơn bạn đã cập nhật. Tôi đã cố gắng thiết lập âm thanh theo cách này với id trước, nhưng sử dụng một id mà không tồn tại - :-(grrrr. Cảm ơn một lần nữa – infero

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