버튼 클릭 Android에서 소리 재생


109

클릭 할 때 Raw에서 사운드를 재생하는 버튼을 어떻게 얻습니까? 방금 id로 버튼을 button1만들었지 만 내가 작성한 코드가 무엇이든 모두 잘못되었습니다.

import android.media.MediaPlayer;

public class BasicScreenActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);
    }

    Button one = (Button)this.findViewById(R.id.button1);
    MediaPlayer = mp;
    mp = MediaPlayer.create(this, R.raw.soho);
    zero.setOnCliclListener(new View.OnClickListener() )

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.basic_screen, menu);
        return true;
    }



}

1
을 호출 할 수 있도록 리소스를 자동으로 관리하고 싶을 것입니다 MusicManager.getInstance().play(this, R.raw.my_sound);. : 그렇다면,이 라이브러리는 당신을 위해 수 있습니다 github.com/delight-im/Android-Audio
까악 까악

답변:


228

이것은 원본 게시물에 제공된 코드에서 가장 중요한 부분입니다.

Button one = (Button) this.findViewById(R.id.button1);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        mp.start();
    }
});

단계별로 설명하려면 :

Button one = (Button) this.findViewById(R.id.button1);

첫 번째는 사운드 재생에 사용되는 버튼의 초기화입니다. Activity의를 사용하여 findViewById할당 한 Id (이 예제의 경우 :)를 전달하여 R.id.button1필요한 버튼을 가져옵니다. 초기화 Button하는 변수에 쉽게 할당 할 수 있도록 캐스트합니다 one. 이것이 어떻게 작동하는지 더 설명하는 것은이 답변의 범위를 벗어납니다. 이것은 작동 방식에 대한 간략한 통찰력을 제공합니다.

final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);

이것은 MediaPlayer. MediaPlayer는 Static Factory 메서드 디자인 패턴을 따릅니다 . 인스턴스를 가져 오려면 해당 create()메서드를 호출하고 재생하려는 사운드의 컨텍스트와 리소스 ID (이 경우)를 전달 R.raw.soho합니다. 우리는 그것을 final. Jon Skeet는 우리가 여기서 그렇게하는 이유에 대해 훌륭한 설명을 제공했습니다 .

one.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        //code
    }
});

마지막으로 이전에 초기화 된 버튼이 수행 할 작업을 설정합니다. 버튼 클릭시 소리 재생! 이를 위해 OnClickListener버튼을 설정 합니다 one. 내부는 단지 하나의 방법이며, onClick()무엇을해야하는지 지시 버튼이 들어 클릭에를 .

public void onClick(View v) {
    mp.start();
}

사운드를 재생하기 위해 MediaPlayer의 start()메서드를 호출 합니다. 이 메서드는 사운드 재생을 시작합니다.

이제 Android에서 버튼 클릭시 소리를 재생할 수 있습니다!


보너스 부분 :

아래 댓글에서 언급했듯이 감사합니다 Langusten Gustel! , Android 개발자 참조에서 권장release() 하는대로 더 이상 사용되지 않을 리소스를 확보하기 위해 메서드를 호출하는 것이 중요합니다 . 일반적으로 이것은 재생할 사운드가 재생을 완료하면 수행됩니다. 이를 위해, 우리는 추가 OnCompletionListener우리에게 mp 이렇게 같은 :

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        //code
    }
});

onCompletion메서드 내에서 다음 과 같이 릴리스합니다 .

public void onCompletion(MediaPlayer mp) {
    mp.release();
}

이것을 구현하는 더 나은 방법 이 분명히 있습니다 . 예를 들어 MediaPlayer를 클래스 변수로 만들고 이를 사용 하는 Fragment또는 Activity사용 하는 수명주기와 함께 수명주기를 처리 할 수 있습니다. 그러나 이것은 다른 질문에 대한 주제입니다. 이 답변의 범위를 작게 유지하기 위해 Android에서 버튼 클릭시 소리를 재생하는 방법을 설명하기 위해 작성했습니다 .


원본 게시물

먼저. 문을 블록 안에 넣어야합니다.이 경우에는 onCreate 메서드가 필요합니다.

둘째. 버튼을 변수 1 로 초기화 다음 변수 0 을 사용하고 onClickListener를 불완전한 onClickListener로 설정했습니다. setOnClickListener에 변수 1 을 사용하십시오 .

