ボタンをクリックして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;
    }



}

リソースを自動的に管理して、を呼び出せるようにしたい場合がありますMusicManager.getInstance().play(this, R.raw.my_sound);。もしそうなら、このライブラリはあなたのためかもしれません:github.com/delight-im/Android-Audio
caw

回答:


227

これは、元の投稿で提供されたコードで最も重要な部分です。

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);

最初は、サウンドの再生に使用されるボタンの初期化です。アクティビティのを使用して、findViewById割り当てたID(この例の場合:)を渡して、R.id.button1必要なボタンを取得します。初期化しているButton変数に簡単に割り当てることができるように、それをとしてキャストしoneます。これがどのように機能するかをさらに説明することは、この回答の範囲外です。これは、それがどのように機能するかについての簡単な洞察を与えます。

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

これはを初期化する方法MediaPlayerです。MediaPlayerはStatic Factory Method Design Patternに従います。インスタンスを取得するには、そのcreate()メソッドを呼び出して、再生するサウンドのコンテキストとリソースIDを渡します(この場合)R.raw.soho。として宣言しますfinal。Jon Skeetは、なぜここでそうするのかについての素晴らしい説明を提供しました。

one.setOnClickListener(new OnClickListener(){

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

最後に、以前に初期化したボタンの動作を設定します。ボタンクリックで音を鳴らす!これを行うにOnClickListenerは、ボタンのを設定しますone。内部は1つのメソッドのみでonClick()、クリック時にボタンが実行する必要のある指示が含まれています

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

サウンドを再生するには、MediaPlayerのstart()メソッドを呼び出します。このメソッドは、サウンドの再生を開始します。

そこで、Androidのボタンクリックでサウンドを再生できるようになりました。


ボーナス部分:

以下のコメントで述べたように、Langusten Gustelに感謝します。、およびAndroid Developer Reference推奨されているように、このrelease()メソッドを呼び出して、使用されなくなったリソースを解放することが重要です。通常、これは、再生するサウンドの再生が完了すると行われます。これを行うにはOnCompletionListenerlikeにを追加します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メソッドです。

第二。ボタンを変数oneとして初期化し、次に変数0を使用して、そのonClickListenerを不完全なonClickListenerに設定しました。変数1をsetOnClickListenerに使用します。

3番目に、サウンドを再生するロジックを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
Langusten Gustel 2016年

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で1つの問題を次々と検索した後、ここにあります

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:メディアプレーヤーは未処理のイベントで廃止されました

メディアプレーヤーを使用するには、安全で簡単なコードを実行してください。

同じアクティビティ/フラグメントで複数のサウンドを再生するには、次のような新しいメディアプレーヤーを作成しながら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()は必要ありません。
Keale 2013

6
  • オーディオはrawフォルダに配置する必要があります。存在しない場合は作成してください。
  • rawフォルダーはresフォルダー内にある必要があります
  • 名前に-文字や特殊文字を含めることはできません。

あなたの活動には、オブジェクトを持っている必要がありますMediaPlayer内、onCreate方法またはonclick方法、あなたは初期化する必要がありMediaPlayer、のようなMediaPlayer.create(this, R.raw.name_of_your_audio_file)、そして準備ができIRあなたのオーディオファイルがための呼び出しで演奏されることを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);

最後に、そのクラスでstartメソッドを実行します

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

これらのソリューションはすべて、適切で妥当なように「聞こえます」が、1つの大きな欠点があります。顧客がアプリケーションをダウンロードして繰り返しボタンを押すとどうなりますか?

あなたは、MediaPlayerあなたが何倍にボタンをクリックすると、時々 、あなたのサウンドを再生するために失敗します。

私はMediaPlayer数日前にこのクラスでこのパフォーマンスの問題に遭遇しました。

MediaPlayerクラスは使用するために保存されますか?常にではない。短い音がある場合は、SoundPoolクラスを使用することをお勧めします。

保存して効率的なソリューションは、優れた機能を提供し、アプリケーションのパフォーマンスを向上させるSoundPoolクラスです。

SoundPoolはMediaPlayerクラスほど簡単に使用できませんが、パフォーマンスと信頼性に関してはいくつかの大きな利点があります。

このリンクをたどって、アプリケーションでSoundPoolクラスを使用する方法を学んでください。

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

YouTube:ソリューションを保存

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.