android添加工具在应用程序中选择自定义音效

时间:2012-02-17 21:12:41

标签: android android-preferences audio

我有一个应用程序,可以在应用程序生命周期的某些点播放一些声音。我想允许用户自定义这些声音(目前它们是驻留在res / raw目录中的mp3文件)。我正在研究RingtonePreference,但我不清楚如何在显示的值中添加新声音,然后在我的应用程序中使用它们。如果有人能指出我正确的方向,我会非常感激。

谢谢!

修改

似乎是将文件添加到媒体商店。类似于下面显示的代码。这似乎有点矫枉过正,因为现在在android清单文件中你必须使用权限“android.permission.WRITE_SETTINGS”。理想情况下,我只想添加mp3资源作为选项,而无需将它们写入媒体商店。

        ContentValues content = new ContentValues();
        InputStream raw = getResources()
                .openRawResource(R.raw.file_name);

        File f = new File("android.resource://" + getPackageName() + "/"
                + R.raw.clock_ticking);
        content.put(MediaStore.MediaColumns.DATA, f.getAbsolutePath());
        content.put(MediaStore.MediaColumns.TITLE, "TITLE");
        content.put(MediaStore.MediaColumns.SIZE, 215454);
        content.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
        content.put(MediaStore.Audio.Media.ARTIST, "artist");
        content.put(MediaStore.Audio.Media.DURATION, 230);
        content.put(MediaStore.Audio.Media.IS_RINGTONE, false);
        content.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
        content.put(MediaStore.Audio.Media.IS_ALARM, false);
        content.put(MediaStore.Audio.Media.IS_MUSIC, false);

        Uri uri = MediaStore.Audio.Media.getContentUriForPath(f
                .getAbsolutePath());
        Uri newUri = getContentResolver().insert(uri, content);

编辑2: 另一种方式似乎是使用列表首选项。虽然列表首选项可行 - 但是当选择更改时,您必须手动“播放”声音。让我看看这是否有效,我会报告回来。

2 个答案:

答案 0 :(得分:0)

创建某种文件浏览器(您可以使用File class和常规Java一样创建它),以便允许用户选择文件,然后使用MediaPlayer来播放它们。

修改

如果您想让它更容易,请让您的用户将它们放在SD卡的指定目录中,比如yourapp/sounds,然后您可以使用ListView列出该目录中的所有文件:

File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/yourapp/sounds");
File[] sounds = f.listFiles();
for (File sound : sounds) {
    // Filter each one to see if it is a valid sound file
    // and then add them to a ListView where the user can choose them
}

答案 1 :(得分:0)

对我有用的最佳解决方案是:

使用ListPreferences创建下拉列表。为此,首先在res / values文件夹中创建一个名为sounds.xml的字符串数组文件(以下假定有两个选项)。第一个数组在列表首选项中显示为字符串,第二个数组是映射到它的整数值。

<string-array name="preferenceName">
    <item>Sound 1</item>
    <item>Sound 2</item>
</string-array>

<string-array name="preferenceValues">
    <item>0</item>
    <item>1</item>
</string-array>

列表首选项本身如下所示:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     >

    <PreferenceCategory android:title="Sound" >
        <ListPreference
            android:entries="@array/preferenceName"
            android:entryValues="@array/preferenceValues"
            android:key="preferenceName"
            />
    </PreferenceCategory>

</PreferenceScreen>

现在我们只需要在每次用户选择选项时播放声音。这是通过向列表首选项小部件添加OnPreferenceChangeListener来完成的。 (参见下面的OnPreferenceChangeListener伪代码)

private OnPreferenceChangeListener onPreferenceChangeListener = new OnPreferenceChangeListener() {

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

                //play the sound mapped to this preference here using
                            // media player
            }
            return true;
        }



    };