web-dev-qa-db-ja.com

Androidで利用可能な通知音のリストを表示する方法

Androidアプリケーションで通知を作成していますが、通知に使用するサウンドを設定するオプションを設定に追加したいと思います。設定アプリケーションでは、リストからのデフォルトの通知音そのリストはどこから来たのですか、アプリケーションで同じリストを表示する方法はありますか?

63
robintw

あなたが探していることをする私のアプリの1つからいくつかのコードをコピー/ペーストするだけです。

これは、「着信音を設定」などのラベルが付いたボタンの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 Market。から「Rings Extended」アプリをインストールすることをお勧めします。アプリや携帯電話の設定メニューなどからデバイスでこのダイアログを開くと、ユーザーは、組み込みの着信音だけでなく、デバイスに保存されているmp3を選択することもできます。

101
Mark B

または、これを設定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>
49
JD.

これは、電話で利用可能な通知音のリストを取得するために使用する方法です:)

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でサウンドを設定する方法に関するコメント用です。このメソッドは、代わりに、他のメソッドが取得した人間が読めるTITLEの代わりに、電話が使用する着信音の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;
}

上記のコードは"content:// media/internal/audio/media/27" ..のような文字列のリストを返します。これらの文字列の1つをUriとして.setSound( ) お気に入り:

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

それが十分明確であったことを願っています:)

16
Murphybro2
  public void listRingtones() {
            RingtoneManager manager = new RingtoneManager(this);
            manager.setType(RingtoneManager.TYPE_NOTIFICATION);
           // manager.setType(RingtoneManager.TYPE_RINGTONE);//For Get System Ringtone
            Cursor cursor = manager.getCursor();

            while (cursor.moveToNext()) {
                String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
                String uri = manager.getRingtoneUri(cursor.getPosition());

                String ringtoneName= cursor.getString(cursor.getColumnIndex("title"));



                Log.e("All Data", "getNotifications: "+ title+"-=---"+uri+"------"+ringtoneName);
                // Do something with the title and the URI of ringtone
            }
        }
0
Manthan Patel

ここに別のアプローチがあります(Kotlinで)、この質問の他の回答から構築します。これにより、トーンの名前を指定し、それを再生できます。

fun playErrorTone(activity: Activity, context: Context, notificationName: String = "Betelgeuse") {

        val notifications = getNotificationSounds(activity)

        try {
            val tone = notifications.getValue(notificationName)
            val errorTone = RingtoneManager.getRingtone(context, Uri.parse(tone))
            errorTone.play()
        } catch (e: NoSuchElementException) {
            try {
                // If sound not found, default to first one in list
                val errorTone = RingtoneManager.getRingtone(context, Uri.parse(notifications.values.first()))
                errorTone.play()
            } catch (e: NoSuchElementException) {
                Timber.d("NO NOTIFICATION SOUNDS FOUND")
            }
        }
    }

    private fun getNotificationSounds(activity: Activity): HashMap<String, String> {
        val manager = RingtoneManager(activity)
        manager.setType(RingtoneManager.TYPE_NOTIFICATION)
        val cursor = manager.cursor

        val list = HashMap<String, String>()
        while (cursor.moveToNext()) {
            val id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX)
            val uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX)
            val title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX)

            list.set(title, "$uri/$id")
        }

        return list
    }

おそらく、リファクタリングと最適化が必要になる可能性がありますが、アイデアを得る必要があります。

0
Nicolai Harbo