Android移動(dòng)應(yīng)用開(kāi)發(fā)基礎(chǔ)教程第6章_第1頁(yè)
Android移動(dòng)應(yīng)用開(kāi)發(fā)基礎(chǔ)教程第6章_第2頁(yè)
Android移動(dòng)應(yīng)用開(kāi)發(fā)基礎(chǔ)教程第6章_第3頁(yè)
Android移動(dòng)應(yīng)用開(kāi)發(fā)基礎(chǔ)教程第6章_第4頁(yè)
Android移動(dòng)應(yīng)用開(kāi)發(fā)基礎(chǔ)教程第6章_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android移動(dòng)應(yīng)用開(kāi)發(fā)基礎(chǔ)教程講授:XXXXX第6章 多媒體本章主要內(nèi)容:播放多媒體文件記錄聲音使用攝像頭和相冊(cè)6.1播放多媒體文件 手機(jī)已經(jīng)成為日常人們聽(tīng)音樂(lè)和看電影的工具。Android提供了完整的API用于播放多媒體文件,使開(kāi)發(fā)人員可以輕松實(shí)現(xiàn)簡(jiǎn)易的音頻和視頻播放APP。本節(jié)主要內(nèi)容:使用SoundPool播放音效使用MediaPlay播放音頻使用MediaPlayer播放視頻6.1.1 使用SoundPool播放音效SoundPool類(lèi)可用于管理和播放應(yīng)用中的音頻資源。這些音頻資源即可實(shí)現(xiàn)包含在應(yīng)用程序中,也可存放于存儲(chǔ)器文件中。通常,SoundPool類(lèi)只用于播放較短的音頻,比如

2、游戲中的各種音效。要使用SoundPool播放音頻,首先需創(chuàng)建SoundPool對(duì)象。例如:(實(shí)例項(xiàng)目:源代碼06UseSoundPool)if (Build.VERSION.SDK_INT = 21) SoundPool.Builder builder = new SoundPool.Builder(); builder.setMaxStreams(2);/設(shè)置可加載的音頻數(shù)量 /AudioAttributes是一個(gè)封裝音頻各種屬性的方法 AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder(); attrBuil

3、der.setLegacyStreamType(AudioManager.STREAM_MUSIC);/預(yù)設(shè)音頻類(lèi)型 builder.setAudioAttributes(attrBuilder.build();/設(shè)置音頻類(lèi)型 sp = builder.build();/創(chuàng)建SoundPool對(duì)象else /當(dāng)系統(tǒng)的SDK版本小于21時(shí) sp = new SoundPool(2, AudioManager.STREAM_SYSTEM, 0);在API 21(Android 5.0))之后的版本中,SoundPool()構(gòu)造方法已經(jīng)過(guò)時(shí)了,需用SoundPool.Builder來(lái)創(chuàng)建SoundP

4、ool對(duì)象。SoundPool.Builder對(duì)象可執(zhí)行setMaxStreams()方法設(shè)置SoundPool對(duì)象中可加載的最大音頻數(shù)量。setAudioAttributes()方法則用于設(shè)置音頻的類(lèi)型。SoundPool()構(gòu)造方法的第一個(gè)參數(shù)為可加載音頻最大數(shù)量,第二個(gè)參數(shù)為音頻類(lèi)型,第三個(gè)參數(shù)為聲音品質(zhì)(目前無(wú)效,用0表示默認(rèn)值)。獲得SoundPool對(duì)象后,首先應(yīng)調(diào)用load()方法加載音頻資源。load()方法基本格式如下:int load(Context context, int resId, int priority)int load(String path, int pri

5、ority)int load(AssetFileDescriptor afd, int priority)int load(FileDescriptor fd, long offset, long length, int priority)其中,context為當(dāng)前應(yīng)用上下文。resId事先存放到應(yīng)用的res/raw文件中的音頻文件的資源ID。priority為優(yōu)先級(jí),目前無(wú)效,1用于與未來(lái)版本兼容。path為存儲(chǔ)器中音頻文件的路徑。AssetFileDescriptor為音頻asset文件的描述符。在將多個(gè)音頻存放在一個(gè)二進(jìn)制文件中時(shí),F(xiàn)ileDescriptor為該音頻文件的描述符,off

6、set指定加載的因?yàn)樵谖募械拈_(kāi)始位置,length指定音頻長(zhǎng)度。load()方法返回值為加載的音頻的ID,在調(diào)用其他方法播放、暫停或其他操作處理音頻時(shí),用音頻ID作為參數(shù)。調(diào)用load()方法準(zhǔn)備好音頻資源后,可調(diào)用play()方法來(lái)播放音頻。play()方法基本格式如下:play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)其中soundID為load()方法加載音頻資源時(shí)返回的ID。leftVolume和rightVolume分別為左聲道音量和右聲道音量,取值范圍

