如何在Android中以编程方式获取默认铃声列表?

5
我是一名Android开发人员,想要创建一个Android应用程序。在这个应用程序中,需要显示Android默认铃声列表。但我无法显示它。如何获取Android默认铃声列表?
请帮助我。
4个回答

12

我已经点赞了Yuichi的回答,但它对我来说并没有完全起作用。对于每个铃声,我得到的URI都一样(不同的标题)。以下代码对我起作用-

public void listRingtones() {
  RingtoneManager manager = new RingtoneManager(this);
  manager.setType(RingtoneManager.TYPE_RINGTONE);
  Cursor cursor = manager.getCursor();
  while (cursor.moveToNext()) {
    String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
    Uri ringtoneURI = manager.getRingtoneUri(cursor.getPosition());
    // Do something with the title and the URI of ringtone
  }
}

你可以在Play商店上查看应用程序的工作情况。


1
只有这段代码能够获取到包括名称在内的完整铃声Uri。谢谢! - Zach Bublil
@Aniket Thakur,我该如何获取手动添加的铃声的铃声URI?因为使用此代码,我只能获取系统铃声列表?请帮忙。 - Sagar
如何获取名称 - Sagar
循环结束后不要忘记 cursor.close(); - FindOutIslamNow

1
获取包含默认铃声的所有铃声列表:
public static Map<String, Uri> getRingtones(Activity activity) {
    RingtoneManager manager = new RingtoneManager(activity);
    manager.setType(RingtoneManager.TYPE_RINGTONE);
    Cursor cursor = manager.getCursor();

    Map<String, Uri> list = new LinkedHashMap<>();
    String title = "Set to Default";
    Uri defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(activity, RingtoneManager.TYPE_RINGTONE);
    list.put(title, defaultRingtoneUri); // first add the default, to get back if select another 

    while (cursor.moveToNext()) {
      String notificationTitle = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
      Uri notificationUri = manager.getRingtoneUri(cursor.getPosition());

      list.put(notificationTitle, notificationUri);
    }



    return list;
  }

然后创建一个选择对话框:

public static void getRingtonesDialog(Activity activity, Collection<String> items, int selected, DialogInterface.OnClickListener itemClickListener, DialogInterface.OnClickListener okClickListener, final DialogInterface.OnClickListener cancelClickListener) {
    AlertDialog.Builder builderSingle = new AlertDialog.Builder(activity);
    builderSingle.setTitle("Select Ringtone");
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(activity, android.R.layout.select_dialog_singlechoice);
    arrayAdapter.addAll(items);

    builderSingle.setNegativeButton(android.R.string.cancel, cancelClickListener);

    builderSingle.setPositiveButton(android.R.string.ok, okClickListener);

    builderSingle.setSingleChoiceItems(arrayAdapter, selected, itemClickListener);

    builderSingle.setCancelable(false);

    builderSingle.show();
  }

然后选择并播放它们进行测试:(这里的AppSettings设置是您应用程序中的SharedPreferences):

Map<String, Uri> mRingtonesMap;
    private Uri mLastSelectedRingtone = null;
    private String mLastSelectedRingtoneName = "Default";
    private MediaPlayer mMediaPlayer;
    AppSettings settings;
    TextView mRingtone ;

在 Oncreate 中:

mRingtone = (TextView)findViewById(R.id.mRingtone);
        settings = AppSettings.getInstance(this);
        mRingtone.setText(getString(R.string.set_alarm_select_ringtone,
                settings.getString(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName)));
        mRingtone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                setupRingtoneSelection();
            }
        });

然后:

 private void setupRingtoneSelection() {
        mRingtonesMap = AlarmUtils.getRingtones(SelectionsActivity.this);
    mRingtone.setText(getString(R.string.set_alarm_select_ringtone,
            settings.getString(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName)));

    mRingtone.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final List<String> ringtoneKeys = new ArrayList<>(mRingtonesMap.keySet());
            String ringtoneUri = settings.getString(AppSettings.Key.SELECTED_RINGTONE, "");
            int selected = -1;
            for (int i = 0; i < ringtoneKeys.size(); i++) {
                String ring = ringtoneKeys.get(i);
                if (mRingtonesMap.get(ring).toString().equalsIgnoreCase(ringtoneUri)) {
                    selected = i;
                    break;
                }
            }

            AlarmUtils.getRingtonesDialog(SelectionsActivity.this, ringtoneKeys, selected, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) { //item selected
                    String name = ringtoneKeys.get(which);
                    mLastSelectedRingtoneName = name;
                    mLastSelectedRingtone = mRingtonesMap.get(name);

                    try {
                        if (mMediaPlayer == null) {
                            mMediaPlayer = new MediaPlayer();
                        } else {
                            mMediaPlayer.stop();
                            mMediaPlayer.reset();
                        }
                        mMediaPlayer.setDataSource(SelectionsActivity.this, mLastSelectedRingtone);
                        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                        mMediaPlayer.setLooping(false);
                        mMediaPlayer.prepare();
                        mMediaPlayer.start();
                    } catch (IOException ioe) {
                        //do nothing
                    }

                }
            }, new DialogInterface.OnClickListener() { //ok
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (mMediaPlayer != null) {
                        mMediaPlayer.stop();
                        mMediaPlayer.release();
                        mMediaPlayer = null;
                    }
                    settings.set(AppSettings.Key.SELECTED_RINGTONE, mLastSelectedRingtone.toString());
                    settings.set(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName);
                    //Update the textview
                    mRingtone.setText(getString(R.string.set_alarm_select_ringtone,
                            settings.getString(AppSettings.Key.SELECTED_RINGTONE_NAME, mLastSelectedRingtoneName)));
                    dialog.dismiss();
                }
            }, new DialogInterface.OnClickListener() { //cancel
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (mMediaPlayer != null) {
                        mMediaPlayer.stop();
                        mMediaPlayer.release();
                        mMediaPlayer = null;
                    }
                    dialog.dismiss();
                }
            });
        }
    });
}

@Override
protected void onDestroy() {
    if (mMediaPlayer != null) {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
        }

        mMediaPlayer.release();
        mMediaPlayer = null;
    }

    mRingtone.setOnClickListener(null);

    super.onDestroy();
}

您可以设置和更改铃声,如果需要,也可以恢复默认铃声。


0

您可以使用RingtoneManager获取铃声列表

public void listRingtones() {
  RingtoneManager manager = new RingtoneManager(this);
  manager.setType(RingtoneManager.TYPE_RINGTONE);
  Cursor cursor = manager.getCursor();
  while (cursor.moveToNext()) {
    String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
    String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
    // Do something with the title and the URI of ringtone
  }
}

2
需要记录的是,你需要在代码中添加 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 来实现此功能。 - Aniket Thakur
@Yuichi Araki,我该如何获取手动添加铃声的铃声URI?因为使用这段代码,我只能获取系统铃声列表。请帮忙。 - Sagar
我遇到了这个错误: 错误代码:1(SQLITE_ERROR) 原因:SQL(查询)错误或缺少数据库。 (编译时无此列:is_ringtone_theme(代码1):SELECT _id,title,“content://media/internal/audio/media”,title_key FROM audio WHERE ((is_alarm = 1或is_notification = 1或is_ringtone = 1)and _size!= 0 and is_ringtone_theme!= 1 and is_notification_theme!= 1 and is_alarm_theme!= 1) ORDER BY title_key)在 Galaxy Tab 10.1 2016 Android 8.1 上。 - ali-star
cursor.getString(RingtoneManager.URI_COLUMN_INDEX); 不会是铃声的URI。 - FindOutIslamNow

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接