今天我在做视频编辑的时候,遇到了这个问题,前后用了1个小时来发现并解决了这个问题,因为我一直认为是我记错了,后来发现,华为P6用的是Android4.4系统,然后我就恍然了。。。

首先说说我在做什么,我在弄一个拍摄完视频之后,编辑视频的一个东东,这个东东其实不难,源码里有,你们是不是不敢信?!在android源码android.media.videoeditor中有videoeditor这个类,这个其实就是谷歌写的编辑视频的东东,他底层调用了几个C++写的lib库,这些库谷歌也都写好了,我们调用下他即可,然后我在编辑视频的时候,要添加铃声,根据我写的uri获取路径的时候,一直返回null,好奇怪,最后发现华为P6用了4.4系统。。。下面不罗嗦了,直接上代码。

这里先看下4.4之前的uri的形式:

Uri : content://media/extenral/images/media/17766

是不是很熟悉?

再看4.4及以后的Uri形式:

content://com.android.providers.media.documents/document/image%2706

我打印出来当时就爆粗口了,这什么东西?!在看P6的系统,果然,4.4的。

这就好说了,然后翻了翻API,发现4.4以后的Uri还不唯一,并不是统一的一种格式,所以就来个通用方法好了

4.4以前通过Uri获取路径:

data是uri,filename是一个String的字符串,用来保存路径。

if (data.getScheme().toString().compareTo("content") == 0) {cursor = getContentResolver().query(data,new String[] {Audio.Media.DATA}, null, null, null);if (cursor.moveToFirst()) {filename = cursor.getString(0);}}else if (data.getScheme().toString().compareTo("file") == 0)         //file:///开头的uri{filename = data.toString();filename = data.toString().replace("file://", "");//替换file://if(!filename.startsWith("/mnt")){//加上"/mnt"头filename += "/mnt"; }}

4.4以后根据Uri获取路径:

public class GetPathFromUri4kitkat {/*** 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使*/@SuppressLint("NewApi")public static String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// DocumentProviderif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (isExternalStorageDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {return Environment.getExternalStorageDirectory() + "/" + split[1];}// TODO handle non-primary volumes}// DownloadsProviderelse if (isDownloadsDocument(uri)) {final String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));return getDataColumn(context, contentUri, null, null);}// MediaProviderelse if (isMediaDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[] { split[1] };return getDataColumn(context, contentUri, selection, selectionArgs);}}// MediaStore (and general)else if ("content".equalsIgnoreCase(uri.getScheme())) {return getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}/*** Get the value of the data column for this Uri. This is useful for* MediaStore Uris, and other file-based ContentProviders.* * @param context*            The context.* @param uri*            The Uri to query.* @param selection*            (Optional) Filter used in the query.* @param selectionArgs*            (Optional) Selection arguments used in the query.* @return The value of the _data column, which is typically a file path.*/public static String getDataColumn(Context context, Uri uri, String selection,String[] selectionArgs) {Cursor cursor = null;final String column = "_data";final String[] projection = { column };try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,null);if (cursor != null && cursor.moveToFirst()) {final int column_index = cursor.getColumnIndexOrThrow(column);return cursor.getString(column_index);}} finally {if (cursor != null)cursor.close();}return null;}/*** @param uri*            The Uri to check.* @return Whether the Uri authority is ExternalStorageProvider.*/public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/*** @param uri*            The Uri to check.* @return Whether the Uri authority is DownloadsProvider.*/public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/*** @param uri*            The Uri to check.* @return Whether the Uri authority is MediaProvider.*/public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}
}

这部分代码借鉴了网上的一些例子,亲测可用,欢迎copy。

来源地址:

http://www.2cto.com/kf/201502/376975.html