셋째, onClick 내부에 사운드를 재생하는 로직을 넣습니다.

요약해서 말하자면:

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class BasicScreenActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic_screen);

        Button one = (Button)this.findViewById(R.id.button1);
        final MediaPlayer mp = MediaPlayer.create(this, R.raw.soho);
        one.setOnClickListener(new OnClickListener(){

            public void onClick(View v) {
                mp.start();
            }
        });
    }
}

1
그런데 그 one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); 놓치지 마세요!
Auto-Droid ツ

7
도착 RELEASE
하지 마십시오

38

100 % 테스트 및 작동

public class MainActivity extends ActionBarActivity {
    Context context = this;
    MediaPlayer mp;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        mp = MediaPlayer.create(context, R.raw.sound);
        final Button b = (Button) findViewById(R.id.Button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try {
                    if (mp.isPlaying()) {
                        mp.stop();
                        mp.release();
                        mp = MediaPlayer.create(context, R.raw.sound);
                    } mp.start();
                } catch(Exception e) { e.printStackTrace(); }
            }
        });
    }
}

이게 우리가해야 할 전부 였어

if (mp.isPlaying()) {
    mp.stop();
    mp.release();
    mp = MediaPlayer.create(context, R.raw.sound);
}

이것은 오디오를 재생할 때도 작동합니다. 사운드를 재생할 때 mp.start ()가 try / catch 및 if 블록없이 작동한다고 생각합니다.
khwilo

37

이 작업을 수행하는 가장 좋은 방법은 LogCat에서 한 문제를 차례로 검색 한 후 찾은 것입니다.

MediaPlayer mp;
mp = MediaPlayer.create(context, R.raw.sound_one);
mp.setOnCompletionListener(new OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        mp.reset();
        mp.release();
        mp=null;
    }
});
mp.start();

미디어 플레이어를 릴리스 하지 않으면 LogCat에서 다음 오류가 발생합니다.

Android : MediaPlayer가 출시되지 않고 종료 됨

미디어 플레이어를 재설정 하지 않으면 LogCat에서 다음 오류가 발생합니다.

Android : Mediaplayer가 처리되지 않은 이벤트로 사라졌습니다.

따라서 안전하고 간단한 코드를 재생하여 미디어 플레이어를 사용하십시오.

동일한 활동 / 조각에서 둘 이상의 사운드를 재생하려면 다음과 같은 새 미디어 플레이어를 만드는 동안 resID를 변경하기 만하면됩니다.

mp = MediaPlayer.create(context, R.raw.sound_two);

그리고 그것을 재생하십시오!

즐기세요!


8
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    MediaPlayer mp;
    Button one;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mp = MediaPlayer.create(this, R.raw.soho);
        one = (Button)this.findViewById(R.id.button1);

        one.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                mp.start();
            }
        });
    }
}

결과는 다음과 같습니다. 다시 아무것도 작동하지 않습니다. dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

다음 줄에서 MediaPlayer.create (...)를 사용하여 다시 초기화하기 때문에 mp = new MediaPlayer () 줄이 필요하지 않습니다.
킬레

6
  • 오디오는 raw폴더 에 있어야합니다 . 존재하지 않는 경우 새로 만듭니다.
  • 원시 폴더는 res 폴더 내에 있어야합니다.
  • 이름에는 -특수 문자 가 없어야 합니다.

활동에, 당신은 객체를 가질 필요가 MediaPlayer안쪽 onCreate방법 또는 onclick방법, 당신은 초기화가 MediaPlayer같은 MediaPlayer.create(this, R.raw.name_of_your_audio_file), 다음 준비 적외선 오디오 파일에 대한 호출을 재생하는 방법을 start()당신이 원하는 이후, 귀하의 경우, 버튼에 배치하면 onClick메서드 안에 넣어야합니다 .

예:

private Button myButton;
private MediaPlayer mp;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myactivity);
        mp = MediaPlayer.create(this, R.raw.gunshot);

        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.start();
            }
        });
}
}

3

미리 정의 된 소리가 있습니다 : SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

좋은!

MediaActionSound

미디어 및 카메라 API가 수행하는 다양한 작업에서 생성 된 것과 일치하는 사운드를 생성하는 클래스입니다. 문서

다음과 같이 사용하십시오.

fun playBeepSound() {
    val sound = MediaActionSound()
    sound.play(MediaActionSound.START_VIDEO_RECORDING)
}

