編輯:關於Android編程
用Soundpool可以播一些短的反應速度要求高的聲音, 比如游戲中的爆破聲,
而Mediaplayer適合播放長點的。 MediaRecorder主要用來錄音。
SoundPool載入音樂文件使用了獨立的線程,不會阻塞UI主線程的操作。
但是這裡如果音效文件過大沒有載入完成,我們調用play方法時可能產生嚴重的後果,
這裡AndroidSDK提供了一個SoundPool.OnLoadCompleteListener類來幫助我們了解媒體文件是否載入完成,
我們重載onLoadComplete(SoundPool soundPool, int sampleId, int status) 方法即可獲得。
sampleId
the sample ID of the sound loaded.
status
the status of the load operation (0 = success)
從上面的onLoadComplete方法可以看出該類有很多參數,
比如類似id,SoundPool在load時可以處理多個媒體一次初始化並放入內存中,
這裡效率比MediaPlayer高了很多。
SoundPool類支持同時播放多個音效,這對於游戲來說是十分必要的,
而MediaPlayer類是同步執行的只能一個文件一個文件的播放。
創建:
public SoundPool(int maxStream, intstreamType, int srcQuality)
maxStream —— 同時播放的流的最大數量
streamType —— 流的類型,一般為STREAM_MUSIC(具體在AudioManager類中列出)
srcQuality —— 采樣率轉化質量,當前無效果,使用0作為默認值
eg:
SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC,0);
創建了一個最多支持3個流同時播放的,類型標記為音樂的SoundPool。
一般把多個聲音放到HashMap中去,比如
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC,100);
soundPoolMap = new HashMap
soundPoolMap.put(1, soundPool.load(this, R.raw.dingdong,1));
加載:
int load(Context context, intresId, int priority) //從APK資源載入
int load(FileDescriptor fd, long offset, long length, intpriority) //從FileDescriptor對象載入
int load(AssetFileDescriptor afd, int priority) //從Asset對象載入
int load(String path, int priority) //從完整文件路徑名載入
最後一個參數為優先級。
播放:
play(int soundID, float leftVolume, float rightVolume, int priority, int loop,float rate) ,
其中leftVolume和rightVolume表示左右音量,priority表示優先級,loop表示循環次數,rate表示速率,
如
//速率最低0.5最高為2,1代表正常速度
sp.play(soundId, 1, 1, 1, 0, 1.0f);
而停止則可以使用 pause(int streamID) 方法,
這裡的streamID和soundID均在構造SoundPool類的第一個參數中指明了總數量,而id從0開始。
獲取audioManager對象
AudioManager mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);
播放音效
mAudioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
一般AudioManager在OnResume和OnStop方法需進行如下處理:
// Get ready to play sound effects @Override protected void onResume() { super.onResume(); mAudioManager.setSpeakerphoneOn(true); mAudioManager.loadSoundEffects(); } // Release resources & clean up @Override protected void onPause() { if (null != mSoundPool) { mSoundPool.unload(mSoundId); mSoundPool.release(); mSoundPool = null; } mAudioManager.setSpeakerphoneOn(false); mAudioManager.unloadSoundEffects(); super.onPause(); }
開啟錄音:
private static final String mFileName = Environment .getExternalStorageDirectory().getAbsolutePath() + "/audiorecordtest.3gp"; private void startRecording() { mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setOutputFile(mFileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { Log.e(TAG, "Couldn't prepare and start MediaRecorder"); } mRecorder.start(); }
關閉錄音:
private void stopRecording() { if (null != mRecorder) { mRecorder.stop(); mRecorder.release(); mRecorder = null; } }
MediaRecorder中的setAudioSource()方法設置聲音來源,一般傳入MediaRecorder.AudioSource.MIC指定錄制來自麥克風的聲音。
setOutputFormat設置錄制音頻文件的格式。(注意必須在設置編碼格式之前設置,否則會拋出異常)
setAudioEncoder設置編碼格式
setAudioEncodingBitRate(int bitRate)設置編碼位率
setAudioSamplingRate(int samplingRate)設置采樣率
setOutputFile(String path)設置音頻文件的保存位置
然後prepare(),start() 開始播放
stop(),release() 停止播放,釋放資源
MediaPlayer
Android支持有限數量的同步Media Player對象,如果不釋放它們,將會在系統耗盡資源時導致ANR
因此,完成播放時調用mediaPlay.release()方法釋放相關資源。
//從一個包資源加載音頻
MediaPlayerresourcePlayer = MediaPlayer.create(this, R.raw.my_audio);
//從一個本地文件加載音頻
MediaPlayer resourcePlayer= MediaPlayer.create(this, Uri.parse("file:///sdcard/localfile.mp3"));
//從一個在線資源加載音頻
MediaPlayer resourcePlayer= MediaPlayer.create(this, Uri.parse(URL));
//從一個Content Provider加載音頻常用方法
mediaPlayer.start()
mediaPlayer.stop()
mediaPlayer.pause()
//調節左右聲道音量 0~1之間的浮點數 0是靜音 1是最大
mediaPlayer.setVolume(0.5f,0.5f)
//強制屏幕常亮
mediaPlayer.setScreenOnWhilePlaying(true)
//循環播放
If(!mediaPlayer.isLooping()){
mediaPlayer.setLooping(true);
}
示例代碼:
播放音樂並震動: mediaPlayer = new MediaPlayer(); vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); long[] pattern = { 1000, 200, 200, 200 }; vibrator.vibrate(pattern, 0); try { mediaPlayer.setVolume(1.0f, 1.0f); mediaPlayer.setDataSource(this, Uri); mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); mediaPlayer.setLooping(true); mediaPlayer.prepare(); mediaPlayer.start(); } catch (Exception e) { mediaPlayer.release(); }
播放鈴聲RingStone:
種類包括:
RingtoneManager.TYPE_RINGTONE
RingtoneManager.TYPE_NOTIFICATION
RingtoneManager.TYPE_ALARM
示例:
Uri ringtoneUri = RingtoneManager .getDefaultUri(RingtoneManager.TYPE_RINGTONE); playRingtone(RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)); // Shut off current Ringtone and play new one private void playRingtone(Ringtone newRingtone) { if (null != mCurrentRingtone && mCurrentRingtone.isPlaying()) mCurrentRingtone.stop(); mCurrentRingtone = newRingtone; if (null != newRingtone) { mCurrentRingtone.play(); } }
在沒介紹正文之前先給大家說下poi是什麼意思。由於工作的關系,經常在文件中會看到POI這三個字母的縮寫,但是一直對POI的概念和含義沒有很詳細的去研究其背後代表的意思。今
最近在翻以前寫的代碼,翻到幾個月以前做的一個仿雷達掃描的效果,現在拿出來和大家分享一下,在進入分析和代碼之前,我們先來看看效果吧,…錄屏質量較差,湊活著看吧
1.view的滑動,六種滑動方式:一:通過layout來實現滑動效果package com.example.testdragview;import android.con
配置前gradle文件內容: 配置完成gradle文件內容: 接下來正式開始啦~一、打開配置頁面,按照一下順序操作,myconfig只是我隨意取得一個名字,可以根據自己喜