.:: CODE SNIPPET ::.

"Your time is limited, so don't waste it living someone else's life"

Sử dụng SoundPool để phát âm thanh trong android


Trong bài này, mình sẽ nói về phương pháp dùng các hàm cơ bản để tạo lớp quản lý âm thanh. Lớp này hoạt động tốt khi bạn cần một chương trình nhỏ hoặc một game nhỏ thôi. Lớp này sử dụng để trình diễn âm thanh sử dụng SoundPool. Bạn nên sử dụng file âm thanh dạng *.ogg hoặc *.wav nhé.
Đầu tiên chúng ta cần làm là tạo ra lớp SoundManager quản lý các âm thanh cần sử dụng cho chương trình:

package com.camera.ocruit;

import java.util.HashMap;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class SoundManager {

	private SoundPool mSoundPool;
	private HashMap<Integer, Integer> mSoundPoolMap;
	private AudioManager mAudioManager;
	private Context mContext;

	public SoundManager() {

	}

	public void initSounds(Context theContext) {
		mContext = theContext;
		mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
		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 void playSound(int index) {

		int streamVolume = mAudioManager
				.getStreamVolume(AudioManager.STREAM_MUSIC);
		mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume,
				1, 0, 1f);
	}

	public void playLoopedSound(int index) {

		int streamVolume = mAudioManager
				.getStreamVolume(AudioManager.STREAM_MUSIC);
		mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume,
				1, -1, 1f);
	}

}

Cách sử dụng vào chương trình thì cực kỳ đơn giản,hi. Sau đây là một ví dụ nhé.

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

public class Tutorial extends Activity {
    private SoundManager mSoundManager;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mSoundManager = new SoundManager();
        mSoundManager.initSounds(getBaseContext());
        mSoundManager.addSound(1, R.raw.beep8);
        mSoundManager.addSound(2, R.raw.sound);
        Button SoundButton = (Button)findViewById(R.id.Button);
        SoundButton.setOnClickListener(new OnClickListener() {
        	
        	public void onClick(View v) {
        		mSoundManager.playSound(1);
        		      		
        	}
        });
        
        Button btn=(Button)findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mSoundManager.playSound(2);
			}
		});
    }
}

Chương trình cần một layout như sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Play Sound" >
    </Button>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

Các bạn nhớ thả hai file âm thanh vào trong thư mục res/raw/
Các bạn có thể download code tại đây trong đó các file âm thanh luôn nhé
password: hoangminhuit

Advertisements

