安卓平臺和聲音錄制與播放相關(guān)的主要是4個類:MediaRecorder,MediaPlayer,SoundPool,AudioRecord和AudioTrack。
-
MediaRecorder可以錄制視頻和音頻到文件 -
MediaPlayer可以播放視頻和音頻文件 -
SoundPool用于播放比較短的音頻片段 -
AudioRecord可以提供接口讀取音頻流數(shù)據(jù)(byte數(shù)組或者short數(shù)組) -
AudioTrack提供接口用于播放音頻流數(shù)據(jù)。
其中MediaRecorder和AudioRecord用于聲音錄制,SoundPool、MediaPlayer和AudioTrack用于聲音播放。AudioRecord和AudioTrack用于操作音頻流數(shù)據(jù),操作對象是byte數(shù)組(或者short數(shù)組),而MediaRecorder和MediaPlayer提供了經(jīng)過更高層抽象和封裝接口,直接對文件進行操作,而且他倆功能更豐富,同時支持音頻和視頻。
一、MediaRecorder

MediaRecorder的狀態(tài)簡述:
Initial:初始化。也就是MediaRecorder 剛被創(chuàng)建的時候。在這個時候我們?nèi)ピO(shè)置音頻或者視頻的來源了,可能這個時候就有人問了 音頻或者視頻的來源是什么意思,舉個例子吧,比如當(dāng)我們在錄音的時候,這個聲音的來源就可以設(shè)置成手機的麥克風(fēng)。
Initialized:初始化完成。這里我們已經(jīng)知道音頻或者視頻的來源了,在這里我們就可以設(shè)置一些輸出的屬性了,比如輸出文件的保存格式,編碼格式等。
DataSourceConfigured:數(shù)據(jù)源配置改變。也就是我們改變了一些輸出的屬性,就會進入到這個狀態(tài)。
Prepered:處于這個狀態(tài)就說明了我們的配置已經(jīng)完成了,現(xiàn)在準(zhǔn)備去錄制了。
Recordeing:錄制中。
Released:資源被釋放了。
Error:錄制的時候發(fā)生了錯誤。
主要方法:
setAudioChannels(int numChannels) 設(shè)置錄制的音頻通道數(shù)
setAudioEncoder(int audio_encoder) 設(shè)置audio的編碼格式
setAudioEncodingBitRate(int bitRate) 設(shè)置錄制的音頻編碼比特率
setAudioSamplingRate(int samplingRate) 設(shè)置錄制的音頻采樣率
setAudioSource(int audio_source) 設(shè)置用于錄制的音源
setAuxiliaryOutputFile(String path) 輔助時間的推移視頻文件的路徑傳遞
setAuxiliaryOutputFile(FileDescriptor fd)在文件描述符傳遞的輔助時間的推移視頻
setCamera(Camera c) 設(shè)置一個recording的攝像頭
setCaptureRate(double fps) 設(shè)置視頻幀的捕獲率
setMaxDuration(int max_duration_ms) 設(shè)置記錄會話的最大持續(xù)時間(毫秒)
setMaxFileSize(long max_filesize_bytes) 設(shè)置記錄會話的最大大小(以字節(jié)為單位)
setOutputFile(FileDescriptor fd) 傳遞要寫入的文件的文件描述符
setOutputFile(String path) 設(shè)置輸出文件的路徑
setOutputFormat(int output_format) 設(shè)置在錄制過程中產(chǎn)生的輸出文件的格式
setPreviewDisplay(Surface sv) 表面設(shè)置顯示記錄媒體(視頻)的預(yù)覽
setVideoEncoder(int video_encoder) 設(shè)置視頻編碼器,用于錄制
setVideoEncodingBitRate(int bitRate) 設(shè)置錄制的視頻編碼比特率
setVideoFrameRate(int rate) 設(shè)置要捕獲的視頻幀速率
setVideoSize(int width, int height) 設(shè)置要捕獲的視頻的寬度和高度
setVideoSource(int video_source) 開始捕捉和編碼數(shù)據(jù)到setOutputFile(指定的文件)
setLocation(float latitude, float longitude) 設(shè)置并存儲在輸出文件中的地理數(shù)據(jù)(經(jīng)度和緯度)
setProfile(CamcorderProfile profile) 指定CamcorderProfile對象
setOrientationHint(int degrees)設(shè)置輸出的視頻播放的方向提示
setOnErrorListener(MediaRecorder.OnErrorListener l)注冊一個用于記錄錄制時出現(xiàn)的錯誤的監(jiān)聽器
setOnInfoListener(MediaRecorder.OnInfoListener listener)注冊一個用于記錄錄制時出現(xiàn)的信息事件
getMaxAmplitude() 獲取在前一次調(diào)用此方法之后錄音中出現(xiàn)的最大振幅
prepare()準(zhǔn)備錄制。
release()釋放資源
reset()將MediaRecorder設(shè)為空閑狀態(tài)
start()開始錄制
stop()停止錄制
MediaRecorder主要配置參數(shù):
1、視頻編碼格式MediaRecorder.VideoEncoder
default,H263,H264,MPEG_4_SP,VP8
2、音頻編碼格式MediaRecorder.AudioEncoder
default,AAC,HE_AAC,AAC_ELD,AMR_NB,AMR_WB,VORBIS
3、視頻資源獲取方式MediaRecorder.VideoSource
default,CAMERA,SURFACE
4、音頻資源獲取方式MediaRecorder.AudioSource
defalut,camcorder,mic,voice_call,voice_communication,voice_downlink,voice_recognition, voice_uplink
5、資源輸出格式MediaRecorder.OutputFormat
amr_nb,amr_wb,default,mpeg_4,raw_amr,three_gpp,aac_adif, aac_adts, output_format_rtp_avp, output_format_mpeg2ts ,webm
實現(xiàn)錄音的一般步驟:
1、實例化MediaRecorder mr,調(diào)用構(gòu)造方法
2、初始化mr:mr.setAudioSource(MIC)/setVideoSource(CAMERA)
3、配置DataSource:設(shè)置輸出文件格式/路徑,編碼器等
4、準(zhǔn)備錄制:mr.prepare()
5、開始錄制:mr.start()
6、停止錄制:mr.stop()
7、釋放資源:mr.release()
注:2,3不可調(diào)換順序
添加權(quán)限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO">
二、MediaPlayer

