## 第十三天.Android多媒體開發 ##
### 13.1 播放音樂 ###
#### 13.1.1 多媒體架構 ####
+ 基于第三方Packet Video公司的Open Core platform實現
+ 支持幾乎所有通用的音頻、視頻、靜態圖像格式,包括:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等。
+ 通過Open Core程序員可以方便快速的開發出想要的多媒體應用程序,例如:音視頻的采集,回放,視頻會議,實時的流媒體播放等應用。
+ Android提供了MediaPlayer和MediaRecorder等上層的Media API給開發人員使用。
+ Open Core的代碼在Android代碼的External/Opencore目錄中。
#### 13.1.2 Open Core框架 ####

#### 13.1.3 調用層次關系 ####

#### 13.1.4 音樂播放 ####
```
MediaPlayer mediaPlayer = newMediaPlayer();
if (mediaPlayer.isPlaying()) {
mediaPlayer.reset(); //重置為初始狀態
}
mediaPlayer.setDataSource("/sdcard/good.mp3");
mediaPlayer.prepare(); //緩沖
mediaPlayer.start(); //開始或恢復播放
mediaPlayer.pause(); //暫停播放
mediaPlayer.start(); //恢復播放
mediaPlayer.stop(); //停止播放
mediaPlayer.release(); //釋放資源
mediaPlayer.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer arg0) { //播放完畢調用
mediaPlayer.release();
} });
mediaPlayer.setOnErrorListener(newMediaPlayer.OnErrorListener() { // 錯誤處理事件
public boolean onError(MediaPlayer player, int arg1, int arg2) {
mediaPlayer.release();
returnfalse;
} });
```
### 13.2 播放視頻 ###
#### 13.2.1 播放視頻 ####
```
/* 創建VideoView對象 */
final VideoView videoView = (VideoView)findViewById(R.id.VideoView01);
/*設置視頻路徑*/
videoView.setVideoPath("/sdcard/test.mp4");
/* 設置模式-播放進度條 */
videoView.setMediaController(new MediaController(Activity01.this));
videoView.requestFocus();
/* 開始播放 */
videoView.start();
/* 暫停 */
videoView.pause();
```
#### 13.2.2 音樂/視頻播放案例 ####
+ 音樂播放案例
MediaPlayerDemo
+ 視頻播放案例
VideoViewDemo
### 13.3 錄制音頻 ###
#### 13.3.1 實現錄音功能 ####
第一步:在功能清單文件AndroidManifest.xml中添加錄音與寫sdcard權限:
```
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```
第二步:編寫音頻刻錄代碼:
```
MediaRecorder recorder = newMediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//從麥克風采集聲音
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//內容輸出格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//音頻編碼方式
recorder.setOutputFile("/sdcard/lxt008.amr");
recorder.prepare(); //預期準備
recorder.start(); //開始刻錄
...
recorder.stop(); //停止刻錄
recorder.reset(); //重設
recorder.release(); //刻錄完成一定要釋放資源
```
#### 13.3.2 音視頻采集 ####
第一步:在功能清單文件AndroidManifest.xml中添加照相機權限:
```
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CAMERA"/>
```
第二步:編寫拍照代碼:
```
WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);//獲取窗口服務
Display display =wm.getDefaultDisplay();//獲取屏幕信息
recorder = new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//從照相機采集視頻
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoSize(display.getWidth(),display.getHeight()); //大小為屏幕的寬和高
recorder.setVideoFrameRate(3); //每秒3幀
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);//設置視頻編碼方式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/lxt008.3gp");
recorder.prepare();//預期準備
recorder.start(); //開始刻錄
...
recorder.stop();//停止刻錄
recorder.reset(); //重設
recorder.release(); //刻錄完成一定要釋放資源
```
### 13.4 拍攝照片 ###
#### 13.4.1 錄音/拍照案例 ####
+ 錄音案例
RecordAudioDemo
+ 拍照案例
CameraDemo
### 13.5 鈴聲設置 ###
#### 13.5.1 鈴聲設置:設置各種鈴聲 ####
```
//打開系統鈴聲設置
Intent intent = newIntent(RingtoneManager.ACTION_RINGTONE_PICKER);
//設置鈴聲類型和title
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_RINGTONE);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,“設置來電鈴聲");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_ALARM);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,"設置鬧鈴鈴聲");
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,"設置通知鈴聲");
//當設置完成之后返回到當前的Activity
startActivityForResult(intent,ButtonAlarm);
```
#### 13.5.2 鈴聲設置:回調函數 ####
```
/* 當設置鈴聲之后的回調函數 */
protected void onActivityResult(intrequestCode, int resultCode, Intent data){
//得到我們選擇的鈴聲
Uri pickedUri =data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
//將我們選擇的鈴聲設置成為默認
RingtoneManager.setActualDefaultRingtoneUri(Activity01.this,RingtoneManager.TYPE_RINGTONE, pickedUri);
Uri pickedUri =RingtoneManager.setActualDefaultRingtoneUri(Activity01.this,RingtoneManager.TYPE_ALARM, pickedUri);
RingtoneManager.setActualDefaultRingtoneUri(Activity01.this,RingtoneManager.TYPE_NOTIFICATION, pickedUri);
}
```
#### 13.5.3 鈴聲設置:main.xml ####
```
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent" >
<TextView
android:id="@+id/TextView01"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="選擇下面按鈕來設置鈴聲" />
<Button
android:id="@+id/ButtonRingtone"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="設置來電鈴聲" />
<Button
android:id="@+id/ButtonAlarm"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="設置鬧鐘鈴聲" />
<Button
android:id="@+id/ButtonNotification"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="設置通知鈴聲" />
</LinearLayout>
```
#### 13.5.4 鈴聲設置:AndroidManifest.xml ####
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yarin.android.Examples_07_08"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Activity01"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-sdk android:minSdkVersion="7" />
</manifest>
```
研究案例RingtoneManagerDemo
[實例下載](http://www.apkbus.com/android-83552-1-1.html)