2
Button button1=(Button)findViewById(R.id.btnB1);
button1.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
MediaPlayer mp1 = MediaPlayer.create(this, R.raw.b1);
mp1.start();
}
});

이것을 시도해보십시오.


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

        MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
        mp.start();

    }

버튼을 눌렀을 때 호출 될 수있는 메서드가있는 버튼 만들기 (onCreate),

그런 다음 파일 경로로 (MediaPlayer) 클래스에 대한 변수를 만듭니다.

MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);

마지막으로 해당 클래스에서 시작 메소드를 실행하십시오.

mp.start();

버튼을 누르면 파일이 실행됩니다. 도움이 되었기를 바랍니다.


3
Stack Overflow에 오신 것을 환영합니다! 코드에 대한 설명과 주석을 추가하여 향후 독자가 배울 수 있도록하는 것이 좋습니다.
Mehdi Bounya

1

DeathRs가 제안한대로 재설정하는 대신 :

if (mp.isPlaying()) {
       mp.stop();
       mp.release();
       mp = MediaPlayer.create(context, R.raw.sound);
} mp.start();

MediaPlayer를 재설정하여 다음을 사용할 수 있습니다.

if (mp.isPlaying()) {
       mp.seekTo(0)
}

1

이러한 모든 솔루션은 훌륭하고 합리적으로 들리지만 한 가지 큰 단점이 있습니다. 고객이 애플리케이션을 다운로드하고 버튼을 반복적으로 누르면 어떻게됩니까?

당신은 MediaPlayer당신이 많은 시간에 버튼을 클릭하면 가끔 사운드를 재생할 수 없게됩니다.

MediaPlayer며칠 전에 수업 에서이 성능 문제가 발생했습니다 .

는 IS MediaPlayer클래스는 사용에 저장? 항상 그런 것은 아닙니다. 짧은 소리가 있으면 SoundPool수업 을 사용하는 것이 좋습니다 .

저장하고 효율적인 솔루션은 뛰어난 기능을 제공하고 응용 프로그램의 성능을 향상시키는 SoundPool 클래스입니다.

SoundPool은 MediaPlayer클래스 만큼 사용하기 쉽지는 않지만 성능과 안정성면에서 큰 이점이 있습니다.

이 링크를 따라 응용 프로그램에서 SoundPool 클래스를 사용하는 방법을 알아보십시오.

https://developer.android.com/reference/android/media/SoundPool

Youtube : 솔루션 저장


0

엣지 케이스 : 위의 모든 답변은 거의 정확하지만 엣지 케이스에 갇혀있었습니다. 사용자가 몇 초 내에 무작위로 버튼을 여러 번 클릭하면 일부 사운드를 재생 한 후 더 이상 응답하지 않습니다.

이유 : 초기화 Mediaplayer개체는 매우 비쌉니다. 또한 리소스 ( audio file )를 처리하므로 시간이 걸립니다. 사용자 임의로 초기화 및 방법 호출 할 때 MediaPlayer등의 방법을 start(), stop(), release(), 등의 원인이 IllegalStateException내가 직면한다.

해결 방법 : 감사는 까악 까악 에 대한 주석에서 자신의 제안에 대한 안드로이드 오디오 . 간단한 두 개의 Java 클래스 ( MusicManager.java, SoundManager.java) 만 있습니다.

일회성 사운드 파일MusicManager.java 을 재생하려는 경우 사용할 수 있습니다 -

MusicManager.getInstance().play(MyActivity.this, R.raw.my_sound);

여러 사운드를 자주 빠르게SoundManager.java 재생하고 싶을 때 사용할 수 있습니다 -

class MyActivity extends Activity {

    private SoundManager mSoundManager;

    @Override
    protected void onResume() {
        super.onResume();

        int maxSimultaneousStreams = 3;
        mSoundManager = new SoundManager(this, maxSimultaneousStreams);
        mSoundManager.start();
        mSoundManager.load(R.raw.my_sound_1);
        mSoundManager.load(R.raw.my_sound_2);
        mSoundManager.load(R.raw.my_sound_3);
    }

    private void playSomeSound() {
        if (mSoundManager != null) {
            mSoundManager.play(R.raw.my_sound_2);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mSoundManager != null) {
            mSoundManager.cancel();
            mSoundManager = null;
        }
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.