java - 带有来自原始资源的自定义铃声的 RingtonePreference

标签 java android resources preference ringtone

目前我只是使用 CheckBoxPreference 来激活/停用声音。声音是从原始资源播放的。

现在我想将此 CheckBoxPreference 替换为 RingtonePreference,但我的资源中的自定义声音应该是默认声音,并且可以从 ringtonepreference 中选择。

我该怎么做?

最佳答案

我写了一个适合我需要的 Preference Class,在这里也许它会帮助其他人:

 public class SoundPreference extends ListPreference implements
            PreferenceManager.OnActivityResultListener, OnPreferenceChangeListener {

    private NotificationPrefs mAct;

    public SoundPreference(NotificationPrefs act) {
            super(act);
            mAct = act;
            setEntries(new String[] { "Silent",
                            "Custom",
                           "Picker" });
            setEntryValues(new String[] { "silent", "custom", "picker" });

            setOnPreferenceChangeListener(this);
    }

    @Override
    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
            if (data != null) {
                    Uri uri = data
                                    .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
                    if (uri != null) {
                            persistString(uri.toString());
                            return true;
                    }
            }
            return false;
    }

    @Override
    public void setValue(String value) {

            List<CharSequence> vals = new ArrayList<CharSequence>(
                            Arrays.asList(getEntryValues()));
            if (!vals.contains(value)) {
                    List<CharSequence> ents = new ArrayList<CharSequence>(
                                    Arrays.asList(getEntries()));
                    Ringtone r = RingtoneManager.getRingtone(getContext(),
                                    Uri.parse(value));
                    String name = r.getTitle(getContext());
                    vals.add(value);
                    ents.add(name);

                    this.setEntries(ents.toArray(new CharSequence[ents.size()]));
                    this.setEntryValues(vals.toArray(new CharSequence[vals.size()]));

            }
            super.setValue(value);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
            if ("picker".equals(newValue)) {

                    Intent i = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                    i.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
                    i.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
                    Intent chooserIntent = Intent.createChooser(i, getContext()
                                    .getString(R.string.sound));
                    mAct.startActivityForResult(chooserIntent, 0);
                    mAct.setActivityResultListener(this);
                    return false;
            }

            return true;

    }
 }

关于java - 带有来自原始资源的自定义铃声的 RingtonePreference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17340607/

相关文章:

java - 查询索引数据库的java代码与查询未索引数据库的java代码相同吗?

c# - 在 Unity 中使用资源文件夹

xcode - 用于向 Xcode 项目添加资源的命令行工具

java - 从类路径中动态删除 jar

java - 使用 Maven 从 HTML 模板中删除注释

Java - repaint() 方法被调用一次,然后它不显示任何内容

java - 上下文菜单显示正确的数据,但 ListView 不显示

android - 如何将第三个按钮添加到 Android 警报对话框?

c++ - Qt 资源文件解决方法

Java - 检测字符串中的不同编码