![Android應(yīng)用開(kāi)發(fā)揭秘-實(shí)驗(yàn)六_第1頁(yè)](http://file4.renrendoc.com/view/0a5baa99150db56027c03c0f92fe9534/0a5baa99150db56027c03c0f92fe95341.gif)
![Android應(yīng)用開(kāi)發(fā)揭秘-實(shí)驗(yàn)六_第2頁(yè)](http://file4.renrendoc.com/view/0a5baa99150db56027c03c0f92fe9534/0a5baa99150db56027c03c0f92fe95342.gif)
![Android應(yīng)用開(kāi)發(fā)揭秘-實(shí)驗(yàn)六_第3頁(yè)](http://file4.renrendoc.com/view/0a5baa99150db56027c03c0f92fe9534/0a5baa99150db56027c03c0f92fe95343.gif)
![Android應(yīng)用開(kāi)發(fā)揭秘-實(shí)驗(yàn)六_第4頁(yè)](http://file4.renrendoc.com/view/0a5baa99150db56027c03c0f92fe9534/0a5baa99150db56027c03c0f92fe95344.gif)
![Android應(yīng)用開(kāi)發(fā)揭秘-實(shí)驗(yàn)六_第5頁(yè)](http://file4.renrendoc.com/view/0a5baa99150db56027c03c0f92fe9534/0a5baa99150db56027c03c0f92fe95345.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)六姓名:馬征學(xué)號(hào):2011303502班級(jí):14011107了解Android多媒體開(kāi)發(fā)OpenCoreOpenCore是Android多媒體框架的核心所有Android平臺(tái)的音頻、視頻的采集以及播放等操作都是通過(guò)它來(lái)實(shí)現(xiàn)。它也被稱為PVPacketVideoPacketVideo是一家專門提供多媒體解決方案的公司。程序員可以通過(guò)OpenCore方便快速地開(kāi)發(fā)出想要的多媒體應(yīng)用程序例如錄音、播放、回放、視頻會(huì)議、流媒體播放等等??梢钥闯鯫penCore支持的格式包括MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等。OpenCore多媒體框架有一套通用可擴(kuò)展的接口針對(duì)第三方的多媒體編碼器輸入、輸出設(shè)備等等。具體功能如下多媒體文件的播放、下載包括3GPPMPEG-AAC和MP3containers。流媒體文件的下載、實(shí)時(shí)播放包括3GPPHTTP和RTSP/RTP。動(dòng)態(tài)視頻和靜態(tài)圖像的編碼、解碼例如MPEG-4H.263和AVC(H.264)JPEG。語(yǔ)音編碼格式AMR-NB和AMR-WB。音樂(lè)編碼格式MP3AACAAC+。視頻和圖像格式3GPPMPEG-4和JPEG。視頻會(huì)議基于H324-M標(biāo)準(zhǔn)OpenCore是一個(gè)多媒體的框架從宏觀上來(lái)看它主要包含了兩大方面的內(nèi)容PVPlayer提供多媒體播放器的功能完成各種音頻Audio、視頻Video流的回放Playback功能。PVAuthor提供媒體流記錄的功能完成各種音頻、視頻流以及靜態(tài)圖像的捕獲功能。OpenCore的代碼在Android代碼的External/Opencore目錄中其子目錄及其具體功能描述如下Android這里面是一個(gè)上層的庫(kù)它實(shí)現(xiàn)了一個(gè)為Android使用的音視頻采集、播放的接口及DRM數(shù)字版權(quán)管理的接口實(shí)現(xiàn)。Baselibs包含數(shù)據(jù)結(jié)構(gòu)和線程安全等內(nèi)容的底層庫(kù)。Codecs_v2音視頻的解碼器基于OpenMAX的頭文件。Fileformats文件格式的解析Parser工具。Nodes提供一些PVMF的NODE主要是編解碼和文件解析方面的。Oscl操作系統(tǒng)兼容庫(kù)。Pvmi輸入輸出控制的抽象接口。Protocols主要是與網(wǎng)絡(luò)相關(guān)的RTSP、RTP、HTTP等協(xié)議的相關(guān)內(nèi)容。Pvcommon:pvcommon庫(kù)文件的Android.mk文件沒(méi)有源文件。Pvplayerpv:player庫(kù)文件的Android.mk文件沒(méi)有源文件。Pvanthor:pvauthor庫(kù)文件的Android.mk文件沒(méi)有源文件。Tools_v2編譯工具以及一些可注冊(cè)的模塊。在實(shí)際的開(kāi)發(fā)中,我們不會(huì)過(guò)多研究Opencore的實(shí)現(xiàn),Android提供了上層的MediaAPI給開(kāi)發(fā)人員使用:Android中對(duì)媒體系統(tǒng)相關(guān)的Java代碼,主要有下表中的文件:MediaPlayerMediaPlayer類可以用來(lái)播放音頻、視頻和流媒體MediaPlayer包含了Audio和Video的播放功能在Android的界面上Music和Video兩個(gè)應(yīng)用程序都是調(diào)用MediaPlayer實(shí)現(xiàn)的。首先我們來(lái)看看MediaPlayer的生命周期當(dāng)一個(gè)MediaPlayer對(duì)象被新建或者調(diào)用reset()方法之后它處于空閑狀態(tài)在調(diào)用release()方法后才會(huì)處于結(jié)束狀態(tài)。一個(gè)新建的MediaPlayer對(duì)象在調(diào)用getCurrentPosition()、getDuration()、getVideoHeight()、getVideoWidth()、setAudioStreamType(int)、setLooping(boolean)、setVolume(float,float)、pause()、start()、stop()、seekTo(int)、prepare()、prepareAsync()方法時(shí)不會(huì)觸發(fā)OnErrorListener.onError()事件。當(dāng)MediaPlayer對(duì)象不再被使用時(shí)最好通過(guò)release()方法來(lái)釋放使其處于結(jié)束狀態(tài)以免造成不必要的錯(cuò)誤。當(dāng)MediaPlayer對(duì)象處于結(jié)束狀態(tài)時(shí)便不能再使用。MediaPlayer對(duì)象被新建時(shí)處于空閑狀態(tài)如果通過(guò)create()方法創(chuàng)建之后便處于準(zhǔn)備狀態(tài)一般情況下一些常用的播放控制操作可能因?yàn)橐纛l、視頻的格式不被支持或者質(zhì)量較差以及流超時(shí)也有可能由于開(kāi)發(fā)者的疏忽使得MediaPlayer對(duì)象處于無(wú)效狀態(tài)等而導(dǎo)致錯(cuò)誤。這里可以通過(guò)注冊(cè)setOnErrorListener(android.media.MediaPlayer.OnErrorListener)方法實(shí)現(xiàn)OnErrorListener.onError()方法來(lái)監(jiān)控這些錯(cuò)誤。如果發(fā)生了錯(cuò)誤MediaPlayer對(duì)象將處于錯(cuò)誤狀態(tài)可以使用reset()方法來(lái)恢復(fù)錯(cuò)誤。任何MediaPlayer對(duì)象都必須先處于準(zhǔn)備狀態(tài)然后才開(kāi)始播放。要開(kāi)始播放MediaPlayer對(duì)象都必須成功調(diào)用start()方法。可以通過(guò)isPlayer()方法來(lái)檢測(cè)當(dāng)前是否正在播放。當(dāng)MediaPlayer對(duì)象在播放時(shí)可以進(jìn)行暫停和停止等操作pause()方法暫停播放stop()方法停止播放。處于暫停狀態(tài)時(shí)可以通過(guò)start()方法來(lái)恢復(fù)播放但是處于停止?fàn)顟B(tài)時(shí)則必須先調(diào)用pause()方法處于準(zhǔn)備狀態(tài)然后再通過(guò)start()方法來(lái)開(kāi)始播放??梢酝ㄟ^(guò)setLooping(Boolean)方法來(lái)設(shè)置是否循環(huán)播放。MediaRecorderMediaRecorder類用來(lái)進(jìn)行媒體采樣包括音頻和視頻。MediaRecorder作為狀態(tài)機(jī)運(yùn)行。需要設(shè)置不同的參數(shù)比如源設(shè)備和格式。設(shè)置后可執(zhí)行任何時(shí)間長(zhǎng)度的錄制直到用戶停止MediaRecorder在底層同樣是通過(guò)OpenCore來(lái)實(shí)現(xiàn)的,但是要開(kāi)發(fā)應(yīng)用時(shí)需要使用Android為我們提供的Java借口:Android多媒體的具體示例播放音樂(lè)首先我們的播放器可能不只是希望播放一種格式的音樂(lè),而且還需要自動(dòng)識(shí)別指定路徑中那些事可以播放的音頻文件,那些事不支持的格式:classMusicFilterimplementsFilenameFilter{publicBooleanaccept(Filedir,Stringname){//這里還可以設(shè)置其他格式的音樂(lè)文件return(name.endsWith(―.mp3));}}現(xiàn)在我們需要需要指定音樂(lè)文件的位置本例我們?cè)O(shè)置路徑為“/sdcard/”因此我們需要向SD卡中添加一些音頻文件。步驟如下啟動(dòng)模擬器在Eclipse上選擇DDMS窗口選擇FileExplorer標(biāo)簽。publicclassActivity01extendsListActivity{ /*幾個(gè)操作按鈕*/ privateImageButton mFrontImageButton =null; privateImageButton mStopImageButton =null; privateImageButton mStartImageButton =null; privateImageButton mPauseImageButton =null; privateImageButton mNextImageButton =null; /*MediaPlayer對(duì)象*/ publicMediaPlayer mMediaPlayer =null; /*播放列表*/ privateList<String>mMusicList=newArrayList<String>(); /*當(dāng)前播放歌曲的索引*/ privateintcurrentListItme=0; /*音樂(lè)的路徑*/ privatestaticfinalStringMUSIC_PATH=newString("/sdcard/"); /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*更新顯示播放列表*/ musicList(); /*構(gòu)建MediaPlayer對(duì)象*/ mMediaPlayer =newMediaPlayer(); mFrontImageButton=(ImageButton)findViewById(R.id.LastImageButton); mStopImageButton=(ImageButton)findViewById(R.id.StopImageButton); mStartImageButton=(ImageButton)findViewById(R.id.StartImageButton); mPauseImageButton=(ImageButton)findViewById(R.id.PauseImageButton); mNextImageButton=(ImageButton)findViewById(R.id.NextImageButton); //停止按鈕 mStopImageButton.setOnClickListener(newImageButton.OnClickListener() { @Override publicvoidonClick(Viewv) { /*是否正在播放*/ if(mMediaPlayer.isPlaying()) { //重置MediaPlayer到初始狀態(tài) mMediaPlayer.reset(); } } }); //開(kāi)始按鈕 mStartImageButton.setOnClickListener(newImageButton.OnClickListener() { @Override publicvoidonClick(Viewv) { playMusic(MUSIC_PATH+mMusicList.get(currentListItme)); } }); //暫停 mPauseImageButton.setOnClickListener(newImageButton.OnClickListener() { publicvoidonClick(Viewview) { if(mMediaPlayer.isPlaying()) { /*暫停*/ mMediaPlayer.pause(); } else { /*開(kāi)始播放*/ mMediaPlayer.start(); } } }); //下一首 mNextImageButton.setOnClickListener(newImageButton.OnClickListener() { @Override publicvoidonClick(Viewarg0) { nextMusic(); } }); //上一首 mFrontImageButton.setOnClickListener(newImageButton.OnClickListener() { @Override publicvoidonClick(Viewarg0) { FrontMusic(); } }); } publicbooleanonKeyDown(intkeyCode,KeyEventevent) { if(keyCode==KeyEvent.KEYCODE_BACK) { mMediaPlayer.stop(); mMediaPlayer.release(); this.finish(); returntrue; } returnsuper.onKeyDown(keyCode,event); } @Override /*當(dāng)我們點(diǎn)擊列表時(shí),播放被點(diǎn)擊的音樂(lè)*/ protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid) { currentListItme=position; playMusic(MUSIC_PATH+mMusicList.get(position)); } /*播放列表*/ publicvoidmusicList() { //取得指定位置的文件設(shè)置顯示到播放列表 Filehome=newFile(MUSIC_PATH); if(home.listFiles(newMusicFilter()).length>0) { for(Filefile:home.listFiles(newMusicFilter())) { mMusicList.add(file.getName()); } ArrayAdapter<String>musicList=newArrayAdapter<String>(Activity01.this,R.layout.musicitme,mMusicList); setListAdapter(musicList); } } privatevoidplayMusic(Stringpath) { try { /*重置MediaPlayer*/ mMediaPlayer.reset(); /*設(shè)置要播放的文件的路徑*/ mMediaPlayer.setDataSource(path); /*準(zhǔn)備播放*/ mMediaPlayer.prepare(); /*開(kāi)始播放*/ mMediaPlayer.start(); mMediaPlayer.setOnCompletionListener(newOnCompletionListener() { publicvoidonCompletion(MediaPlayerarg0) { //播放完成一首之后進(jìn)行下一首 nextMusic(); } }); }catch(IOExceptione){} } /*下一首*/ privatevoidnextMusic() { if(++currentListItme>=mMusicList.size()) { currentListItme=0; } else { playMusic(MUSIC_PATH+mMusicList.get(currentListItme)); } } /*上一首*/ privatevoidFrontMusic() { if(--currentListItme>=0) { currentListItme=mMusicList.size(); } else { playMusic(MUSIC_PATH+mMusicList.get(currentListItme)); } }}/*過(guò)濾文件類型*/classMusicFilterimplementsFilenameFilter{ publicbooleanaccept(Filedir,Stringname) { //這里還可以設(shè)置其他格式的音樂(lè)文件 return(name.endsWith(".mp3")); }}擴(kuò)展學(xué)習(xí)現(xiàn)在我們已經(jīng)知道如何來(lái)播放指定SD卡上的音樂(lè)了,我們?cè)趹?yīng)用時(shí)(比如游戲中的音效),肯定是需要和我們的程序一起打包發(fā)布的,這樣音樂(lè)就沒(méi)有存在于SD卡上了,一般情況下會(huì)放在應(yīng)用目錄下的“res\raw\”中。那么如何來(lái)播放這樣的音樂(lè)呢,其實(shí)很簡(jiǎn)單,只需要把上面例子中的setDataSource方法改成由create方法來(lái)創(chuàng)建一個(gè)指定資料索引的MediaPlayer對(duì)象,其他操作基本一樣。播放視頻目前整個(gè)平臺(tái)僅支持MP4的H.264、3GP和WMV視頻的解析。首先在布局文件中創(chuàng)建VideoView布局并且創(chuàng)建幾個(gè)按鈕Button來(lái)實(shí)現(xiàn)對(duì)視頻的操作<?xmlversion="1.0"encoding="utf-8"?><AbsoluteLayout xmlns:android="/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello"/> <VideoView android:id="@+id/VideoView01" android:layout_width="320px" android:layout_height="240px"/> <Buttonandroid:id="@+id/LoadButton" android:layout_width="80px" android:layout_height="wrap_content" android:text="裝載" android:layout_x="30px" android:layout_y="300px" /> <Buttonandroid:id="@+id/PlayButton" android:layout_width="80px" android:layout_height="wrap_content" android:text="播放" android:layout_x="120px" android:layout_y="300px" /> <Buttonandroid:id="@+id/PauseButton" android:layout_width="80px" android:layout_height="wrap_content" android:text="暫停" android:layout_x="210px" android:layout_y="300px" /></AbsoluteLayout>當(dāng)我們點(diǎn)擊“裝載”按鈕時(shí)將指定視頻文件的路徑如/*設(shè)置路徑*/VideoView.setvideoPath(―/sdcard/test.mp4‖);/*設(shè)置模式-播放進(jìn)度條*/Videoview.setmediacomtroller(newmediacontroller(Activiy01.this));Videoview.requestfocus();裝載之后便可以通start、pause方法來(lái)播放和暫停publicclassActivity01extendsActivity{ /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*創(chuàng)建VideoView對(duì)象*/ finalVideoViewvideoView=(VideoView)findViewById(R.id.VideoView01); /*操作播放的三個(gè)按鈕*/ ButtonPauseButton=(Button)this.findViewById(R.id.PauseButton); ButtonLoadButton=(Button)this.findViewById(R.id.LoadButton); ButtonPlayButton=(Button)this.findViewById(R.id.PlayButton); /*裝載按鈕事件*/ LoadButton.setOnClickListener(newOnClickListener() { publicvoidonClick(Viewarg0) { /*設(shè)置路徑*/ videoView.setVideoPath("/sdcard/test.mp4"); /*設(shè)置模式-播放進(jìn)度條*/ videoView.setMediaController(newMediaController(Activity01.this)); videoView.requestFocus(); } }); /*播放按鈕事件*/ PlayButton.setOnClickListener(newOnClickListener() { publicvoidonClick(Viewarg0) { /*開(kāi)始播放*/ videoView.start(); } }); /*暫停按鈕*/ PauseButton.setOnClickListener(newOnClickListener() { publicvoidonClick(Viewarg0) { /*暫停*/ videoView.pause(); } }); }}錄制歌曲現(xiàn)在幾乎每個(gè)手機(jī)都有錄音功能其用途也很廣比如我們需要記錄某些重要的內(nèi)容時(shí)手頭又沒(méi)有筆之類的工具這時(shí)我們就可以通過(guò)錄音功能來(lái)將通話內(nèi)容錄制下來(lái)。而且我們通??梢詫⒆约旱匿浺粼O(shè)置為個(gè)性鈴聲等。本要內(nèi)容我們將學(xué)習(xí)在ANDROID如何進(jìn)行錄音當(dāng)點(diǎn)擊“開(kāi)始“按鈕后就構(gòu)建MEDIARECORDER對(duì)象并且設(shè)置聲音的來(lái)源SETAUDIOSOURCE、輸出文件的格式SETOUTPUTFORMAT、音頻文件的編碼9SETAUDIOENCODER、輸出文件的路徑SETOITPUTFILE等然后準(zhǔn)備開(kāi)始錄音PREPATE開(kāi)始錄音START。當(dāng)點(diǎn)擊“停止”按鈕時(shí)停止錄音STOP然后釋放MEDIARECORDER對(duì)象RELEASE0完成錄音。publicclassActivity01extendsListActivity{ /*按鈕*/ privateButton StartButton; privateButton StopButton; /*錄制的音頻文件*/ privateFile mRecAudioFile; privateFile mRecAudioPath; /*MediaRecorder對(duì)象*/ privateMediaRecorder mMediaRecorder; /*錄音文件列表*/ privateList<String> mMusicList =newArrayList<String>(); /*零時(shí)文件的前綴*/ privateString strTempFile ="recaudio_"; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*取得按鈕*/ StartButton=(Button)findViewById(R.id.StartButton); StopButton=(Button)findViewById(R.id.StopButton); /*檢測(cè)是否存在SD卡*/ if(Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { /*得到SD卡得路徑*/ mRecAudioPath=Environment.getExternalStorageDirectory(); /*更新所有錄音文件到List中*/ musicList(); } else { Toast.makeText(Activity01.this,"沒(méi)有SD卡",Toast.LENGTH_LONG).show(); } /*開(kāi)始按鈕事件監(jiān)聽(tīng)*/ StartButton.setOnClickListener(newButton.OnClickListener() { @Override publicvoidonClick(Viewarg0) { try { /*創(chuàng)建錄音文件*/ mRecAudioFile=File.createTempFile(strTempFile,".amr",mRecAudioPath); /*實(shí)例化MediaRecorder對(duì)象*/ mMediaRecorder=newMediaRecorder(); /*設(shè)置麥克風(fēng)*/ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); /*設(shè)置輸出文件的格式*/ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); /*設(shè)置音頻文件的編碼*/ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); /*設(shè)置輸出文件的路徑*/ mMediaRecorder.setOutputFile(mRecAudioFile.getAbsolutePath()); /*準(zhǔn)備*/ mMediaRecorder.prepare(); /*開(kāi)始*/ mMediaRecorder.start(); } catch(IOExceptione) { e.printStackTrace(); } } }); /*停止按鈕事件監(jiān)聽(tīng)*/ StopButton.setOnClickListener(newButton.OnClickListener() { @Override publicvoidonClick(Viewarg0) { //TODOAuto-generatedmethodstub if(mRecAudioFile!=null) { /*停止錄音*/ mMediaRecorder.stop(); /*將錄音文件添加到List中*/ mMusicList.add(mRecAudioFile.getName()); ArrayAdapter<String>musicList=newArrayAdapter<String>(Activity01.this,R.layout.list,mMusicList); setListAdapter(musicList); /*釋放MediaRecorder*/ mMediaRecorder.release(); mMediaRecorder=null; } } }); } /*播放錄音文件*/ privatevoidplayMusic(Filefile) { Intentintent=newIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); /*設(shè)置文件類型*/ intent.setDataAndType(Uri.fromFile(file),"audio"); startActivity(intent); } @Override /*當(dāng)我們點(diǎn)擊列表時(shí),播放被點(diǎn)擊的音樂(lè)*/ protectedvoidonListItemClick(ListViewl,Viewv,intposition,longid) { /*得到被點(diǎn)擊的文件*/ Fileplayfile=newFile(mRecAudioPath.getAbsolutePath()+File.separator+mMusicList.get(position)); /*播放*/ playMusic(playfile); } /*播放列表*/ publicvoidmusicList() { //取得指定位置的文件設(shè)置顯示到播放列表 Filehome=mRecAudioPath; if(home.listFiles(newMusicFilter()).length>0) { for(Filefile:home.listFiles(newMusicFilter())) { mMusicList.add(file.getName()); } ArrayAdapter<String>musicList=newArrayAdapter<String>(Activity01.this,R.layout.list,mMusicList); setListAdapter(musicList); } }}/*過(guò)濾文件類型*/classMusicFilterimplementsFilenameFilter{ publicbooleanaccept(Filedir,Stringname) { return(name.endsWith(".amr")); }}代碼清單7-5中通過(guò)“ENVIRONMENT。GETEXTERNALSTORAGEDIRECTORY”可以取得SD卡路徑。最后將錄音保存到了SD卡圖7-10是錄音后保存在SD卡中的AMR文件。通過(guò)這個(gè)例子的學(xué)習(xí)我們可以得出要實(shí)現(xiàn)錄音的一般步驟實(shí)例化MEDIARECORDERMR=NEWMEDIARECORDER初始化mr:mr.setAudiosource(MIC)\setVideo-source(CAMERA),必須在配置DATASOURCE之前調(diào)用配置DATASOURCE設(shè)置輸出文件格式/路徑編碼器等準(zhǔn)備錄制mr.prepare();開(kāi)始錄制mr.start();停止錄制mr.stop();釋放資源mr.release()。相機(jī)設(shè)置在ANDROID中專門提供了CAMERA來(lái)處理相機(jī)相關(guān)的事件CAMERA是一個(gè)專門用來(lái)連接和斷開(kāi)相機(jī)服務(wù)的類CAMERA下面包括如下幾個(gè)事件Camera.autofocuscallback:自動(dòng)調(diào)焦功能Camera.errorcallback:錯(cuò)誤信息捕捉Camera.parameters相機(jī)的屬性參數(shù)Camera.previewcallback:相機(jī)預(yù)覽設(shè)置Camera.picturecallback:拍照、產(chǎn)生圖片時(shí)觸發(fā)Camera.shuttercallback:快門設(shè)置Camera.size:圖片的尺寸。要在ANDROID中使用相機(jī)服務(wù)很簡(jiǎn)單CAMERA沒(méi)有構(gòu)造方法我們要使用它直接通過(guò)OPEN方法來(lái)打開(kāi)相機(jī)設(shè)備然后通過(guò)CAMERA.PARAMETERS對(duì)相機(jī)的一些屬性進(jìn)行設(shè)置比如輸出圖片的格式、大小等等。publicclassActivity01extendsActivity{ privatePreview mPreview; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //CreateourPreviewviewandsetitasthecontentofouractivity. mPreview=newPreview(this); setContentView(mPreview); } publicbooleanonKeyUp(intkeyCode,KeyEventevent) { switch(keyCode) { caseKeyEvent.KEYCODE_DPAD_CENTER: mPreview.takePicture(); break; } returntrue; }}/*Preview-顯示Preview*/classPreviewextendsSurfaceViewimplementsSurfaceHolder.Callback{SurfaceHoldermHolder;CameramCamera;BitmapCameraBitmap;Preview(Contextcontext){super(context);mHolder=getHolder();mHolder.addCallback(this);mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}publicvoidsurfaceCreated(SurfaceHolderholder){ /*啟動(dòng)Camera*/mCamera=Camera.open();try{mCamera.setPreviewDisplay(holder);}catch(IOExceptionexception){ /*釋放mCamera*/mCamera.release();mCamera=null;//TODO:addmoreexceptionhandlinglogichere}}publicvoidsurfaceDestroyed(SurfaceHolderholder){ /*停止預(yù)覽*/mCamera.stopPreview();mCamera=null;}publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intw,inth){ /*構(gòu)建Camera.Parameters對(duì)相機(jī)的參數(shù)進(jìn)行設(shè)置*/Camera.Parametersparameters=mCamera.getParameters();/*設(shè)置拍照的圖片格式*/parameters.setPictureFormat(PixelFormat.JPEG);/*設(shè)置Preview的尺寸*/parameters.setPreviewSize(320,480);/*設(shè)置圖像分辨率*///parameters.setPictureSize(320,480);/*設(shè)置相機(jī)采用parameters*/mCamera.setParameters(parameters);/*開(kāi)始預(yù)覽*/mCamera.startPreview();}/*拍照片*/publicvoidtakePicture(){if(mCamera!=null){ mCamera.takePicture(null,null,jpegCallback);}}/*拍照后輸出圖片*/privatePictureCallbackjpegCallback=newPictureCallback(){publicvoidonPictureTaken(byte[]_data,Camera_camera){//TODOHandleJPEGimagedata CameraBitmap=BitmapFactory.decodeByteArray(_data,0,_data.length);FilemyCaptureFile=newFile("/sdcard/camera1.jpg");try{BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(myCaptureFile));CameraBpress(Bitmap.CompressFormat.JPEG,80,bos);bos.flush();bos.close();/*將拍到的圖片繪制出來(lái)*/Canvascanvas=mHolder.lockCanvas();canvas.drawBitmap(CameraBitmap,0,0,null);mHolder.unlockCanvasAndPost(canvas);}catch(Exceptione){ e.getMessage();}}};}鬧鐘設(shè)置在ANDROID中可以通過(guò)ALARMMANAGER來(lái)實(shí)現(xiàn)鬧鐘ALARMMANAGER類是專門用來(lái)設(shè)定在某個(gè)指定的時(shí)間去完成指定的事件。ALARMMANAGER提供了訪問(wèn)系統(tǒng)警報(bào)的服務(wù)只要在程序中設(shè)置了警報(bào)服務(wù)ALARMMANAGER就會(huì)通過(guò)context.getsystemservice方法來(lái)獲得該服務(wù)。ALARMMANAGER中的方法很少:要實(shí)現(xiàn)鬧鐘,首先要?jiǎng)?chuàng)建一個(gè)繼承自BroadcastReceiver的類,實(shí)現(xiàn)onReceive方法來(lái)接受這個(gè)Alarm服務(wù),然后通過(guò)建立Intent和PendingIntent裂解來(lái)調(diào)用Alarm組件:publicclassAlarmReceiverextendsBroadcastReceiver{ publicvoidonReceive(Contextcontext,Intentintent) { Toast.makeText(context,"你設(shè)置的鬧鐘時(shí)間到了",Toast.LENGTH_LONG).show(); }}publicclassActivity01extendsActivity{ Button mButton1; Button mButton2; TextViewmTextView; Calendarcalendar; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); calendar=Calendar.getInstance(); mTextView=(TextView)findViewById(R.id.TextView01); mButton1=(Button)findViewById(R.id.Button01); mButton2=(Button)findViewById(R.id.Button02); mButton1.setOnClickListener(newView.OnClickListener() { publicvoidonClick(Viewv) { calendar.setTimeInMillis(System.currentTimeMillis()); intmHour=calendar.get(Calendar.HOUR_OF_DAY); intmMinute=calendar.get(Calendar.MINUTE); newTimePickerDialog(Activity01.this, newTimePickerDialog.OnTimeSetListener() { publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute) { calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY,hourOfDay); calendar.set(Calendar.MINUTE,minute); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); /*建立Intent和PendingIntent,來(lái)調(diào)用目標(biāo)組件*/ Intentintent=newIntent(Activity01.this,AlarmReceiver.class); PendingIntentpendingIntent=PendingIntent.getBroadcast(Activity01.this,0,intent,0); AlarmManageram; /*獲取鬧鐘管理的實(shí)例*/ am=(AlarmManager)getSystemService(ALARM_SERVICE); /*設(shè)置鬧鐘*/ am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent); /*設(shè)置周期鬧*/ am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+(10*1000),(24*60*60*1000),pendingIntent); StringtmpS="設(shè)置鬧鐘時(shí)間為"+format(hourOfDay)+":"+format(minute); mTextView.setText(tmpS); } },mHour,mMinute,true).show(); } }); mButton2.setOnClickListener(newView.OnClickListener() { publicvoidonClick(Viewv) { Intentintent=newIntent(Activity01.this,AlarmReceiver.class); PendingIntentpendingIntent=PendingIntent.getBroadcast(Activity01.this,0,intent,0); AlarmManageram; /*獲取鬧鐘管理的實(shí)例*/ am=(AlarmManager)getSystemService(ALARM_SERVICE); /*取消*/ am.cancel(pendingIntent); mTextView.setText("鬧鐘已取消!"); } }); } /*格式化字符串(7:3->07:03)*/ privateStringformat(intx) { Strings=""+x; if(s.length()==1) s="0"+s; returns; }}鈴聲設(shè)置可以從網(wǎng)上下載很多自己喜歡的鈴聲并設(shè)置成我們手機(jī)默認(rèn)的鈴聲。Android提供了ringtonemanager類專門來(lái)操作各種鈴聲比如覺(jué)的來(lái)電鈴聲、鬧鐘鈴聲以及一些警告或通知鈴聲。Android自帶的系統(tǒng)鈴聲都放置在“/system/medio/audio/”文件夾中而自己的下載的鈴聲一般都放置在SD卡中那么就需要在SD卡下面建立如下目錄/sdcard/music/tingtones:一般的鈴聲比如來(lái)電鈴聲/sdcard/music/alarms:鬧鐘鈴聲/sdcard/music/notifications:警告或通知鈴聲。然后將下載的鈴聲按自己的需要旋轉(zhuǎn)到這些文件夾中publicclassActivity01extendsActivity{ /*3個(gè)按鈕*/ privateButtonmButtonRingtone; privateButtonmButtonAlarm; privateButtonmButtonNotification; /*自定義的類型*/ publicstaticfinalintButtonRingtone =0; publicstaticfinalintButtonAlarm =1; publicstaticfinalintButtonNotification =2; /*鈴聲文件夾*/ privateStringstrRingtoneFolder="/sdcard/music/ringtones"; privateStringstrAlarmFolder="/sdcard/music/alarms"; privateStringstrNotificationFolder="/sdcard/music/notifications"; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButtonRingtone=(Button)findViewById(R.id.ButtonRingtone); mButtonAlarm=(Button)findViewById(R.id.ButtonAlarm); mButtonNotification=(Button)findViewById(R.id.ButtonNotification); /*設(shè)置來(lái)電鈴聲*/ mButtonRingtone.setOnClickListener(newButton.OnClickListener() { @Override publicvoidonClick(Viewarg0) { if(bFolder(strRingtoneFolder)) { //打開(kāi)系統(tǒng)鈴聲設(shè)置 Intentintent=newIntent(RingtoneManager.ACTION_RINGTONE_PICKER); //類型為來(lái)電RINGTONE intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_RINGTONE); //設(shè)置顯示的title intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,"設(shè)置來(lái)電鈴聲"); //當(dāng)設(shè)置完成之后返回到當(dāng)前的Activity startActivityForResult(intent,ButtonRingtone); } } }); /*設(shè)置鬧鐘鈴聲*/ mButtonAlarm.setOnClickListener(newButton.OnClickListener() { @Override publicvoidonClick(Viewarg0) { if(bFolder(strAlarmFolder)) { //打開(kāi)系統(tǒng)鈴聲設(shè)置 Intentintent=newIntent(Ri
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來(lái)商業(yè)空間設(shè)計(jì)趨勢(shì)與挑戰(zhàn)應(yīng)對(duì)
- 國(guó)慶節(jié)中秋快樂(lè)活動(dòng)方案
- 16《朱德扁擔(dān)》第二課時(shí) 說(shuō)課稿-2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè)統(tǒng)編版
- Unit 2 Healthy Lifestyle Reading and Thinking 說(shuō)課稿-2023-2024學(xué)年高二英語(yǔ)人教版(2019)選擇性必修第三冊(cè)
- Module4 Unit1 It's red!(說(shuō)課稿)-2024-2025學(xué)年外研版(一起)英語(yǔ)一年級(jí)上冊(cè)
- Unit 2 Different families Lesson 6(說(shuō)課稿)-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 1《天地人》說(shuō)課稿-2024-2025學(xué)年語(yǔ)文一年級(jí)上冊(cè)統(tǒng)編版
- 2024-2025學(xué)年高中信息技術(shù) 會(huì)考知識(shí)點(diǎn)說(shuō)課稿
- 2024年六年級(jí)品社下冊(cè)《站在國(guó)際舞臺(tái)上》說(shuō)課稿 遼師大版001
- 6 推動(dòng)社會(huì)發(fā)展的印刷術(shù)(說(shuō)課稿)-2024-2025學(xué)年六年級(jí)上冊(cè)科學(xué)教科版(2017版)
- 2024年常德職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完整
- 天津市河?xùn)|區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 工程防滲漏培訓(xùn)課件
- 黑龍江省哈爾濱市2024年數(shù)學(xué)八年級(jí)下冊(cè)期末經(jīng)典試題含解析
- 克羅恩病的外科治療
- 牛津3000核心詞匯表注釋加音標(biāo)1-4 完整版
- 高中英語(yǔ)以讀促寫教學(xué)策略與實(shí)踐研究課件
- 金屬表面處理中的冷噴涂技術(shù)
- 河北省石家莊市2023-2024學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量檢測(cè)化學(xué)試題(解析版)
- 黑龍江省齊齊哈爾市2023-2024學(xué)年高一上學(xué)期1月期末英語(yǔ)試題(含答案解析)
- 綜合素質(zhì)能力提升培訓(xùn)
評(píng)論
0/150
提交評(píng)論