天天看點

Android開發(20)蜂鳴提示音和震動概述蜂鳴震動參考:

概述

最近在讀zxing項目,學到了不少東西。推薦大家也讀讀。裡面有個BeepManager類,實作一個蜂鳴音和震動的實作。

蜂鳴

  1. 準備一個 音頻檔案 比如:beep.ogg。 ogg格式是聲音壓縮格式的一種,類似mp3這樣。我們準備播放它,就産生了蜂鳴的效果。
  2. 為activity注冊的預設 音頻通道 。

    activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);

這裡聲明為 STREAM_MUSIC的通道,就是多媒體播放,注冊後,我們使用 手機上的音量大小鍵就可以調節播放的聲音大小。

如果不設定這個通道的話,我們的這個activity預設音量按鈕處理将作用于 手機鈴音的大小。

3.檢查目前的 鈴音模式,或者成為 情景模式。

說明:getRingerMode() ——傳回目前的鈴聲模式。如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(靜音)、RINGER_MODE_VIBRATE(震動)

//如果目前是鈴音模式,則繼續準備下面的 蜂鳴提示音操作,如果是靜音或者震動模式。就不要繼續了。因為使用者選擇了無聲的模式,我們就也不要出聲了。

AudioManager audioService = (AudioManager) activity
.getSystemService(Context.AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
    shouldPlayBeep = false;
}           

複制

4.初始化MediaPlayer對象,指定播放的聲音 通道為 STREAM_MUSIC,這和上面的步驟一緻,指向了同一個通道。

MediaPlayer mediaPlayer = new MediaPlayer();
      
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  注冊事件。當播放完畢一次後,重新指向流檔案的開頭,以準備下次播放。

  // When the beep has finished playing, rewind to queue up another one.

mediaPlayer
    .setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer player) {
    player.seekTo(0);
    }
});           

複制

設定資料源,并準備播放

AssetFileDescriptor file = activity.getResources().openRawResourceFd(
R.raw.beep);
try {
    mediaPlayer.setDataSource(file.getFileDescriptor(),
    file.getStartOffset(), file.getLength());
    file.close();
    mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
    mediaPlayer.prepare();
} catch (IOException ioe) {
    Log.w(TAG, ioe);
    mediaPlayer = null;
}
return mediaPlayer;           

複制

5.開始播放

if (playBeep && mediaPlayer != null) {
    mediaPlayer.start();
  }           

複制

震動

1.聲明權限

在AndroidManifest.xml 裡寫

<uses-permission android:name="android.permission.VIBRATE"/>           

複制

2.獲得震動服務。

Vibrator vibrator = 
    (Vibrator)     activity.getSystemService(Context.VIBRATOR_SERVICE);           

複制

3.啟動震動。

vibrator.vibrate(VIBRATE_DURATION);
  public void playBeepSoundAndVibrate() {
    if (enableVibrate) {
        Vibrator vibrator = (Vibrator) activity
                .getSystemService(Context.VIBRATOR_SERVICE);
        //震動一次
        vibrator.vibrate(VIBRATE_DURATION);
        //第一個參數,指代一個震動的頻率數組。每兩個為一組,每組的第一個為等待時間,第二個為震動時間。
        //        比如  [2000,500,100,400],會先等待2000毫秒,震動500,再等待100,震動400
        //第二個參數,repest指代從 第幾個索引(第一個數組參數) 的位置開始循環震動。
        //會一直保持循環,我們需要用 vibrator.cancel()主動終止
        //vibrator.vibrate(new long[]{300,500},0);
        
    }
}           

複制

參考:

http://www.linuxidc.com/Linux/2011-08/41276.htm

http://www.linuxidc.com/Linux/2012-04/57903.htm

http://blog.csdn.net/barnett_zhubo/article/details/6731659

http://www.cnblogs.com/j-turn/archive/2012/09/18/2690534.html

本代碼參考zxing開源項目