Putar suara pada tombol klik android


109

Bagaimana cara mendapatkan tombol untuk memutar suara mentah saat diklik? Saya baru saja membuat tombol dengan id button1, tetapi kode apa pun yang saya tulis, semuanya salah.

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
Anda mungkin ingin agar sumber daya dikelola secara otomatis, sehingga Anda dapat menelepon MusicManager.getInstance().play(this, R.raw.my_sound);. Jika demikian, perpustakaan ini mungkin untuk Anda: github.com/delight-im/Android-Audio
gak

Jawaban:


228

Ini adalah bagian terpenting dari kode yang disediakan di postingan asli.

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

Untuk menjelaskannya selangkah demi selangkah:

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

Pertama adalah inisialisasi tombol yang akan digunakan dalam memainkan suara. Kita menggunakan Activity findViewById, meneruskan Id yang kita tetapkan padanya (dalam contoh kasus ini :) R.id.button1, untuk mendapatkan tombol yang kita butuhkan. Kami memasukkannya sebagai Buttonsehingga mudah untuk menugaskannya ke variabel oneyang kami inisialisasi. Menjelaskan lebih lanjut tentang cara kerjanya berada di luar cakupan jawaban ini. Ini memberikan wawasan singkat tentang cara kerjanya.

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

Ini adalah cara menginisialisasi file MediaPlayer. MediaPlayer mengikuti Pola Desain Metode Pabrik Statis . Untuk mendapatkan sebuah instance, kita memanggil create()metodenya dan meneruskannya ke konteks dan ID sumber daya dari suara yang ingin kita mainkan, dalam kasus ini R.raw.soho. Kami menyatakannya sebagai final. Jon Skeet memberikan penjelasan yang bagus tentang mengapa kami melakukannya di sini .

one.setOnClickListener(new OnClickListener(){

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

Akhirnya, kami mengatur apa yang akan dilakukan tombol yang diinisialisasi sebelumnya. Mainkan suara dengan mengklik tombol! Untuk melakukan ini, kami mengatur OnClickListenertombol kami one. Di dalamnya hanya ada satu metode, onClick()yang berisi instruksi apa yang harus dilakukan tombol saat diklik .

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

Untuk memutar suara, kami memanggil start()metode MediaPlayer . Metode ini memulai pemutaran suara.

Di sana, Anda sekarang dapat memutar suara dengan mengklik tombol di Android!


Bagian bonus:

Seperti yang tercantum dalam komentar di bawah Terima kasih Langusten Gustel! , dan seperti yang direkomendasikan dalam Referensi Pengembang Android , penting untuk memanggil release()metode untuk mengosongkan sumber daya yang tidak akan digunakan lagi. Biasanya, ini dilakukan setelah suara yang akan dimainkan selesai dimainkan. Untuk melakukannya, kami menambahkan sepertiOnCompletionListener kami mp :

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

Di dalam onCompletionmetode, kami merilisnya seperti ini:

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

Jelas ada cara yang lebih baik untuk menerapkan ini. Misalnya, Anda dapat menjadikan MediaPlayer sebagai variabel kelas dan menangani siklus prosesnya bersama dengan siklus proses Fragmentatau Activityyang menggunakannya. Namun, ini adalah topik untuk pertanyaan lain. Untuk menjaga cakupan jawaban ini kecil, saya menulisnya hanya untuk mengilustrasikan cara memutar suara saat klik tombol di Android .


Posting Asli

Pertama. Anda harus meletakkan pernyataan Anda di dalam blok, dan dalam hal ini metode onCreate.

Kedua. Anda menginisialisasi tombol sebagai variabel satu , lalu Anda menggunakan variabel nol dan menyetel onClickListenernya menjadi onClickListener yang tidak lengkap. Gunakan variabel satu untuk setOnClickListener.

Ketiga, letakkan logika untuk memutar suara di dalam onClick.

Singkatnya:

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
Dan dengan cara one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Jangan lewatkan itu!
Auto-Droid ツ

7
tidak untuk pergi keRELEASE
Langusten Gustel

38

Teruji dan bekerja 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(); }
            }
        });
    }
}

Hanya ini yang harus kami lakukan

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

Ini juga berfungsi saat memutar ulang audio. Saat memainkan suara saya pikir mp.start () akan bekerja tanpa try / catch dan if block.
khwilo

37

Cara terbaik untuk melakukan ini ada di sini yang saya temukan setelah mencari satu masalah demi satu masalah di 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();

Tidak merilis Pemutar media memberi Anda kesalahan ini di LogCat:

Android: MediaPlayer diselesaikan tanpa dirilis

Tidak mengatur ulang Pemutar media memberi Anda kesalahan ini di LogCat:

