1. 程式人生 > >第一行程式碼-運用手機多媒體總結(下)

第一行程式碼-運用手機多媒體總結(下)

從相簿中選擇照片

第一步,開啟相簿

//判斷是否有許可權,沒有就申請開啟相簿的許可權,有則開啟相簿
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"/>