今天在項目開發的過程中產品要求添加選擇本地視頻的功能,於是就翻閱和查找各種資料,進行功能的開發,但是在開發過程中發現,各種不同的品牌的手機跳轉至系統選擇本地視頻的功能結果不太一樣,所以我就對一些主流的品牌進行了測試,現做如下總結:
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.選擇本地視頻的三個ACTION及使用
ACTION_OPEN_DOCUMENT 僅限4.4或以上使用 默認打開原圖
ACTION_GET_CONTENT 4.4以下默認打開縮略圖 。 以上打開文件管理器 供選擇,選擇圖庫打開為縮略圖頁面,選擇圖片打開為原圖瀏覽。
ACTION_PICK 都可用,打開默認是縮略圖界面,還需要進一步點開查看。
下面會詳細介紹他們在不同版本系統中的測試結果區別:
測試系統: 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.總結
在項目開發過程中使用oppo、vivo、華為、小米使用ACTION_PICK
均顯示正常,魅族和一加手機不可以,魅族手機使用ACTION_GET_CONTENT可以,但一加手機在onActivityResult中cursor中提示沒有_data字段,導致閃退(沒有解決)。總之,其實不同
品牌的手機調取系統圖庫顯示不盡相同,要不就是打開不顯示視頻,要不就是在onActivityResult中返回的uri轉換成cursor沒有_data字段導致崩潰,故還是查詢數據庫自己寫一個列表來的好(后續嘗試一下)
備注:
獲取本地視頻及圖片列表可以參考:http://www.jb51.net/article/115459.htm
by Wang Xiaotao