Возможность добавления Android для выбора пользовательских звуковых эффектов в приложении
У меня есть приложение, которое воспроизводит некоторые звуки в определенные моменты жизненного цикла приложения. Я хочу позволить пользователю настраивать эти звуки (в настоящее время это mp3-файлы, находящиеся в каталоге res / raw). Я смотрю на 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 ответа
Лучшее решение, которое сработало для меня:
Используйте ListPreferences, чтобы создать раскрывающийся список. Для этого сначала создайте файл строкового массива с именем sounds.xml в папке res/values (далее предполагается, что есть две опции). Первый массив будет отображаться как строки в вашем списке предпочтений, а второй - целочисленное значение, сопоставленное с ним.
<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;
}
};
Создайте какой-нибудь файловый проводник (вы можете использовать класс File, как и обычный 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
}