android開發(fā)之蜂鳴提示音和震動提示的實現原理與參考代碼
更新時間:2013年01月18日 17:50:14 作者:
蜂鳴提示音和震動提示此功能在手機使用中很實用,最近在讀zxing項目,學到了不少東西;我們一起來看看他是怎么做的,感興趣的朋友可以了解下哦
最近在讀zxing項目,學到了不少東西。推薦大家也讀讀。里面有個BeepManager類,實現一個蜂鳴音和震動的實現。我們一起來看看他是怎么做的:
蜂鳴
1.準備一個 音頻文件 比如:beep.ogg。 ogg格式是聲音壓縮格式的一種,類似mp3這樣。我們準備播放它,就產生了蜂鳴的效果。
2.為activity注冊的默認 音頻通道 。
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
這里聲明為 STREAM_MUSIC的通道,就是多媒體播放,注冊后,我們使用 手機上的音量大小鍵就可以調節(jié)播放的聲音大小。
如果不設定這個通道的話,我們的這個activity默認音量按鈕處理將作用于 手機鈴音的大小。
3.檢查當前的 鈴音模式,或者成為 情景模式。
說明:getRingerMode() ——返回當前的鈴聲模式。如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(靜音)、RINGER_MODE_VIBRATE(震動)
//如果當前是鈴音模式,則繼續(xù)準備下面的 蜂鳴提示音操作,如果是靜音或者震動模式。就不要繼續(xù)了。因為用戶選擇了無聲的模式,我們就也不要出聲了。
AudioManager audioService = (AudioManager) activity
.getSystemService(Context.AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
shouldPlayBeep = false;
}
4.初始化MediaPlayer對象,指定播放的聲音 通道為 STREAM_MUSIC,這和上面的步驟一致,指向了同一個通道?! ediaPlayer 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指代從 第幾個索引(第一個數組參數) 的位置開始循環(huán)震動。
//會一直保持循環(huán),我們需要用 vibrator.cancel()主動終止
//vibrator.vibrate(new long[]{300,500},0);
}
}
蜂鳴
1.準備一個 音頻文件 比如:beep.ogg。 ogg格式是聲音壓縮格式的一種,類似mp3這樣。我們準備播放它,就產生了蜂鳴的效果。
2.為activity注冊的默認 音頻通道 。
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
這里聲明為 STREAM_MUSIC的通道,就是多媒體播放,注冊后,我們使用 手機上的音量大小鍵就可以調節(jié)播放的聲音大小。
如果不設定這個通道的話,我們的這個activity默認音量按鈕處理將作用于 手機鈴音的大小。
3.檢查當前的 鈴音模式,或者成為 情景模式。
說明:getRingerMode() ——返回當前的鈴聲模式。如RINGER_MODE_NORMAL(普通)、RINGER_MODE_SILENT(靜音)、RINGER_MODE_VIBRATE(震動)
復制代碼 代碼如下:
//如果當前是鈴音模式,則繼續(xù)準備下面的 蜂鳴提示音操作,如果是靜音或者震動模式。就不要繼續(xù)了。因為用戶選擇了無聲的模式,我們就也不要出聲了。
AudioManager audioService = (AudioManager) activity
.getSystemService(Context.AUDIO_SERVICE);
if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
shouldPlayBeep = false;
}
4.初始化MediaPlayer對象,指定播放的聲音 通道為 STREAM_MUSIC,這和上面的步驟一致,指向了同一個通道?! ediaPlayer 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指代從 第幾個索引(第一個數組參數) 的位置開始循環(huán)震動。
//會一直保持循環(huán),我們需要用 vibrator.cancel()主動終止
//vibrator.vibrate(new long[]{300,500},0);
}
}
相關文章
Android中EditText屏蔽第三方輸入法表情的方法示例
最近在工作終于遇到一個問題,因為第三方輸入法表情的問題導致Android中TextView的內容顯示異常,只能想辦法解決了,下面這篇文章主要記錄了在處理Android中EditText屏蔽第三方輸入法表情的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01Android Socket服務端與客戶端用字符串的方式互相傳遞圖片的方法
這篇文章主要介紹了Android Socket服務端與客戶端用字符串的方式互相傳遞圖片的方法的相關資料,需要的朋友可以參考下2016-05-05