Android開(kāi)發(fā)(20)蜂鳴提示音和震動(dòng)

概述

最近在讀zxing項(xiàng)目,學(xué)到了不少東西。推薦大家也讀讀。里面有個(gè)BeepManager類(lèi),實(shí)現(xiàn)一個(gè)蜂鳴音和震動(dòng)的實(shí)現(xiàn)。

蜂鳴

  1. 準(zhǔn)備一個(gè) 音頻文件 比如:beep.ogg。 ogg格式是聲音壓縮格式的一種,類(lèi)似mp3這樣。我們準(zhǔn)備播放它,就產(chǎn)生了蜂鳴的效果。
  2. 為activity注冊(cè)的默認(rèn) 音頻通道 。
    activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);

這里聲明為 STREAM_MUSIC的通道,就是多媒體播放,注冊(cè)后,我們使用 手機(jī)上的音量大小鍵就可以調(diào)節(jié)播放的聲音大小。

如果不設(shè)定這個(gè)通道的話,我們的這個(gè)activity默認(rèn)音量按鈕處理將作用于 手機(jī)鈴音的大小。

3.檢查當(dāng)前的 鈴音模式,或者成為 情景模式。

說(shuō)明:getRingerMode() ——返回當(dāng)前的鈴聲模式。如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(靜音)、RINGER_MODE_VIBRATE(震動(dòng))

//如果當(dāng)前是鈴音模式,則繼續(xù)準(zhǔn)備下面的 蜂鳴提示音操作,如果是靜音或者震動(dòng)模式。就不要繼續(xù)了。因?yàn)橛脩暨x擇了無(wú)聲的模式,我們就也不要出聲了。

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

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

  MediaPlayer mediaPlayer = new MediaPlayer();
      
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  注冊(cè)事件。當(dāng)播放完畢一次后,重新指向流文件的開(kāi)頭,以準(zhǔn)備下次播放。

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

設(shè)定數(shù)據(jù)源,并準(zhǔn)備播放

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.開(kāi)始播放

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

震動(dòng)

1.聲明權(quán)限

在AndroidManifest.xml 里寫(xiě)

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

2.獲得震動(dòng)服務(wù)。

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

3.啟動(dòng)震動(dòng)。

  vibrator.vibrate(VIBRATE_DURATION);
  public void playBeepSoundAndVibrate() {
    if (enableVibrate) {
        Vibrator vibrator = (Vibrator) activity
                .getSystemService(Context.VIBRATOR_SERVICE);
        //震動(dòng)一次
        vibrator.vibrate(VIBRATE_DURATION);
        //第一個(gè)參數(shù),指代一個(gè)震動(dòng)的頻率數(shù)組。每?jī)蓚€(gè)為一組,每組的第一個(gè)為等待時(shí)間,第二個(gè)為震動(dòng)時(shí)間。
        //        比如  [2000,500,100,400],會(huì)先等待2000毫秒,震動(dòng)500,再等待100,震動(dòng)400
        //第二個(gè)參數(shù),repest指代從 第幾個(gè)索引(第一個(gè)數(shù)組參數(shù)) 的位置開(kāi)始循環(huán)震動(dòng)。
        //會(huì)一直保持循環(huán),我們需要用 vibrator.cancel()主動(dòng)終止
        //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開(kāi)源項(xiàng)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容