Android 4.4 kitkat以上及以下根据uri获取路径的方法相关推荐

  1. android pdf生成 路径,android – 如何从指向PDF文档的URI获取文件路径?

    现在我的代码打开了默认下载视图,它只显示我下载的PDF.我选择了一个PDF文件,我得到了这个: content://com.android.providers.downloads.documents/ ...

  2. Android 4.4 KitKat, the browser and the Chrome WebView

    Having V8 as the JavaScript engine for the new web view, the JavaScript performance if much better, ...

  3. linux+4.4+android,Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法

    Ubuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法跟Ubuntu 12.04 - 13.10 以及jellybean编译环境配置没多大区别, 顺便记录下而已: 64 ...

  4. 做好准备,让你的短信应用迎接Android 4.4(KitKat)

    博主参加了2013博客之星评选,谢谢你的的支持,投票猛击: http://vote.blog.csdn.net/blogstaritem/blogstar2013/xyz_lmn Android团队通 ...

  5. [Android各版本特性]Android 4.4 Kitkat

    [Android各版本特性]专栏目录: 01. Android API 版本对照表 02. Android 4.4以前版本特性 03. 为什么以Android4.4做分界线 04. Android 4 ...

  6. 安卓4.4刷linux系统下载,在Linux上安装Android 4.4 KitKat

    Android (x86)项目致力于移植Android系统到X86处理器上,使用户可以更容易的在任何电脑上安装Android.他们通过使用android源码,增加补丁来使Android能够在X86处理 ...

  7. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 10

    我的android项目之前一直运行正常的,没有错误: 今天看源码,svn管理的bin和gen每次都会重新编译,想把这两个目录从svn管理中去掉,然后在svn端将bin和gen目录删除了,并没有更新到本 ...

  8. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API XX

    今天爆了这个错误: Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 16 参考文档: http: ...

  9. android 4.4 短信拦截,Android 4.4 KitKat升级率已经接近18%

    按照惯例, 每个月的第一个星期的星期一谷歌都会发布最新一期Android版本分布图.从去年十月末谷歌发布Android 4.4 KitKat以来,截止到目前为止Android 4.4 KitKat的升 ...

最新文章

  1. 使用idea新建maven工程的web项目的步骤
  2. C#编程利器之五:集合对象(Collections)
  3. vue 使用了浏览器的刷新之后报错_Laravel 7 + vue.js 学习笔记(一)
  4. Qt Creator优化移动设备的应用程序
  5. 自己写的一个报表,研究SAP CRM ibase保存问题
  6. 语言专项精讲课程 赵海英_最全汇总:沪江日语课程体系指南
  7. 机器学习基石笔记2——在何时可以使用机器学习(2)
  8. curl基于URL的文件传输工具
  9. sql server,mysql,oracle 获取上一月时间
  10. kettle使用数据库来生成序列_kettle 生成 ktr
  11. # 融云 SDK 新用户入群加载历史消息 记录融云 SDK 的一个小功能,分享一下 ## 背景 项目中有用到融云 SDK 中的群组功能,产品说需要新人入群的时候看到历史消息。 本来以为直接能获
  12. 注册表删除方式解决Navicat到期问题
  13. 异数OS 织梦师-水母(一)--消息队列篇
  14. 【OP-TEE】TA的加载(超详细)
  15. 【家具CRM客户关系管理系统案例】数夫助力左右家私CRM客户关系管理系统正式上线
  16. 代码实现矩阵求逆的三种方式(超详细、已实现)
  17. 这个可以有!百度大脑EasyDL新发布EasyData搞定AI开发中的数据管理问题
  18. HTML5七夕情人节表白网页❤ 浪漫的樱花雨3D相册 ❤ HTML+CSS+JavaScript
  19. 【spring】spring异步执行的使用与源码分析
  20. python输入esc退出循环_使python在按ESC键时立即退出程序

热门文章

  1. methods: 68368 65536
  2. 关于BeanUtils.populate
  3. Android 打电话程序
  4. DLKcat开发细则(自用)
  5. 金融科技大数据产品推荐:恒丰银行实时智能决策引擎
  6. 智能家居Zigbee和蓝牙哪个发展潜力更大?
  7. 计算机蓝屏无法启动代码50,教您电脑蓝屏代码 0x00000050 如何快速修复
  8. 焊接大师给您支招——10种焊接堵漏方法供你选
  9. Android手机teams,在iOS和Android上自定义Microsoft Teams体验的三种最佳方法
  10. Docker部署Django由浅入深系列(中): 双容器部署Django + Uwsgi + Nginx