2013年4月28日 星期日

[Android] 撥放音效(play audio)

1.撥放音效第一個步驟,需要新建一個資料夾存放音效檔。
路徑為res/raw/xxx.wav(或xxx.mp3)。

2.在主程式裡要先開啟一個audio的服務,主要是用來管理音量,鈴聲模式及聲道等...
其次則需new SoundPool,主要是用來載入,撥放及停止音效等功能。
我們直接來看codes

MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class MainActivity extends Activity {

 private Button bPlay;
 private Button bPause;
 private SoundPool spool;
 private int sourceid;

 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  bPlay = (Button) findViewById(R.id.btnPlay);
  bPause = (Button) findViewById(R.id.btnPause);
  // 聲音庫的最大音頻流數目為10,聲音品質為5
  spool = new SoundPool(10, AudioManager.STREAM_MUSIC, 5);
  sourceid = spool.load(this, R.raw.harm, 1);

  bPlay.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {

    playSud(0);
   }
  });

  bPause.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {

    spool.pause(sourceid);
   }
  });
 }

 public void playSud(int repeatTime) {
  AudioManager am = (AudioManager) getApplicationContext()
    .getSystemService(Context.AUDIO_SERVICE);
  // 獲取最大音量

  float audMaxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// 左右聲道值範圍為 0.0 - 1.0
  float volRatio = audCurrentVolumn / audMaxVolumn; 

 // 獲取目前音量
  float audCurrentVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);
  
  // 播放音頻,左右音量,設置優先級,重撥次數,速率(速率最低0.5,最高為2,1代表正常速度)
  spool.play(sourceid, volRatio, volRatio, 1, repeatTime, 1);
 }
}

3.Layout的部分很簡單,加人撥放和暫停二個按鈕
res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btnPlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="99dp"
        android:text="撥放(Play)" />

    <Button
        android:id="@+id/btnPause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:text="暫停(Pause)" />
 
</RelativeLayout>

另外一個簡單的方法,也可以達到同樣的結果
這個方法直接讀取預設通知(default notification)的鈴聲來撥放
設定的路徑是為(設定>音效>預設通知)
 Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
 Ringtone ringTone = RingtoneManager.getRingtone(getApplicationContext(), notification);
        ringTone.play();

沒有留言:

張貼留言