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

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

Android 跳转系统选择本地视频的功能的更多相关文章

  1. Android跳转系统界面_大全集

    1.跳转Setting应用列表(所有应用) Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS); ...

  2. Android [VP]视频播放器播放本地视频时收到短信/彩信,需要界面提示 M

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  3. Android分享---调用系统自带的分享功能

    以前我们总想到友盟等平台分享功能的集成,集成这玩意还得下载对应的jar包.当然,用这些平台的分享并不是说什么好处都没有,至少人家的统计功能还是很实用的.不过有的时候我们是不需要多余功能的,只需要能分享 ...

  4. Android 实现调用系统拍照相册,剪切功能

    1.XML布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  5. (转)在WinForm中选择本地文件

    相信很多朋友在日常的编程中总会遇到各钟各样的问题,关于在WinForm中选择本地文件就是很多朋友们都认为很难的一个学习.net的难点, 在WebForm中提供了FileUpload控件来供我们选择本地 ...

  6. 【.Net】在WinForm中选择本地文件

    相信很多朋友在日常的编程中总会遇到各钟各样的问题,关于在WinForm中选择本地文件就是很多朋友们都认为很难的一个学习.net的难点, 在WebForm中提供了FileUpload控件来供我们选择本地 ...

  7. Android中webview html5 自动播放本地视频

    MainActivity代码 public class Html5VideoAutoPlay extends Activity { WebView webview = null; @Override ...

  8. Android开发 MediaPlayer入门_播放本地视频

    前言 MediaPlayer,可以播放视频/音频,并且它支持本地和网络文件的播放.本片博客作为入门教程,先以最通俗的方式解释播放文件本地视频.(如果你嫌MediaPlayer还是太麻烦可以试试选择Vi ...

  9. Android WebView 实现文件选择、拍照、录制视频、录音

    原文地址:Android WebView 实现文件选择.拍照.录制视频.录音 | Stars-One的杂货小窝 Android中的WebView如果不进行相应的设置,H5页面的上传按钮是无法触发And ...

随机推荐

  1. JMeter元件的作用域和执行顺序

    元件的作用域 配置元件:会影响其作用范围内的所有元件,作用范围是最大的,只要创建就对所有元件起作用. 前置处理器:在其作用范围内的每一个Sample元件之前执行: 定时器:对其作用范围内的每一个Sam ...

  2. 关于MVC项目中的主管放行

    一线程序员和 sa 总是相恨相杀,这话确实不假,吐槽这里就不多讲,项目快开发完的时候,让之前各个模块的增删改的操作全部都先放入对应的临时表(增加一状态栏位Status,来表示增.删.改)中,然后在主管 ...

  3. 【Hadoop】NameNode

    一.背景介绍 当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(partition)并存储到多台单独的计算机上.管理网络中跨多台计算机存储的文件系统称为分布式文件系统(dist ...

  4. 一句话搞定-phpStudy安装yaf扩展

    首先下载phpStudyX64位的,然后傻瓜式安装,安装完下载yaf,由于yaf扩展的网站在国外很难下载,需要FQ,所以我这里下载了yaf5.6nts.zip,解压后把php_yaf.dll这个文件粘 ...

  5. Java中的i=i++

    public class Demo_01 { public static void main(String[] args) { int a = 10; int b = 20; int i = 0; i ...

  6. Spark Structured Streaming框架(2)之数据输入源详解

    Spark Structured Streaming目前的2.1.0版本只支持输入源:File.kafka和socket. 1. Socket Socket方式是最简单的数据输入源,如Quick ex ...

  7. 关于package.json的理解

    在我们打包项目的时候或者使用node的时候,常常会看到package.json这个文件,里面乱七八糟的一大堆json,开始的时候没注意,以为是使用node或者npm的时候自动创建的,后来自己写demo ...

  8. Tomcat迁移到WebsphereURL获取中文参数乱码问题

    URL携带中文参数时,tomcat通常用两种方法可以解决中文乱码问题: String param = new String(request.getParameter("param " ...

  9. JDK源码阅读——ArrayList

    序 如同C语言中字符数组向String过渡一样,作为面向对象语言,自然而然的出现了由Object[]数据形成的集合.本文从JDK源码出发简单探讨一下ArrayList的几个重要方法. Fields / ...

  10. JavaScript在应用中的技巧(一)

    分享一些在JavaScript中遇到的一些实用的技巧. 理解JavaScript的数值型数据类型 JavaScript的数值型数据类型只有一种:number.即不管是整数还是浮点数,JavaScrip ...