15 responses to “Sử dụng SoundPool để phát âm thanh trong android

  1. Pingback: My Homepage

  2. Gregoria Barabas November 21, 2012 at 10:33 PM

    Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. Seo Plugin

  3. Hoàng Minh November 23, 2012 at 6:47 PM

    thank you so much!

  4. Chôm Chôm Nhố Nhí December 9, 2012 at 11:41 PM

    anh có thể giải thích thêm về code cho em biết được không (Comment)

  5. Hoàng Minh December 10, 2012 at 9:32 AM

    Chôm Chôm Nhố Nhí :
    anh có thể giải thích thêm về code cho em biết được không (Comment)

    Bạn có thể nói bạn cần giải thích chỗ nào không vậy ? Phần SoundManager hay là phần Turorial activity?

  6. Chôm Chôm Nhố Nhí December 11, 2012 at 1:01 AM

    Hoàng Minh :

    Chôm Chôm Nhố Nhí :
    anh có thể giải thích thêm về code cho em biết được không (Comment)

    Bạn có thể nói bạn cần giải thích chỗ nào không vậy ? Phần SoundManager hay là phần Turorial activity?

    Phần SoundManager đó anh Minh em đang bắt đầu tìm hiểu về android nên mấy lệnh đó chưa biết cụ thể chức năng nó là làm gì

  7. Hoàng Minh December 11, 2012 at 9:12 AM

    Ở đây, khi bạn new một SoundPool thì bạn thấy có các giá trị như:
    int maxStreams: là số âm thanh tối đa mà bạn có thể dùng SoundPool này để phát cùng một thời điểm.
    int streamType: là loại stream, cái này do cái AudioManager quyết định, bạn có thể chọn STREAM_MUSIC là được rồi.
    int srcQuality: đầy là chất lượng của âm thanh nguồn của bạn, khi bạn khai báo thì âm thanh sẽ được convert sang chất lượng này, nếu muốn để như âm thanh bạn đưa vào thì để số 0
    Tiếp theo là bạn có một AudioManager được tạo ra từ dịch vụ của hệ thống bằng cách gọi hàm getSystemService(Context.AUDIO_SERVICE); (đây là một trong rất nhiều những dịch vụ hệ thống như: ALARM_SERVICE, ACTIVITY_SERVICE, LOCATION_SERVICE,….) AudioManager giúp truy xuất vào phần cứng để điều khiển như điều chỉnh volume, rồi điều khiển nhạc chuông này nọ. Ban tìm hiểu thêm phần này tại đây nhé
    Sau đó bạn có một HashMap để có thể ánh xạ từ những con số int sang các file âm thanh bạn đang có như: số 1 là audio1.ogg, số 2 là audio2.wav,…. Để đưa âm thanh vào HashMap này, bạn thông qua hàm addSound nhé (hàm này dễ hiểu mà)
    Còn lại là bạn có hai chế độ phát âm thanh, là phát 1 lần và phát âm lập đi lập lại
    Còn gì thảo luận nữa thì bạn cứ comment nhé.

  8. Chôm Chôm Nhố Nhí December 12, 2012 at 2:10 PM

    Hoàng Minh :
    Ở đây, khi bạn new một SoundPool thì bạn thấy có các giá trị như:
    int maxStreams: là số âm thanh tối đa mà bạn có thể dùng SoundPool này để phát cùng một thời điểm.
    int streamType: là loại stream, cái này do cái AudioManager quyết định, bạn có thể chọn STREAM_MUSIC là được rồi.
    int srcQuality: đầy là chất lượng của âm thanh nguồn của bạn, khi bạn khai báo thì âm thanh sẽ được convert sang chất lượng này, nếu muốn để như âm thanh bạn đưa vào thì để số 0
    Tiếp theo là bạn có một AudioManager được tạo ra từ dịch vụ của hệ thống bằng cách gọi hàm getSystemService(Context.AUDIO_SERVICE); (đây là một trong rất nhiều những dịch vụ hệ thống như: ALARM_SERVICE, ACTIVITY_SERVICE, LOCATION_SERVICE,….) AudioManager giúp truy xuất vào phần cứng để điều khiển như điều chỉnh volume, rồi điều khiển nhạc chuông này nọ. Ban tìm hiểu thêm phần này tại đây nhé
    Sau đó bạn có một HashMap để có thể ánh xạ từ những con số int sang các file âm thanh bạn đang có như: số 1 là audio1.ogg, số 2 là audio2.wav,…. Để đưa âm thanh vào HashMap này, bạn thông qua hàm addSound nhé (hàm này dễ hiểu mà)
    Còn lại là bạn có hai chế độ phát âm thanh, là phát 1 lần và phát âm lập đi lập lại
    Còn gì thảo luận nữa thì bạn cứ comment nhé.

    cảm ơn anh Minh em hiểu được một chút rồi
    vậy mình có thể làm thêm một button Pause được không anh

  9. Hoàng Minh December 12, 2012 at 6:16 PM

    Dĩ nhiên là được rồi, chỉ cần trong trong SoundManager bạn thêm vào một hàm giúp dừng như sau:
    public void pause(){
    mSoundPool.pause(streamID);
    }
    Trong đó, cái streamID là biến trả về khi gọi hàm mSoundPool.play()
    Chú ý: mỗi lần play một âm thanh (cho dù là cùng một file âm thanh) thì hàm play sẽ trả về cho bạn một giá trị int khác nhau. Vì vậy để xác định được là bạn muốn dừng file âm thanh nào, thì bạn hãy nghĩ ra một cách của riêng mình nhé, nếu không được thì bạn hãy comment rùi mình sẽ suggest cho bạn một cách.

  10. Chôm Chôm Nhố Nhí December 12, 2012 at 11:10 PM

    cảm ơn anh rất nhiều

  11. Hoàng Minh December 13, 2012 at 12:09 AM

    Không có chi, có gì thì cứ thảo luận tiếp heng.

  12. Anonymous April 25, 2013 at 7:42 PM

    Em đang làm 1 bài tập nhỏ! nhắc nhở, nhưng k biết cài đặt âm thanh vào như nào. kiểu hẹn giờ.! Hoàng Minh chỉ giúp E được k?

  13. Hoàng Minh April 26, 2013 at 9:05 AM

    Cái này thì liên quan đến việc sử dụng Service trong Android rồi, nếu bạn đã cài đặt service rồi thì việc thêm vào sound mình nghĩ chắc không thành vấn đề chứ

  14. thanh December 3, 2014 at 8:56 PM

    Con số 4 là gì vậy bạn… bạn giai thích ý nghĩa từng phương thức được không… mình mới tập làm nên không hiểu rõ lắm…:)

  15. Minh Trần December 3, 2014 at 11:36 PM

    so 4 la mot so integer bat ky xác định số stream tối đa mà SoundPool này có thể tạo ra cùng lúc. Nói dễ hiểu kiểu như bạn có thể play 1 âm thanh nào đó 4 lần cùng 1 lúc. Các phương thức thì bao gồm thêm 1 âm thanh, perform, loop khá rõ ràng mà. Cần gì thì feedback nhé.

    Bài này mình post cũng lâu rồi, tùy mục đich sử dụng mà bạn có thể dùng thêm MediaPlayer của android, nó dễ dàng implement hơn rất nhiều.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: