第一行程式碼-運用手機多媒體總結(下)
阿新 • • 發佈:2018-11-10
從相簿中選擇照片
第一步,開啟相簿
//判斷是否有許可權,沒有就申請開啟相簿的許可權,有則開啟相簿
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1);
} else {
openAlbum();//開啟相簿
}
//得到申請許可權的結果,使用者同意就開啟相簿,反之就顯示拒絕許可權無法開啟
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openAlbum();
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default :
}
}
//開啟相簿
private void openAlbum() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, 2); // 開啟相簿
}
第二步,根據手機不同版本執行不同的顯示照片的方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
...
case 2:
if (resultCode == RESULT_OK) {
// 判斷手機系統版本號
if (Build.VERSION.SDK_INT >= 19) {
// 4.4及以上系統使用這個方法處理圖片
handleImageOnKitKat(data);
} else {
// 4.4以下系統使用這個方法處理圖片
handleImageBeforeKitKat(data);
}
}
break;
default:
break;
}
}
handleImageOnKitKat(Intent data)
private void handleImageOnKitKat(Intent data) {
String imagePath = null;
Uri uri = data.getData();
Log.d("TAG", "handleImageOnKitKat: uri is " + uri);
if (DocumentsContract.isDocumentUri(this, uri)) {
// 如果是document型別的Uri,則通過document id處理
String docId = DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1]; // 解析出數字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
// 如果是content型別的Uri,則使用普通方式處理
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
// 如果是file型別的Uri,直接獲取圖片路徑即可
imagePath = uri.getPath();
}
displayImage(imagePath); // 根據圖片路徑顯示圖片
}
handleImageBeforeKitKat(Intent data)
private void handleImageBeforeKitKat(Intent data) {
Uri uri = data.getData();
String imagePath = getImagePath(uri, null);
displayImage(imagePath);
}
getImagePath(Uri uri, String selection)
private String getImagePath(Uri uri, String selection) {
String path = null;
// 通過Uri和selection來獲取真實的圖片路徑
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
displayImage(String imagePath)
private void displayImage(String imagePath) {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
}
}
播放音訊
下表為MediaPlayer類的一些常用方法
方法名 | 功能描述 |
---|---|
setDataSource() | 設定要播放的音訊檔案的位置 |
prepare() | 在開始播放前呼叫這個方法完成準備工作 |
start() | 開始或繼續播放音訊 |
pause() | 暫停播放音訊 |
reset() | 將MediaPlayer物件重置到剛剛建立的狀態 |
seekTo() | 從指定的位置開始播放音訊 |
stop() | 停止播放音訊 |
release() | 釋放掉與MediaPlayer物件相關的資源 |
isPlaying() | 判斷當前MediaPlayer是否正在播放音訊 |
getDuration() | 獲取載入的音訊檔案的時長 |
下面接著介紹怎麼播放手機上的音訊檔案
第一步,請求訪問SD卡的許可權
//判斷是否有許可權訪問SD卡,有則初始化MediaPlayer,無則請求授權
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1);
} else {
initMediaPlayer(); // 初始化MediaPlayer
}
...
//對請求結果進行處理
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
initMediaPlayer();
} else {
Toast.makeText(this, "拒絕許可權將無法使用程式", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
}
}
第二步,初始化MediaPlayer
private void initMediaPlayer() {
try {
File file = new File(Environment.getExternalStorageDirectory(), "music.mp3");
mediaPlayer.setDataSource(file.getPath()); // 指定音訊檔案的路徑
mediaPlayer.prepare(); // 讓MediaPlayer進入到準備狀態
} catch (Exception e) {
e.printStackTrace();
}
}
第三步,使用以下三個方法即可控制音訊的播放與暫停
mediaPlayer.start(); // 開始播放
mediaPlayer.pause(); // 暫停播放
mediaPlayer.reset(); // 停止播放
最後,在onDestroy()方法裡釋放MediaPlayer()的相關資源
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
並在AndroidManifest.xml中宣告用到的許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
播放視訊
下表為VideoView類的一些常用方法
方法名 | 功能描述 |
---|---|
setVideoPath() | 設定要播放的視訊檔案的位置 |
start() | 開始或繼續播放視訊 |
pause() | 暫停播放視訊 |
resume() | 將視訊從頭開始播放 |
seekTo() | 從指定的位置開始播放視訊 |
isPlaying() | 判斷當前是否正在播放視訊 |
getDuration() | 獲取載入的視訊檔案的時長 |
第一步仍然是申請訪問SD卡的許可權,這裡就不再重複了
第二步,初始化VideoView
private void initVideoPath() {
File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4");
videoView.setVideoPath(file.getPath()); // 指定視訊檔案的路徑
}
第三步,使用以下方法控制播放
videoView.start(); // 開始播放
videoView.pause(); // 暫停播放
videoView.resume(); // 重新播放
最後,在onDestroy()方法裡釋放VideoView()的相關資源
protected void onDestroy() {
super.onDestroy();
if (videoView != null) {
videoView.suspend();
}
}
同樣在AndroidManifest.xml中宣告用到的許可權
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>