7、0.01.0。priority為優(yōu)先級(jí),0為最低級(jí)。loop為重復(fù)次數(shù),0表示不重復(fù)。Rate為播放速率,取值范圍0.52.0,1.0為正常播放速度。例如,下面的語(yǔ)句播放soundId1對(duì)應(yīng)的音頻。sp.play(soundId1,1,1,1,0,1);其他SoundPool常用方法如下。pause(int streamID):暫停播放。release():釋放SoundPool中加載的音頻資源。resume(int streamID):繼續(xù)播放暫停的音頻。setLoop(int streamID, int loop):設(shè)置重復(fù)播放次數(shù)。setVolume(int streamID, floa

8、t leftVolume, float rightVolume):設(shè)置音量。stop(int streamID):停止播放。unload(int soundID):卸載SoundPool中的音頻資源。6.1.2 使用MediaPlay播放音頻MediaPlay類(lèi)提供了音頻和視頻播放功能,本節(jié)先學(xué)習(xí)用其播放音頻。MediaPlay類(lèi)比SoundPool類(lèi)提供了更多的音頻控制功能,支持更多的音頻格式。在使用MediaPlay對(duì)象處理音頻時(shí),音頻可處于多種狀態(tài),如圖6-1所示(該圖引用自:/reference/android/media/MediaPlayer.html)在調(diào)用MediaPlay對(duì)象

9、方法時(shí),音頻可在相應(yīng)的不同狀態(tài)之間進(jìn)行轉(zhuǎn)換。MediaPlay音頻控制常用方法getCurrentPosition:獲得當(dāng)前播放位置。getDuration:獲得音頻時(shí)長(zhǎng)。isPlaying:判斷是否處于播放狀態(tài)。pause:暫停播放。prepare:準(zhǔn)備音頻。本地音頻通常不需要準(zhǔn)備,遠(yuǎn)程音頻通過(guò)準(zhǔn)備完成下載和本地緩沖。release:釋放MediaPlayer對(duì)象資源。MediaPlay音頻控制常用方法reset:恢復(fù)MediaPlayer對(duì)象到剛創(chuàng)建狀態(tài)。seekTo:設(shè)置播放位置。setDataSource:設(shè)置音頻文件位置。setVolume:設(shè)置音量。start:開(kāi)始播放。stop:

10、停止播放。使用MediaPlay播放音頻的基本步驟創(chuàng)建MediaPlay對(duì)象。調(diào)用setDataSource方法設(shè)置音頻文件路徑。調(diào)用prepare方法加載音頻。調(diào)用start方法播放音頻。調(diào)用pause方法暫停正在播放的音頻。調(diào)用stop方法停止播放,調(diào)用reset方法重置MediaPlay到剛創(chuàng)建時(shí)的狀態(tài)。6.1.3 使用MediaPlayer播放視頻MediaPlayer即可用于播放音頻,也可用于播放視頻,在用法上沒(méi)有多大區(qū)別。只是在播放視頻時(shí),應(yīng)使用SurfaceView控件作為視頻的顯示容器。下面通過(guò)具體的例子說(shuō)明如何使用MediaPlayer播放視頻(上一小節(jié)中的UseMediaP

11、lay實(shí)例略加修改即可用于播放視頻)。(實(shí)例項(xiàng)目:源代碼06UseMediaPlay2)6.2記錄聲音MediaRecorder類(lèi)提供了音頻采集功能,使開(kāi)發(fā)者可使用設(shè)備的麥克風(fēng)記錄聲音。要在應(yīng)用中實(shí)現(xiàn)音頻采集功能,首先需要在應(yīng)用程序的清單文件AndroidManifest.xml添加RECORD_AUDIO權(quán)限申請(qǐng)使用麥克風(fēng)。例如:Android系統(tǒng)認(rèn)為使用RECORD_AUDIO權(quán)限記錄用戶(hù)聲音隱私,是一種“危險(xiǎn)”行為。在從Android 6.0(API 23)開(kāi)始,需要在應(yīng)用程序運(yùn)行時(shí)動(dòng)態(tài)向用戶(hù)申請(qǐng)RECORD_AUDIO權(quán)限。用戶(hù)授權(quán)后,應(yīng)用可記錄授權(quán),不再重復(fù)詢(xún)問(wèn)。通常,調(diào)用Activ

12、ityCompat.requestPermissions()方法來(lái)動(dòng)態(tài)申請(qǐng)權(quán)限。修改activity_main.xml主活動(dòng)布局 MainActivity.java,為各個(gè)按鈕添加單擊事件監(jiān)聽(tīng)器,實(shí)現(xiàn)音頻的采集和播放控制protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFileName = getExternalCacheDir().getAbsolutePath(); mFileName

13、+= /audiorecord.3gp; /檢查應(yīng)用是否已經(jīng)獲得授權(quán) if(ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) /如果沒(méi)有權(quán)限,動(dòng)態(tài)申請(qǐng)授權(quán) ActivityCompat.requestPermissions(this, new StringManifest.permission.RECORD_AUDIO,1); else initMediaRecorder(); Button btStartRecord=

