1. 程式人生 > >Android 跳轉系統選擇本地視頻的功能

Android 跳轉系統選擇本地視頻的功能

選擇 打開文件 result 打開圖片 provide ati 迷你 nal 名稱

  今天在項目開發的過程中產品要求添加選擇本地視頻的功能,於是就翻閱和查找各種資料,進行功能的開發,但是在開發過程中發現,各種不同的品牌的手機跳轉至系統選擇本地視頻的功能結果不太一樣,所以我就對一些主流的品牌進行了測試,現做如下總結:

1.選擇本地視頻的功能

Button click event:

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(intent, REQUEST_VIDEO_CODE);


打開方式有兩種action,1.ACTION_PICK;2.ACTION_GET_CONTENT 區分大意為:ACTION_PICK 為打開特定數據一個列表來供用戶挑選,其中數據為現有的數據。而 ACTION_GET_CONTENT 區別在於它允許用戶創建一個之前並不存在的數據。
onActivityResult :
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_VIDEO_CODE) {
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                ContentResolver cr = this.getContentResolver();
                /** 數據庫查詢操作。
                 * 第一個參數 uri:為要查詢的數據庫+表的名稱。
                 * 第二個參數 projection : 要查詢的列。
                 * 第三個參數 selection : 查詢的條件,相當於SQL where。
                 * 第三個參數 selectionArgs : 查詢條件的參數,相當於 ?。
                 * 第四個參數 sortOrder : 結果排序。
                 */
                Cursor cursor = cr.query(uri, null, null, null, null);
                if (cursor != null) {
                    if (cursor.moveToFirst()) {
                        // 視頻ID:MediaStore.Audio.Media._ID
                        int videoId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
                        // 視頻名稱:MediaStore.Audio.Media.TITLE
                        String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
                        // 視頻路徑:MediaStore.Audio.Media.DATA
                        String videoPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
                        // 視頻時長:MediaStore.Audio.Media.DURATION
                        int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
                        // 視頻大小:MediaStore.Audio.Media.SIZE
                        long size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));

                        // 視頻縮略圖路徑:MediaStore.Images.Media.DATA
                        String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
                        // 縮略圖ID:MediaStore.Audio.Media._ID
                        int imageId = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));

                        // 方法一 Thumbnails 利用createVideoThumbnail 通過路徑得到縮略圖,保持為視頻的默認比例
                        // 第一個參數為 ContentResolver,第二個參數為視頻縮略圖ID, 第三個參數kind有兩種為:MICRO_KIND和MINI_KIND 字面意思理解為微型和迷你兩種縮略模式,前者分辨率更低一些。
                        Bitmap bitmap1 = MediaStore.Video.Thumbnails.getThumbnail(cr, imageId, MediaStore.Video.Thumbnails.MICRO_KIND, null);

                        // 方法二 ThumbnailUtils 利用createVideoThumbnail 通過路徑得到縮略圖,保持為視頻的默認比例
                        // 第一個參數為 視頻/縮略圖的位置,第二個依舊是分辨率相關的kind
                        Bitmap bitmap2 = ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MICRO_KIND);
                        // 如果追求更好的話可以利用 ThumbnailUtils.extractThumbnail 把縮略圖轉化為的制定大小
//                        ThumbnailUtils.extractThumbnail(bitmap, width,height ,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
                        setText(tv_VideoPath, R.string.path, videoPath);
                        setText(tv_VideoDuration, R.string.duration, String.valueOf(duration));
                        setText(tv_VideoSize, R.string.size, String.valueOf(size));
                        setText(tv_VideoTitle, R.string.title, title);
                        iv_VideoImage.setImageBitmap(bitmap1);
                    }
                    cursor.close();
                }
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
2.選擇本地視頻的功能 1.選擇本地視頻的功能
2.請求系統相冊有三個Action:

(註意以下 圖庫(縮略圖) 和 圖片(原圖) 的區別)


ACTION_OPEN_DOCUMENT 僅限4.4或以上使用 默認打開原圖
ACTION_GET_CONTENT 4.4以下默認打開縮略圖 。 以上打開文件管理器 供選擇,選擇圖庫打開為縮略圖頁面,選擇圖片打開為原圖瀏覽。
ACTION_PICK 都可用,打開默認是縮略圖界面,還需要進一步點開查看。

下面會詳細介紹他們在不同版本系統中的測試結果區別:

測試系統:adroid 4.4.2 夜神模擬器
content://com.android.providers.media.documents/document/image%3A1372>>ACTION_OPEN_DOCUMENT從圖片獲取,打開是文件管理器的圖片選擇器,但是只能選擇圖片不能選圖庫,也不能選擇其他文件
content://com.android.providers.media.documents/document/image%3A1372>>ACTION_GET_CONTENT從圖片獲取 打開的還是文件管理器,可以選擇圖庫也可以選擇圖片
content://media/external/images/media/1372>>>>>>>>》》》ACTION_GET_CONTENT從圖庫獲取
content://media/external/images/media/1541>>>>>>>>》》》》ACTION_PICK默認打開圖庫,沒法選擇圖庫還是圖片

綜上: uri只跟 圖庫還是圖片選擇有關,跟action無關,是選擇圖片還是圖庫才跟action有關

測試系統: android 4.4.4
ACTION_OPEN_DOCUMENT ACTION_GET_CONTENT都是直接打開圖片,頁面比較漂亮
ACTION_PICK默認打開圖庫,界面比較醜

測試系統:android 6.0 華為
content://com.android.providers.media.documents/document/image%3A35144>>>ACTION_OPEN_DOCUMENT 不可選圖庫還是圖片
content://com.android.providers.media.documents/document/image%3A176> ACTION_GET_CONTENT選擇圖片中的
content://media/external/images/media/35144>>>>>>>>》》》》ACTION_GET_CONTENT選擇圖庫中的
content://media/external/images/media/35144>>>>>>>>》》》》》ACTION_PICK默認打開圖庫,沒法選擇圖庫還是圖片

測試系統:android4.2.1 華為
ACTION_GET_CONTENT 彈出圖庫和文件管理器,供選擇
ACTION_OPEN_DOCUMENT 直接崩,不能使用
ACTION_PICK 直接打開圖庫


綜上得出 :
結論一:
ACTION_OPEN_DOCUMENT 直接打開的是圖片
ACTION_GET_CONTENT 打開後可選擇是圖庫獲取還是圖片獲取
ACTION_PICK 直接打開的就是圖庫
結論二:
從圖片獲取到的uri 格式為:content://com.android.providers.media.documents/document/image%3A35144>>>
cong圖庫獲取到的uri格式為:content://media/external/images/media/35144>>>>>>
結論三:
4.4.4以上版本android系統,圖片的界面比圖庫的界面好看。

結論四:
content://media/external/images/media/35144這種格式,轉換成路徑後可以直接用
content://com.android.providers.media.documents/document/image%3A35144這種格式,轉換成路徑後不能直接用。

結論五:
ACTION_OPEN_DOCUMENT不能在android4.4以下版本用,否則會crash,我的低版本手機系統有問題,沒辦法打印log所以看不到崩潰原因,猜測是取不到數據,報空

3.結果:
魅族手機調用ACTION_PICK
ACTION_PICK 打開圖庫後沒有視頻,一加手機也沒有,但一加手機在回調中獲取不到path,提示cusor中沒有_data字段,華為、小米、oppo、vivo手機正常

Android 跳轉系統選擇本地視頻的功能