Возможность добавления 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
}
Другие вопросы по тегам