1、當(dāng)一個MediaPlayer對象被創(chuàng)建或者調(diào)用reset()方法之后,它處于空閑狀態(tài),調(diào)用release()方法后處于結(jié)束狀態(tài)。
- 一個MediaPlayer對象調(diào)用了reset()方法后,再調(diào)用其它方法可能會觸發(fā)OnErrorListener.onError()事件,未調(diào)用reset()方法則不會觸發(fā)。
- 當(dāng)Mediaplayer對象不再被使用時,最好調(diào)用release()方法對其進行釋放,使其處于結(jié)束狀態(tài),此時它不能被使用
- Mediaplayer對象被創(chuàng)建時(調(diào)用構(gòu)造方法)處于空閑狀態(tài),若使用create()方法創(chuàng)建后則處于準(zhǔn)備狀態(tài)。
2、 一般情況下,一些常用的播放控制操作可能因為音頻、視頻的格式不被支持或者質(zhì)量較差以及流超時,也有可能由于開發(fā)者的疏忽使得Mediaplayer對象處于無效狀態(tài)等而導(dǎo)致錯誤。此時可通過注冊setOnErrorListener方法實現(xiàn)監(jiān)控。如果發(fā)生了錯誤,Mediaplayer對象將處于多霧狀態(tài),可以使用reset()方法來回復(fù)錯誤。
3、任何Mediaplayer對象都必須先處于準(zhǔn)備狀態(tài),然后才開始播放
4、要開始播放Mediaplayer對象都必須成功調(diào)用start()方法,可通過isPlaying()方法來檢測是否正在播放
5、當(dāng)Mediaplayer對象在播放時,可以進行暫停和停止操作,pause()方法暫停播放,stop()方法停止播放。處于暫停暫停時可通過start()方法恢復(fù)播放,但是處于停止?fàn)顟B(tài)時則必須先調(diào)用prepare()方法使其處于準(zhǔn)備狀態(tài),再調(diào)用start()方法。
主要方法:
-
實例化方式
使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
使用create的方式:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test); - 設(shè)置播放源
setDataSource(String path)//指定裝載path路徑所代表的文件。
setDataSource(Context context, Uri uri, Map<String, String headers)//指定裝載uri所代表的文件。
setDataSource(Context context, Uri uri)//指定裝載uri所代表的文件。
setDataSource(FileDescriptor fd, long offset, long length)//指定裝載fd所代表的文件中從offset開始長度為length的文件內(nèi)容。
setDataSource(FileDescriptor fd)//指定裝載fd所代表的文件。
- 配置播放參數(shù)
setAudioStreamType(int streamtype)//設(shè)置音頻流的類型。
setDisplay(SurfaceHolder sh)//設(shè)置顯示方式。
setLooping(boolean looping)//設(shè)置是否循環(huán)播放。
setNextMediaPlayer(MediaPlayer next)//設(shè)置當(dāng)前流媒體播放完畢,下一個播放的MediaPlayer。
setScreenOnWhilePlaying(boolean screenOn)//設(shè)置是否使用SurfaceHolder來顯示。
setSurface(Surface surface)//設(shè)置Surface。
setVideoScalingMode(int mode)//設(shè)置視頻縮放的模式。
setVolume(float leftVolume, float rightVolume)//設(shè)置播放器的音量。
setWakeMode(Context context, int mode)//為MediaPlayer設(shè)置低級電源管理行為。
- 播放控制函數(shù)
start()//開始或恢復(fù)播放。
stop()//停止播放。
pause()//暫停播放。
prepare()//準(zhǔn)備播放(裝載音頻),調(diào)用此方法會使MediaPlayer進入Prepared狀態(tài)。
prepareAsync()//準(zhǔn)備播放異步音頻。
release()//釋放媒體資源
reset()//重置MediaPlayer進入未初始化狀態(tài)。
seekTo(int msec)//指定的時間位置。
- 監(jiān)聽事件函數(shù)
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)//注冊一個回調(diào)函數(shù),在網(wǎng)絡(luò)視頻流緩沖變化時調(diào)用。
setOnCompletionListener(MediaPlayer.OnCompletionListener listener)//為Media Player的播放完成事件綁定事件監(jiān)聽器。
setOnErrorListener(MediaPlayer.OnErrorListener listener)//為MediaPlayer的播放錯誤事件綁定事件監(jiān)聽器。
setOnPreparedListener(MediaPlayer.OnPreparedListener listener)//當(dāng)MediaPlayer調(diào)用prepare()方法時觸發(fā)該監(jiān)聽器。
setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)//當(dāng)MediaPlayer調(diào)用seek()方法時觸發(fā)該監(jiān)聽器。
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)//注冊一個用于監(jiān)聽視頻大小改變的監(jiān)聽器。
- 獲取參數(shù)函數(shù)
getCurrentPosition()//獲取當(dāng)前播放的位置。
getDuration()//獲取音頻的時長。
getVideoHeight()//獲取視頻的高度。
getVideoWidth()//獲取視頻的寬度。
isLooping()//判斷MediaPlayer是否正在循環(huán)播放。
isPlaying()//判斷MediaPlayer是否正在播放。
三、AudioRecord
- AudioRecord 的工作流程
(1) 配置參數(shù),初始化內(nèi)部的音頻緩沖區(qū)
(2) 開始采集
(3) 需要一個線程,不斷地從 AudioRecord 的緩沖區(qū)將音頻數(shù)據(jù)“讀”出來,注意,這個過程一定要及時,否則就會出現(xiàn)“overrun”的錯誤,該錯誤在音頻開發(fā)中比較常見,意味著應(yīng)用層沒有及時地“取走”音頻數(shù)據(jù),導(dǎo)致內(nèi)部的音頻緩沖區(qū)溢出。
(4) 停止采集,釋放資源
- AudioRecord 的參數(shù)配置
-
audioSource
該參數(shù)指的是音頻采集的輸入源,可選的值以常量的形式定義在 MediaRecorder.AudioSource 類中,常用的值包括:DEFAULT(默認(rèn)),VOICE_RECOGNITION(用于語音識別,等同于DEFAULT),MIC(由手機麥克風(fēng)輸入),VOICE_COMMUNICATION(用于VoIP應(yīng)用)等等。 -
sampleRateInHz
采樣率,注意,目前44100Hz是唯一可以保證兼容所有Android手機的采樣率。 -
channelConfig
通道數(shù)的配置,可選的值以常量的形式定義在 AudioFormat 類中,常用的是 CHANNEL_IN_MONO(單通道),CHANNEL_IN_STEREO(雙通道)。 -
audioFormat
這個參數(shù)是用來配置“數(shù)據(jù)位寬”的,可選的值也是以常量的形式定義在 AudioFormat 類中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保證兼容所有Android手機的。
四、AudioTrack
- ** AudioTrack 的工作流程**
(1) 配置參數(shù),初始化內(nèi)部的音頻播放緩沖區(qū)
(2) 開始播放
(3) 需要一個線程,不斷地向 AudioTrack 的緩沖區(qū)“寫入”音頻數(shù)據(jù),注意,這個過程一定要及時,否則就會出現(xiàn)“underrun”的錯誤,該錯誤在音頻開發(fā)中比較常見,意味著應(yīng)用層沒有及時地“送入”音頻數(shù)據(jù),導(dǎo)致內(nèi)部的音頻播放緩沖區(qū)為空。
(4) 停止播放,釋放資源
- ** AudioTrack 的參數(shù)配置**
-
streamType
這個參數(shù)代表著當(dāng)前應(yīng)用使用的哪一種音頻管理策略,當(dāng)系統(tǒng)有多個進程需要播放音頻時,這個管理策略會決定最終的展現(xiàn)效果,該參數(shù)的可選的值以常量的形式定義在 AudioManager 類中,主要包括:
STREAM_VOCIE_CALL:電話聲音
STREAM_SYSTEM:系統(tǒng)聲音
STREAM_RING:鈴聲
STREAM_MUSCI:音樂聲
STREAM_ALARM:警告聲
STREAM_NOTIFICATION:通知聲
-
sampleRateInHz
采樣率,從AudioTrack源碼的“audioParamCheck”函數(shù)可以看到,這個采樣率的取值范圍必須在 4000Hz~192000Hz 之間。 -
mode
AudioTrack 提供了兩種播放模式,一種是 static 方式,一種是 streaming 方式,前者需要一次性將所有的數(shù)據(jù)都寫入播放緩沖區(qū),簡單高效,通常用于播放鈴聲、系統(tǒng)提醒的音頻片段; 后者則是按照一定的時間間隔不間斷地寫入音頻數(shù)據(jù),理論上它可用于任何音頻播放的場景。
可選的值以常量的形式定義在 AudioTrack 類中,一個是 MODE_STATIC,另一個是 MODE_STREAM,根據(jù)具體的應(yīng)用傳入對應(yīng)的值即可。
五、SoundPool
soundlPool 用于播放比較短的音頻片段,比如游戲聲音、按鍵聲、鈴聲片段等等,它可以同時播放多個音頻。
主要方法:
- 構(gòu)造實例
SoundPool(int maxStreams, int streamType, int srcQuality) 參數(shù)依次是:
①指定支持多少個聲音,SoundPool對象中允許同時存在的最大流的數(shù)量,該值太大就會報錯AudioFlinger could not create track, status: -12 ,就聽不到聲音
②指定聲音類型,流類型可以分為STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和STREAM_ALARM四種類型。在AudioManager中定義。
③指定聲音品質(zhì)(采樣率變換質(zhì)量),一般直接設(shè)置為0!
在低版本中可以用上述構(gòu)造方法,而API 21(Android 5.0)后這個構(gòu)造方法就過時了! 而用到一個SoundPool.Builder的東東,我們要實例化SoundPool只需調(diào)用:
SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);
spb.setAudioAttributes(null); //轉(zhuǎn)換音頻格式
SoundPool sp = spb.build(); //創(chuàng)建SoundPool對象
- 加載聲音資源文件
load(Context context, int resId, int priority) //從APK資源載入
load(String path, int priority)
load(FileDescriptor fd, long offset, long length, int priority)
load(AssetFileDescriptor afd, int priority)
參數(shù)介紹:
context:上下文
resId:資源id,如從raw文件獲取填寫R.raw.xxx
priority:沒什么用的一個參數(shù),建議設(shè)置為1,保持和未來的兼容性
path:文件路徑,文件的絕對路線,如存放在sd卡中的音頻
FileDescriptor:文件描述符
AssetFileDescriptor:從asset目錄讀取某個資源文件,context.getAssets().openFd("xxx"),xxx表示文件名
上述方法都會返回一個聲音的ID,Integer類型,我們可以通過建立一個Map<Integer,Integer> 來存儲和獲取聲音方法如下,
Map<Integer,Integer> map=new HashMap<Integer, Integer>();
map.put(1,soundPool.load(context.getAssets().openFd("FadeOut.ogg"),1));
- 播放音頻文件
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate),其返回值為一個int類型的數(shù)字
參數(shù)依次是:
soundID:Load()返回的聲音ID號,以上可以通過map.get(1)獲取
leftVolume:左聲道音量設(shè)置 一般為0-1,默認(rèn)填1
rightVolume:右聲道音量設(shè)置 一般為0-1,默認(rèn)填1
priority:指定播放聲音的優(yōu)先級,數(shù)值越高,優(yōu)先級越大。默認(rèn)填0
loop:指定是否循環(huán):-1表示無限循環(huán),0表示不循環(huán),其他值表示要重復(fù)播放的次數(shù)
rate:指定播放速率:1.0的播放率可以使聲音按照其原始頻率,而2.0的播放速率,可以使聲音按照其 原始頻率的兩倍播放。如果為0.5的播放率,則播放速率是原始頻率的一半。播放速率的取值范圍是0.5至2.0。
如果SoundPool剛調(diào)完加載load函數(shù)之后,直接調(diào)用SoundPool的play函數(shù)可能出現(xiàn)error "sample 1 not READY",所以建議,調(diào)用加載資源函數(shù)load之后,實現(xiàn)資源加載結(jié)束的監(jiān)聽函數(shù),在這個監(jiān)聽到資源加載結(jié)束之后,播放音頻文件。
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
soundPool.play(map.get(1),1,1,0,0,1);
}
});
- 去除音頻或者停止播放重置資源
soundPool.pause(int streamID) 暫停指定播放流的音效
streamID:應(yīng)通過play()返回
soundPool.resume(int streamID) 繼續(xù)播放指定播放流的音效
streamID:應(yīng)通過play()返回
soundPool.stop(int streamID) 終止指定播放流的音效
streamID:應(yīng)通過play()返回
soundPool.unload(int soundID) 卸載一個指定的音頻資源.
soundID:Load()返回的聲音ID號,以上可以通過map.get(1)獲取
soundPool.release(); 釋放SoundPool中的所有音頻資源.
注意:
- play()函數(shù)傳遞的是一個load()返回的soundID——指向一個被記載的音頻資源 ,如果播放成功則返回一個非0的streamID——指向一個成功播放的流 ;同一個soundID 可以通過多次調(diào)用play()而獲得多個不同的streamID (只要不超出同時播放的最大數(shù)量);
- pause()、resume()和stop()是針對播放流操作的,傳遞的是play()返回的streamID ;
- play()中的priority參數(shù),只在同時播放的流的數(shù)量超過了預(yù)先設(shè)定的最大數(shù)量是起作用,管理器將自動終止優(yōu)先級低的播放流。如果存在多個同樣優(yōu)先級的流,再進一步根據(jù)其創(chuàng)建事件來處理,新創(chuàng)建的流的年齡是最小的,將被終止;
- 無論如何,程序退出時,手動終止播放并釋放資源是必要的。
- 如果你音效多,也不要指望unload方法來清除掉一些音效后再load新的進去,雖然unload后音效卸載了,但是前面分給它在SoundPool里面的Id可沒有釋放掉,也就是說這個時候你load新的進去只會在后面繼續(xù)累加,然后累加多了就超過256了,然后就就聽不到聲音,然后就沒有然后了。要想徹底清掉前面的音效請使用release方法,它會連內(nèi)存中占用的資源一起釋放掉。
- 其他還有點什么呢,load需要一點點時間,load后不要馬上unload,load ---play--unload的做法并不可取,不要load太大的音效,它只會申請1M的內(nèi)存空間。SoundPool出錯后通常會看到return的值是0。
五、MediaRecorder 和 AudioRecord的選擇
Android SDK 提供了兩套音頻采集的API,分別是:MediaRecorder 和 AudioRecord,前者是一個更加上層一點的API,它可以直接把手機麥克風(fēng)錄入的音頻數(shù)據(jù)進行編碼壓縮(如AMR、MP3等)并存成文件,而后者則更接近底層,能夠更加自由靈活地控制,可以得到原始的一幀幀PCM音頻數(shù)據(jù)。
如果想簡單地做一個錄音機,錄制成音頻文件,則推薦使用 MediaRecorder,而如果需要對音頻做進一步的算法處理、或者采用第三方的編碼庫進行壓縮、以及網(wǎng)絡(luò)傳輸?shù)葢?yīng)用,則建議使用 AudioRecord,其實 MediaRecorder 底層也是調(diào)用了 AudioRecord 與 Android Framework 層的 AudioFlinger 進行交互的。
音頻的開發(fā),更廣泛地應(yīng)用不僅僅局限于本地錄音,因此,我們需要重點掌握如何利用更加底層的 AudioRecord API 來采集音頻數(shù)據(jù)(注意,使用它采集到的音頻數(shù)據(jù)是原始的PCM格式,想壓縮為mp3,aac等格式的話,還需要專門調(diào)用編碼器進行編碼)。
六、MediaPlayer,SoundPool和AudioTrack的選擇
MediaPlayer 更加適合在后臺長時間播放本地音樂文件或者在線的流式資源;
SoundPool 則適合播放比較短的音頻片段,比如游戲聲音、按鍵聲、鈴聲片段等等,它可以同時播放多個音頻;
而 AudioTrack 則更接近底層,提供了非常強大的控制能力,支持低延遲播放,適合流媒體和VoIP語音電話等場景。
七、播放視頻 VideoView
主要方法:
getBufferPercentage:得到緩沖的百分比
getCurrentPosition:得到當(dāng)前播放位置
getDuration:得到視頻文件的時間
resolveAdjustedSize:調(diào)整視頻顯示大小
setMediaController:設(shè)置播放控制器模式(播放進度條)
setOnCompletionListener:當(dāng)視頻文件播放完時觸發(fā)事件
setVideoPath:設(shè)置視頻源路徑
setVideoURI:設(shè)置視頻源地址
八、相機Camera
Camera回調(diào)事件
-
android.hardware.Camera.AutoFocusCallback
當(dāng)自動對焦時候調(diào)用,該接口具有一個void onAutoFocus(boolean success,Camera camera)函數(shù); -
android.hardware.Camera.ErrorCallback
攝像頭出錯的時候調(diào)用,這個接口具有一個void onError(int error,Camera camera)函數(shù);前者表示數(shù)據(jù)類型,取值是Camera類中的常量CAMERA_ERROR_UNKNOWN或者是 CAMERA_ERROR_SERVICE_DIED;
前者是不明錯誤,后者是表示服務(wù)已經(jīng)關(guān)閉,在這種情況下需要釋放當(dāng)前的Camera對象,然后再初 始化一個。 -
android.hardware.camera.PreviewCallback
在圖像預(yù)覽時調(diào)用,這個接口有一個void onPreviewFrame(byte[] data,Camera camera);參數(shù)data為每幀圖像的數(shù)據(jù)流。我們可以根據(jù)實際需要來實現(xiàn)這個接口。 -
android.hardware.Camera.ShutterCallback
在圖像預(yù)覽的時候調(diào)用,這個接口具有一個void onShutter();
可以在改函數(shù)中通知用戶快門已經(jīng)關(guān)閉,例如播放一個聲音。 -
android.hardware.Camera.PictureCallback
當(dāng)拍攝相片的時候調(diào)用,該接口具有一個void onPictureTaken(byte[] data,Camera camera)函數(shù);參數(shù)和預(yù)覽的一樣。在android中主要有三個類實現(xiàn)了這個接口,分別是PostViewPictureCallback、 RawPictureCallback、JepgPictureCallback。我們可以根據(jù)需要定義自己需要的類。 - 還提供了放大縮小的監(jiān)聽器android.hardware.Camera.OnZoomChangeListener。
private final class ZoomListener implements android.hardware.Camera.OnZoomChangeListener {
public void onZoomChange(int value, boolean stopped, android.hardware.Camera camera) ;
Camera.Parameters 相機的屬性參數(shù)
通過Camera.open(int cameraId)啟動相機服務(wù),然后通過Camera對象的getParameters()函數(shù)來得到一個android.hardware.Camera.Parameters 對象,Parameters提供了一些接口來設(shè)置Camera的屬性:
-
setPictureFormat(int pixel_format)
設(shè)置圖片的格式,其取值為ImageFormat.JPEG、ImageFormat.RGB_565或者ImageFormat.FLEX_RGB_888等格式。 -
setPreviewFormat(int pixel_format)
設(shè)置圖片的預(yù)覽格式,取值如上。 -
setPictureSize(int width,int height)
設(shè)置圖片的高度和寬度,單位為像素。 -
setPreviewSize(int width,int height)
設(shè)置預(yù)覽的高度和寬度,取值如上。 -
setPreviewFrameRate(int fps)
設(shè)置圖片預(yù)覽的幀速。 -
setFocusMode(String value)
設(shè)置聚焦模式,如Camera.Parameters.FOCUS_MODE_AUTO。
Camera類的方法
在設(shè)置好Camera的參數(shù)后,通過以下方法可執(zhí)行相應(yīng)操作。
-
camera.startPreview()
開始預(yù)覽圖像。 -
camera.autoFocus(AutoFocusCallback cb)
自動對焦。 -
camera.takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg)
執(zhí)行拍照。
注:takePicture方法要實現(xiàn)3個回調(diào)函數(shù)作為它的三個參數(shù):Camera.ShutterCallback(快門回調(diào)接口),和兩個Camera.Picture.Callback(原生圖像數(shù)據(jù)接口和壓縮格式圖片數(shù)據(jù)接口)。
需要許可
<uses-permission android:name="android.permission.CAMERA" />
若要將圖片存儲至sd卡中,則需要sd卡讀寫許可 -
camera.stopPreview()
停止預(yù)覽 。 -
camera.release()
釋放相機服務(wù) 。
九、鬧鐘設(shè)置AlarmManager
相關(guān)類:AlarmManager,它是專門用來設(shè)定在某個指定的時間去完成指定的事件。AlarmManager提供了訪問系統(tǒng)警報的服務(wù),只要在程序中設(shè)置了警報服務(wù),AlarmManager就會通過onReceive()方法去執(zhí)行這些事件,就算系統(tǒng)處于待機狀態(tài),同樣不會影響運行??赏ㄟ^Context.getSystemService(ALARM_SERVICE)方法來獲得該服務(wù)。
方法說明:
cancel: 取消AlarmManager服務(wù)
set: 設(shè)置AlarmManager服務(wù)
setInexactRepeating:設(shè)置不精確周期
setRepeating:設(shè)置精確周期
setTimeZone:設(shè)置時區(qū)
注:需創(chuàng)建一個BroadcastReceiver的子類,并覆蓋onReceive()方法
鈴聲設(shè)置
系統(tǒng)自帶的鈴聲都放在/system/medio/audio/文件夾中
鈴音類型: TYPE_RINGTONE(來電鈴音),TYPE_ALARM,TYPE_NOTIFICATION
相關(guān)類:RingtoneManager
方法介紹:
getActualDefaultRingtoneUri:取得指定類型的鈴聲
getCursor:返回所有可用鈴聲的游標(biāo)
getDefaultType:得到指定URI默認(rèn)的鈴聲類型
getRingtone
getRingtonePosition:得到鈴聲位置
getRingtoneUri
getValidRingtoneUri:得到一個可用鈴聲的URI
isDefault:得到指定的Uri是否為默認(rèn)的鈴聲
setActualDefaultRingtoneUri:設(shè)置默認(rèn)的鈴聲
獲取的Cursor共有4列,列名依次為:_id,title,”content://media/internal/audio/media”,title_key