Phát âm thanh trên nút bấm android


109

Làm cách nào để nhận được nút để phát âm thanh từ thô khi nhấp vào? Tôi vừa tạo một nút với id button1, nhưng bất cứ mã nào tôi viết, tất cả đều sai.

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



}

Bạn có thể muốn các tài nguyên được quản lý tự động để bạn có thể gọi MusicManager.getInstance().play(this, R.raw.my_sound);. Nếu vậy, thư viện này có thể dành cho bạn: github.com/delight-im/Android-Audio
caw

Câu trả lời:


227

Đây là phần quan trọng nhất trong mã được cung cấp trong bài đăng gốc.

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

Để giải thích nó từng bước:

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

Đầu tiên là khởi tạo nút được sử dụng để phát âm thanh. Chúng tôi sử dụng Activity findViewById, chuyển Id mà chúng tôi đã gán cho nó (trong trường hợp của ví dụ này R.id.button1:), để lấy nút mà chúng tôi cần. Chúng tôi ép kiểu nó Buttonđể có thể dễ dàng gán nó cho biến onemà chúng tôi đang khởi tạo. Giải thích thêm về cách hoạt động của điều này nằm ngoài phạm vi cho câu trả lời này. Điều này cung cấp một cái nhìn sâu sắc ngắn gọn về cách nó hoạt động.

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

Đây là cách khởi tạo a MediaPlayer. MediaPlayer tuân theo Mẫu thiết kế phương pháp nhà máy tĩnh . Để lấy một thể hiện, chúng tôi gọi create()phương thức của nó và chuyển cho nó ngữ cảnh và Id tài nguyên của âm thanh mà chúng tôi muốn phát, trong trường hợp này R.raw.soho. Chúng tôi tuyên bố nó là final. Jon Skeet đã cung cấp một lời giải thích tuyệt vời về lý do tại sao chúng tôi làm như vậy ở đây .

one.setOnClickListener(new OnClickListener(){

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

Cuối cùng, chúng tôi đặt những gì nút đã khởi tạo trước đó của chúng tôi sẽ thực hiện. Phát âm thanh khi nhấp vào nút! Để làm điều này, chúng tôi đặt OnClickListenernút của chúng tôi one. Bên trong chỉ có một phương pháp, onClick()chứa các hướng dẫn mà nút phải thực hiện khi nhấp .

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

Để phát âm thanh, chúng tôi gọi MediaPlayer start() phương pháp . Phương pháp này bắt đầu phát lại âm thanh.

Ở đó, bây giờ bạn có thể phát âm thanh khi nhấp vào nút trong Android!


Phần thưởng:

Như đã lưu ý trong bình luận bên dưới Cảm ơn Langusten Gustel! và như được khuyến nghị trong Tài liệu tham khảo dành cho nhà phát triển Android , điều quan trọng là gọi release()phương thức để giải phóng các tài nguyên sẽ không còn được sử dụng nữa. Thông thường, điều này được thực hiện sau khi âm thanh được phát đã hoàn tất quá trình phát. Để làm như vậy, chúng tôi thêm một OnCompletionListenervào tương tự như vậy của chúng tôi mp :

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

Bên trong onCompletionphương thức, chúng tôi phát hành nó như sau:

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

Rõ ràng là có nhiều cách tốt hơn để thực hiện điều này. Ví dụ: bạn có thể đặt MediaPlayer thành một biến lớp và xử lý vòng đời của nó cùng với vòng đời của Fragmenthoặc Activitysử dụng nó. Tuy nhiên, đây là một chủ đề cho một câu hỏi khác. Để giữ phạm vi nhỏ của câu trả lời này, tôi đã viết nó chỉ để minh họa cách phát âm thanh khi nhấp vào nút trong Android .


Bài gốc

Đầu tiên. Bạn nên đặt các câu lệnh của mình bên trong một khối và trong trường hợp này là phương thức onCreate.

Thứ hai. Bạn đã khởi tạo nút dưới dạng một biến , sau đó bạn sử dụng một biến 0 và đặt onClickListener của nó thành onClickListener không hoàn chỉnh. Sử dụng biến một cho setOnClickListener.

Thứ ba, đặt logic để phát âm thanh bên trong onClick.

Tóm tắt:

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
Và nhân tiện, one.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {mp.start ();}}); Đừng bỏ lỡ điều đó!
Auto-Droid ツ

7
RELEASE
đừng

38

Đã kiểm tra và hoạt động 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(); }
            }
        });
    }
}

Đây là tất cả những gì chúng tôi phải làm

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

Điều này cũng hoạt động khi phát lại âm thanh. Khi phát âm thanh, tôi nghĩ mp.start () sẽ hoạt động mà không cần khối try / catch và if.
khwilo

