我有一个应用程序,可以在应用程序生命周期的某些点播放一些声音。我想允许用户自定义这些声音(目前它们是驻留在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: 另一种方式似乎是使用列表首选项。虽然列表首选项可行 - 但是当选择更改时,您必须手动“播放”声音。让我看看这是否有效,我会报告回来。
答案 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;
}
};