0

ユーザーが画面に触れるたびにランダムなサウンドを再生したいと考えています。これらの他の投稿を見つけて使用することで、プロジェクトをセットアップし、正しい方向に進むことができました。

ボタンを押してランダムなサウンド ファイルを再生する - Android

ランダム ファイルを再生するサウンド マネージャーに関する問題

ランダム ファイルを再生するサウンド マネージャーに関する問題

onTouch でランダムなサウンドを再生する

問題は、現在のコードで NullPointerException が発生することです。LogCat は、それが 2 つの場所から来ていることを示しています。

メインクラスでは

int x = r.nextInt(1); 

そしてSoundManagerクラスで

mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);

これは私が見落としているだけであることは知っていますが、理解できないようです。Android と Java の開発はかなり新しいので、それが理由です。Main クラスと SoundManager クラスの両方を含めました。どんな助けでも大歓迎です!

メインクラス

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;


public class Main extends Activity implements OnTouchListener
{
    Random r = new Random();
    int x = r.nextInt(1);

    private SoundManager mSoundManager;

    @Override public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ImageView image = (ImageView) findViewById(R.id.mIll);
        image.setOnTouchListener(this);

        mSoundManager = new SoundManager();
        mSoundManager.initSounds(getBaseContext());
        mSoundManager.addSound(1, R.raw.m1);
        mSoundManager.addSound(2, R.raw.m2);
        mSoundManager.addSound(3, R.raw.m3);
        mSoundManager.addSound(4, R.raw.m4);
        mSoundManager.addSound(5, R.raw.m5);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {

    switch (event.getAction()) 
    {
        case MotionEvent.ACTION_DOWN:
        {
            mSoundManager.playSound(x);
        }

        break;

    }

    return true;

    }

}

サウンドマネージャー

import java.util.HashMap;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class SoundManager {

    private SoundPool mSoundPool;
    private HashMap<Integer, Integer> mSoundPoolMap;
    private AudioManager mAudioManager;
    private Context mContext;
    public static final int maxSounds = 1;

    public SoundManager() {

    }

    public void initSounds(Context theContext) {
        mContext = theContext;
        mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        mSoundPoolMap = new HashMap<Integer, Integer>();
        mAudioManager = (AudioManager) mContext
                .getSystemService(Context.AUDIO_SERVICE);
    }

    public void addSound(int Index, int SoundID) {
        mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));

    }

    public void playSound(int index) {

        int streamVolume = mAudioManager
                .getStreamVolume(AudioManager.STREAM_MUSIC);
        mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume,
                1, 0, 1f);
    }

}
4

2 に答える 2

1

問題は

int x = r.nextInt(1);  //<<<<

この行は常に 0 を乱数として生成し、0キーはHashMapas から値を取得する前に .check null に存在しませんHashMap:

if(mSoundPoolMap.containsKey(index)){
 mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume,
                1, 0, 1f);
}
else{
 // Generate  next number

}
于 2013-03-11T17:35:51.987 に答える
0

初期化を onCreate() セクションに移動します

  Random r ;
  int x ;

  @Override public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    r= new Random();
    x= r.nextInt(1);
    ...
}
于 2013-03-11T17:30:50.497 に答える