37

Cách tốt nhất để làm điều này là ở đây tôi đã tìm thấy sau khi tìm kiếm hết vấn đề này đến vấn đề khác trong 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();

Việc không phát hành Trình phát đa phương tiện sẽ cho bạn lỗi này trong LogCat:

Android: MediaPlayer đã hoàn thiện mà không được phát hành

Không đặt lại trình phát Đa phương tiện sẽ cho bạn lỗi này trong LogCat:

Android: mediaplayer biến mất với các sự kiện không được xử lý

Vì vậy, hãy chơi mã an toàn và đơn giản để sử dụng trình phát đa phương tiện.

Để phát nhiều âm thanh trong cùng Hoạt động / Phân đoạn, chỉ cần thay đổi resID trong khi tạo Trình phát đa phương tiện mới như

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

và chơi nó!

Chúc vui vẻ!


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

Dưới đây là kết quả, một lần nữa không có gì làm việc dropbox.com/s/9xb0lzesp0ibx9z/2.jpg
Dmitry

Bạn không cần dòng mp = new MediaPlayer () vì bạn đang khởi tạo lại nó bằng MediaPlayer.create (...) trên dòng tiếp theo.
Keale

6
  • Âm thanh phải được đặt trong raw thư mục, nếu nó không tồn tại, hãy tạo một.
  • Thư mục thô phải nằm trong thư mục res
  • Tên không được có bất kỳ -hoặc ký tự đặc biệt nào trong đó.

Trong hoạt động của bạn, bạn cần có một đối tượng MediaPlayer, bên trong onCreatephương thức hoặc onclickphương thức, bạn phải khởi tạo MediaPlayer, chẳng hạn như MediaPlayer.create(this, R.raw.name_of_your_audio_file), sau đó tệp âm thanh của bạn sẵn sàng được phát với lệnh gọi start(), trong trường hợp của bạn, vì bạn muốn nó được đặt trong một nút, bạn sẽ phải đặt nó bên trongonClick phương thức.

Thí dụ:

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

có một số âm thanh được xác định trước: SHUTTER_CLICK, FOCUS_COMPLETE, START_VIDEO_RECORDING, STOP_VIDEO_RECORDING.

Đẹp!

MediaActionSound

Một lớp để tạo ra âm thanh khớp với âm thanh được tạo ra bởi các hành động khác nhau được thực hiện bởi các API máy ảnh và phương tiện. Docs

sử dụng như:

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

Hãy thử cái này tôi nghĩ nó sẽ hoạt động


1
public class MainActivity extends AppCompatActivity {

    public void clickMe (View view) {

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

    }

tạo một nút bằng một phương thức có thể được gọi khi nhấn nút (onCreate),

sau đó tạo một biến cho lớp (MediaPlayer) với đường dẫn của tệp của bạn

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

cuối cùng chạy phương thức bắt đầu trong lớp đó

mp.start();

tệp sẽ chạy khi nhấn nút, hy vọng điều này hữu ích!


3
Chào mừng bạn đến với Stack Overflow! Sẽ tốt hơn nếu bạn thêm một số giải thích và nhận xét vào mã của mình để người đọc trong tương lai có thể học hỏi từ bạn.
Mehdi Bounya

1

Thay vì đặt lại nó như đề xuất của DeathRs:

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

chúng ta chỉ có thể đặt lại MediaPlayer để nó bắt đầu sử dụng:

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

1

Tất cả những giải pháp này "nghe có vẻ hay và hợp lý nhưng có một nhược điểm lớn. Điều gì xảy ra nếu khách hàng của bạn tải xuống ứng dụng của bạn và liên tục nhấn vào nút của bạn?

Của bạn MediaPlayerĐôi khi, âm thanh sẽ không phát được nếu bạn nhấp vào nút nhiều lần.

Tôi đã gặp phải vấn đề hiệu suất này với MediaPlayerlớp một vài ngày trước.

MediaPlayerlớp tiết kiệm để sử dụng? Không phải luôn luôn. Nếu bạn có âm thanh ngắn, tốt hơn là sử dụng SoundPoollớp học.

Một giải pháp tiết kiệm và hiệu quả là lớp SoundPool cung cấp các tính năng tuyệt vời và tăng hiệu suất cho ứng dụng của bạn.

SoundPool không dễ sử dụng như MediaPlayer lớp học nhưng có một số lợi ích tuyệt vời khi nói đến hiệu suất và độ tin cậy.

Theo liên kết này và tìm hiểu cách sử dụng lớp SoundPool trong ứng dụng của bạn:

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

Youtube: Giải pháp Tiết kiệm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.