Загрузка звукового пула Android (путь строки, приоритет int)

Я пытаюсь загрузить звук с Android. Звук находится под res/raw/myownsound.wav. Я знаю, что уже могу загрузить звук, используя:

 soundPool.load(context, R.raw.myownsound, 1)

В целях настройки я хотел бы загрузить его, используя:

 soundPool.load("res/raw/myownsound", 1)

... но я получаю следующую ошибку: error loading res/raw/myownsound. Я также пробовал следующее:

 soundPool.loadSound("android.resource://upg.GraphismeBase/raw/myownsound", 1)

.. но я также получаю сообщение об ошибке: error loading android.resource://upg.GraphismeBase/raw/myownsound

Как правильно использовать soundPool.load(путь, приоритет)?


person Mikaël Mayer    schedule 23.08.2012    source источник


Ответы (2)


Создайте структуру папок в вашем проекте

/assets/sounds/data/

Затем скопируйте туда свой wav-файл.

// Declare globally if needed
int mySoundId;
SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0 );
AssetManager am = this.getAssets();

//Use in whatever method is used to load the sounds
try {
    mySoundId = soundPool.load(am.openFd("sounds/data/myownsound"), 1);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Может попробовать это (не уверен, что это работает):

SoundPool mySoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
    int myAudioFile = getResId("claps", R.raw.class);
    try{
        mySoundPool.load(context.getActivity(),myAudioFile,1);
    } catch (Exception e){
        message = String.valueOf(e);
    }

public static int getResId(String variableName, Class<?> c) {
    Field field = null;
    int resId = 0;
    try {
        field = c.getField(variableName);
        try {
            resId = field.getInt(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return resId;
}
person Alexis C.    schedule 23.08.2012
comment
Что ж, это, безусловно, рабочий ответ, но мне бы очень хотелось узнать, как использовать версию с чистым путем, а не версию FileDescriptor. - person Mikaël Mayer; 23.08.2012
comment
Я поставил второй метод, может это то, что вы хотите - person Alexis C.; 23.08.2012
comment
Куда вы импортируете класс Field? - person Mikaël Mayer; 23.08.2012
comment
java.lang.reflect.Field — документы. oracle.com/javase/6/docs/api/java/lang/reflect/Field.html - person Alexis C.; 23.08.2012

Простой рабочий способ сделать это с контекстом с именем mContext. Он загружает ресурс по имени, получая идентификатор идентификатора во время выполнения.

int sound_id = mContext.getResources().getIdentifier("myownsound", "raw",
                                                     mContext.getPackageName());
soundPool.load(mContext, sound_id, 1);

Он также работает для загрузки рисунков или файлов xml, например, путем замены "raw" на "drawable" или "xml".

person Mikaël Mayer    schedule 03.09.2012