URLからのSoundPoolの読み込み

mp3をサウンドプールにロードします。私が行こうと思っていない理由のために、私は R.raw 経由でロードしたくありません。

しかし、私はエラーが表示されます:

play(int, float, float, int, int, float) in the type SoundPool is not  applicable for the arguments (Object, float, float, int, int, float)

オブジェクトを int に変換する方法はありますか?

SoundPool mySoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
HashMap mySoundPoolMap = new HashMap(); 
mySoundPoolMap.put(0,  mySoundPool.load("android.resource://com.App.Notifications/raw/myMP3",1));

float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

mySoundPool.play(mySoundPoolMap.get(0), streamVolume, streamVolume, 1, 0, 1f);
1

1 答え

SoundPool ドキュメントを確認するには、いくつかの方法がありますサウンドプール:

  1. load(AssetFileDescriptor afd、int priority)
  2. load(コンテキストコンテキスト、int resId、int priority)
  3. load(String path、int priority)
  4. load(FileDescriptor fd、long offset、long length、int priority)

バンドルされたアセットをロードしたくないので、最初の2つのオプションのどちらも使用できません。つまり、オプション3または4を使用する必要があります。

最良の選択肢は、urlから自分自身でサウンドファイルをダウンロードし、ファイルを保存し、そのファイルを指す FileDescriptor を使用して SoundPool ファイルのパスを含む String を使用します。

Update: When you add an item to the SoundPool using load an int is returned. This int is a handle to the sound. Then to play the sound you must use that int to tell the SoundPool which sound you want to play:

例えば:

sp = new SoundPool();
int handle1 = sp.load(/* add sound 1*/);
int handle2 = sp.load(/* add sound 1*/);

sp.play(handle2, /*other args*/);//play sound 2
1
追加された
ロードが完了した後にのみサウンドを使用できます。 setOnLoadCompleteListenerを使用する必要があります
追加された 著者 android developer,
私は文字列を使用しようとしますが、play()はintを必要とします。mySoundPoolMap.put(0、mySoundPool.load( "android.resource://com.App.Notifications/r‌ aw/myMP3 "、1));
追加された 著者 panthro,
私はこれを試しましたが、エラーはありませんが、サウンドはまだ再生されません。
追加された 著者 panthro,
演奏を呼び出すときは、 load の呼び出しによって返された int ハンドルを使用する必要があります。簡単な説明は私の更新を見てください
追加された 著者 slayton,
はい、サウンドを正しく読み込んでいない可能性があります。 SoundpoolはURLからサウンドを読み込むことはできません。
追加された 著者 slayton,