14、(Button) findViewById(R.id.btStartRecord); btStartRecord.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) /開(kāi)始錄音 try mediaRecorder.prepare();/準(zhǔn)備MediaRecorder catch (IOException e) Log.e(LOG_TAG, 準(zhǔn)備MediaRecorder出錯(cuò)啦!); mediaRecorder.start();/開(kāi)始采集音頻 );Button btStopRecor

15、d= (Button) findViewById(R.id.btStopRecord); btStopRecord.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) /停止錄音 mediaRecorder.stop();/停止MediaRecorder mediaRecorder.release();/釋放MediaRecorder所占資源 mediaRecorder = null; );Button btStartPlay= (Button) findViewById(R.id

16、.btPlay); btStartPlay.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) /開(kāi)始播放 mediaPlayer = new MediaPlayer(); try mediaPlayer.setDataSource(mFileName);/設(shè)置要播放的音頻文件 mediaPlayer.prepare(); mediaPlayer.start(); catch (IOException e) Log.e(LOG_TAG, MediaPlayer方法prepare()

17、執(zhí)行失??!); );Button btStop= (Button) findViewById(R.id.btStop); btStop.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) /停止播放 mediaPlayer.release(); mediaPlayer = null; );public void onRequestPermissionsResult(int requestCode, NonNull String permissions, NonNull int gr

18、antResults) if(requestCode=1) if(grantResults.length0 & grantResults0= PackageManager.PERMISSION_GRANTED) initMediaRecorder();/初始化 else Toast.makeText(this,未獲得麥克風(fēng)訪(fǎng)問(wèn)權(quán)限, Toast.LENGTH_LONG).show(); finish(); private void initMediaRecorder() /初始化MediaRecorder mediaRecorder = new MediaRecorder(); mediaRe

19、corder.setAudioSource(MediaRecorder.AudioSource.MIC);/設(shè)置音頻來(lái)源,使用麥克風(fēng) mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);/設(shè)置輸出格式 mediaRecorder.setOutputFile(mFileName);/設(shè)置音頻輸出文件 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);/設(shè)置音頻編碼方式 protected void onDestroy() /應(yīng)用停止時(shí)

20、,釋放資源 if (mediaRecorder != null) mediaRecorder.release(); mediaRecorder = null; if (mediaPlayer != null) mediaPlayer.release(); mediaPlayer = null; super.onDestroy(); 6.3使用攝像頭和相冊(cè) 在常用通訊軟件(如QQ、微信等)中,經(jīng)常需要分享圖片,下、這些圖片可來(lái)自于相冊(cè)或者攝像頭拍攝。本節(jié)主要內(nèi)容:使用攝像頭拍攝相片選取相冊(cè)圖片6.3.1 使用攝像頭拍攝相片要使用攝像頭拍攝下相片,最簡(jiǎn)單的方式就是調(diào)用系統(tǒng)拍照程序。創(chuàng)建一個(gè)動(dòng)作為M

21、ediaStore.ACTION_IMAGE_CAPTURE的Intent對(duì)象,執(zhí)行startActivityForResult()啟動(dòng)系統(tǒng)拍照程序,即可使用攝像頭進(jìn)行拍照。下面通過(guò)一個(gè)例子說(shuō)明如何調(diào)用系統(tǒng)拍照程序完成拍照,并顯示拍攝的相片。具體操作步驟如下。(實(shí)例項(xiàng)目:源代碼06UseSystemCameraApp)在AndroidManifest.xml文件中申請(qǐng)權(quán)限 修改MainActivity.java,實(shí)現(xiàn)拍照和相片顯示 protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceSta

22、te); setContentView(R.layout.activity_main); /使用StrictMode.VmPolicy.Builder檢測(cè)應(yīng)用中的FileUriExposure事件 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build(); builder.detectFileUriExposure();Button btTakePhoto= (Button) findViewById(R.id.btTakePho

23、to); btTakePhoto.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) try /創(chuàng)建用于保存所拍照片的文件 File sdcard = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); picFile = new File(sdcard, System.currentTimeMillis() + .jpg); picFile.createNewFile();

24、 Log.e(UseSystemCameraApp,picFile.getName()+創(chuàng)建成功!); catch(IOException e) e.printStackTrace(); /使用Intent調(diào)用系統(tǒng)攝像頭拍照程序 Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(picFile); startActivityForResult(intent,1);protected void onActivityResu

25、lt(int requestCode, int resultCode, Intent data) if(requestCode=1) /處理ActivityResult調(diào)用返回,將所拍照片顯示在ImageView中 ImageView iv=(ImageView)findViewById(R.id.ivShow); iv.setImageURI(Uri.fromFile(picFile); super.onActivityResult(requestCode, resultCode, data); 6.3.2 選取相冊(cè)圖片選取相冊(cè)圖片與使用系統(tǒng)拍照程序拍照類(lèi)似,使用Android內(nèi)置的Activity即可完成。將上一節(jié)中的實(shí)例項(xiàng)目UseSystemCameraApp略加修改實(shí)現(xiàn)相冊(cè)圖片選擇。(實(shí)例項(xiàng)目:源代碼06Sele

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論