Android: mediaplayer pergi dengan acara yang tidak tertangani

Jadi mainkan kode yang aman dan sederhana untuk menggunakan pemutar media.

Untuk memainkan lebih dari satu suara dalam Aktivitas / Fragmen yang sama, cukup ubah resID sambil membuat pemutar Media baru seperti

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

dan mainkan!

Selamat bersenang-senang!


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

Ini hasilnya, sekali lagi tidak ada yang berhasil dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

Anda tidak memerlukan baris mp = new MediaPlayer () karena Anda menginisialisasinya lagi menggunakan MediaPlayer.create (...) di baris berikutnya.
Keale

6
  • Audio harus ditempatkan di raw folder, jika tidak ada, buat satu.
  • Folder mentah harus berada di dalam folder res
  • Nama tidak boleh memiliki -karakter apa pun atau karakter khusus di dalamnya.

Pada aktivitas Anda, Anda perlu memiliki objek MediaPlayer, di dalam onCreatemetode atau onclickmetode, Anda harus menginisialisasi MediaPlayer, seperti MediaPlayer.create(this, R.raw.name_of_your_audio_file), kemudian file audio Anda siap untuk diputar dengan panggilan start(), dalam kasus Anda, karena Anda menginginkannya ditempatkan di sebuah tombol, Anda harus memasukkannya ke dalam onClickmetode.

Contoh:

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

ada beberapa suara standar: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Bagus!

MediaActionSound

Kelas untuk menghasilkan suara yang cocok dengan yang dihasilkan oleh berbagai tindakan yang dilakukan oleh API media dan kamera. Docs

gunakan seperti:

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

Coba ini saya pikir itu akan berhasil


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

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

    }

membuat tombol dengan metode bisa dipanggil saat tombol ditekan (onCreate),

lalu buat variabel untuk kelas (MediaPlayer) dengan jalur file Anda

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

akhirnya jalankan metode start di kelas itu

mp.start();

file akan berjalan saat tombol ditekan, semoga bermanfaat!


3
Selamat datang di Stack Overflow! Akan lebih baik jika Anda menambahkan beberapa penjelasan dan mengomentari kode Anda sehingga pembaca selanjutnya dapat belajar dari Anda.
Mehdi Bounya

1

Alih-alih mengatur ulang seperti yang diusulkan oleh DeathRs:

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

kita bisa mengatur ulang MediaPlayer untuk mulai menggunakan:

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

1

Semua solusi ini "terdengar" bagus dan masuk akal, tetapi ada satu kelemahan besar. Apa yang terjadi jika pelanggan Anda mengunduh aplikasi Anda dan berulang kali menekan tombol Anda?

Anda MediaPlayer kadang-kadang akan gagal untuk memutar suara Anda jika Anda mengklik tombol untuk berkali-kali.

Saya mengalami masalah kinerja ini dengan MediaPlayerkelas beberapa hari yang lalu.

Apakah MediaPlayerkelas tersebut aman untuk digunakan? Tidak selalu. Jika Anda memiliki suara yang pendek, lebih baik menggunakan SoundPoolkelas.

Solusi hemat dan efisien adalah kelas SoundPool yang menawarkan fitur-fitur hebat dan meningkatkan kinerja aplikasi Anda.

SoundPool tidak mudah digunakan seperti MediaPlayerkelasnya, tetapi memiliki beberapa manfaat besar dalam hal kinerja dan keandalan.

Ikuti tautan ini dan pelajari cara menggunakan kelas SoundPool di aplikasi Anda:

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

Youtube: Simpan Solusi


0

Kasus tepi: Di atas setiap jawaban hampir benar tetapi saya terjebak dalam kasus tepi. Jika ada pengguna yang secara acak mengklik tombol beberapa kali dalam beberapa detik, maka setelah memainkan beberapa suara, ia tidak merespons lagi.

Alasan: Menginisialisasi Mediaplayerobjek sangat mahal. Ini juga berhubungan dengan sumber daya ( file audio ) sehingga butuh waktu untuk itu. Ketika pengguna secara acak initialize dan memanggil metode MediaPlayermetode 's seperti start(), stop(), release(), dll dapat menyebabkanIllegalStateException yang saya hadapi.

Solusi: Terima kasih gak untuk saran di komentar tentang Android-Audio . Ini hanya memiliki dua kelas java sederhana ( MusicManager.java,SoundManager.java ).

Anda dapat menggunakan MusicManager.javajika Anda ingin memutar file suara satu kali -

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

Anda dapat menggunakan SoundManager.javajika Anda ingin memainkan banyak suara secara sering dan cepat -

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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.