码迷,mamicode.com
首页 > 移动开发 > 详细

Android 跳转系统选择本地视频的功能

时间:2017-09-11 11:06:22      阅读:462      评论:0      收藏:0      [点我收藏+]

标签:sso   cte   request   int   不同   void   asm   方法   audio   

  今天在项目开发的过程中产品要求添加选择本地视频的功能,于是就翻阅和查找各种资料,进行功能的开发,但是在开发过程中发现,各种不同的品牌的手机跳转至系统选择本地视频的功能结果不太一样,所以我就对一些主流的品牌进行了测试,现做如下总结:

    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_PICKACTION_PICK 打开图库后没有视频,一加手机也没有,但一加手机在回调中获取不到path,提示cusor中没有_data字段,华为、小米、oppo、vivo手机正常

Android 跳转系统选择本地视频的功能

标签:sso   cte   request   int   不同   void   asm   方法   audio   

原文地址:http://www.cnblogs.com/widgetbox/p/7503894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!