본문 바로가기

안드로이드/코드

[안드로이드] 효과음 넣기 (SoundPool, AudioManager)

반응형

 

 

효과음1

 

 

앱에 효과음을 사용하기 위해서는  SoundPool, AudioManager 클래스가 필요합니다.

간단하게 버튼을 누르면 재생되고 정지가 되는 예제를 만들어 보겠습니다.

 

1. res 폴더 안에 raw 폴더 생성

효과음2

 

 

2. raw 폴더 안에 원하는 효과음 파일을 넣으세요.

효과음3

*참고로 mp3파일명에 '-'(대쉬)가 들어가면 오류가 생기기 때문에 파일명에 대쉬가 들어간다면 수정해서 사용해야 합니다.

 

3. SoundManager 클래스 생성

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

public class SoundManager {
    private SoundPool mSoundPool;
    private HashMap<Integer,Integer> mSoundPoolMap;
    private AudioManager mAudioManager;
    private Context mContext;

    public SoundManager(Context mContext,SoundPool mSoundPool){
        this.mContext = mContext;
        this.mSoundPool = mSoundPool;
        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 int playSound(int index){ //효과음 재생
        int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        return mSoundPool.play(mSoundPoolMap.get(index),streamVolume,streamVolume,1,0,1f);
    }

    public void stopSound(int streamId){
        mSoundPool.stop(streamId);
    } //효과음 정지

    public void pauseSound(int streamId){
        mSoundPool.pause(streamId);
    } //효과음 일시정지

    public void resumeSound(int streamId){
        mSoundPool.resume(streamId);
    } //효과음 재시작
}

 

4. MainActivity 코드 작성

import androidx.appcompat.app.AppCompatActivity;

import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MainActivity extends AppCompatActivity {
    SoundPool soundPool;
    SoundManager soundManager;
    Button button;
    boolean play;
    int playSoundId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        //롤리팝 이상 버전일 경우
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool.Builder().build();
        }else{
            //롤리팝 이하 버전일 경우
            //new SoundPool(1번,2번,3번)
            //1번 - 음악 파일 갯수
            //2번 - 스트림 타입
            //3번 - 음질
            soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC,0);
        }

        soundManager = new SoundManager(this,soundPool);

        soundManager.addSound(0,R.raw.bees_buzzing_01);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!play){
                    playSoundId=soundManager.playSound(0);
                    play = true;
                }else{
                    soundManager.pauseSound(0);
                    play = false;
                }
            }
        });

    }
}

 

참고

int playSoundId 를 만든 이유는 재생을 하면 특정 int값이 반환되는데 일시정지후 재시작을 하려면

resumeSound에 반환된 int값을 넣어줘야 일시정지 되었던 효과음이 재생되기 때문입니다.

playSound(int index) 함수를 사용해서 반환된 int 값을 저장해두었다가 pauseSound, resumeSound(int streamId)에 해당 int값을 넣어주면 정지 또는 재시작을 할 수 있습니다.

 

반응형