代码之家  ›  专栏  ›  技术社区  ›  robintw

如何在Android上显示可用通知声音列表

  •  62
  • robintw  · 技术社区  · 14 年前

    我正在我的Android应用程序中创建通知,并希望在我的首选项中有一个选项来设置通知使用的声音。我知道在设置应用程序中,您可以从列表中选择默认通知声音。该列表来自何处,是否有方法在应用程序中显示相同的列表?

    3 回复  |  直到 9 年前
        1
  •  99
  •   whlk    11 年前

    只需从我的一个应用程序复制/粘贴一些代码就可以了。

    这是在一个名为“设置铃声”或类似按钮的onclick处理程序中:

    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);
    

    此代码捕获用户所做的选择:

     @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;
              }
          }            
      }
    

    另外,我建议我的用户从Android市场安装“Rings Extended”应用程序。然后,每当在设备上打开此对话框时,例如从我的应用程序或从手机的“设置”菜单中,用户将可以选择存储在设备上的任何MP3,而不仅仅是内置铃声。

        2
  •  49
  •   Laogeodritt JD.    10 年前

    或者只需将其保存在首选项XML中:

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

    我的示例XML的完整内容仅用于上下文:

    <?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>
    
        3
  •  16
  •   Murphybro2    9 年前

    这是我用来获取电话中可用通知声音列表的方法:)

    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;
    }
    

    编辑:这是关于如何在notificationCompat.builder中设置声音的注释。这个方法得到的是手机使用的铃声ID,而不是另一个方法得到的可读标题。将URI和ID结合起来,就可以找到铃声的位置。

    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;
    }
    

    上面的代码将返回字符串列表,如 “内容:://media/internal/audio/media/27” …然后可以将这些字符串中的一个作为URI传递到.setSound()中,如下所示:

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

    希望这已经足够清楚了:)