Возможность добавления Android для выбора пользовательских звуковых эффектов в приложении - PullRequest
1 голос
/ 18 февраля 2012

У меня есть приложение, которое воспроизводит некоторые звуки в определенные моменты жизненного цикла приложения.Я хочу разрешить пользователю настраивать эти звуки (в настоящее время это 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 ]

0 голосов
/ 18 февраля 2012

Лучшее решение, которое сработало для меня:

Используйте 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;
        }



    };
0 голосов
/ 18 февраля 2012

Создайте некоторый файловый проводник (вы можете использовать Класс файла , такой же, как обычный 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
}
...