最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在

android 4.1.3的系统上都是可用的。

1.将所有的图片路径取出,遍历比较找到需要的路径,取出URI,效率较低

其中 MediaStore.MediaColumns.DATA 字段存的就是图片的绝对路径,

最后mImageUri得到的就是图片的URI

  1. Uri mUri = Uri.parse("content://media/external/images/media");
  2. Uri mImageUri = null;
  3. Cursor cursor = managedQuery(
  4. MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null,
  5. MediaStore.Images.Media.DEFAULT_SORT_ORDER);
  6. cursor.moveToFirst();
  7.  
  8. while (!cursor.isAfterLast()) {
  9. String data = cursor.getString(cursor
  10. .getColumnIndex(MediaStore.MediaColumns.DATA));
  11. if (picPath.equals(data)) {
  12. int ringtoneID = cursor.getInt(cursor
  13. .getColumnIndex(MediaStore.MediaColumns._ID));
  14. mImageUri = Uri.withAppendedPath(mUri, "" + ringtoneID);
  15. break;
  16. }
  17. cursor.moveToNext();
  18. }

2.直接从媒体数据库根据字段取出相应的记录,效率较高

  1. //TYLT: add by duanyf 20121027 start
  2. String type = Utils.ensureNotNull(intent.getType());
  3. Log.d(TAG, "uri is " + uri);
  4. if (uri.getScheme().equals("file") && (type.contains("image/"))) {
  5. String path = uri.getEncodedPath();
  6. Log.d(TAG, "path1 is " + path);
  7. if (path != null) {
  8. path = Uri.decode(path);
  9. Log.d(TAG, "path2 is " + path);
  10. ContentResolver cr = this.getContentResolver();
  11. StringBuffer buff = new StringBuffer();
  12. buff.append("(")
  13. .append(Images.ImageColumns.DATA)
  14. .append("=")
  15. .append("'" + path + "'")
  16. .append(")");
  17. Cursor cur = cr.query(
  18. Images.Media.EXTERNAL_CONTENT_URI,
  19. new String[] { Images.ImageColumns._ID },
  20. buff.toString(), null, null);
  21. int index = 0;
  22. for (cur.moveToFirst(); !cur.isAfterLast(); cur
  23. .moveToNext()) {
  24. index = cur.getColumnIndex(Images.ImageColumns._ID);
  25. // set _id value
  26. index = cur.getInt(index);
  27. }
  28. if (index == 0) {
  29. //do nothing
  30. } else {
  31. Uri uri_temp = Uri
  32. .parse("content://media/external/images/media/"
  33. + index);
  34. Log.d(TAG, "uri_temp is " + uri_temp);
  35. if (uri_temp != null) {
  36. uri = uri_temp;
  37. }
  38. }
  39. }
  40. }
  41. //TYLT: add by duanyf 20121027 end

3.直接根据路径通过 ContentProvider 的 delete() 方法删除图片,两行代码搞定,效率最高

  1. String params[] = new String[]{filepath};
  2. ctx.getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA + " LIKE ?", params);

PS:通过URI删除图片可以删除媒体库的信息和缩略图一并删除,不留痕迹,如果直接通过路径删除文件会删除不干净

前两种方法获取的都是content开头的URI,还有一种file开头的URI,不知这两种有什么区别,望大神指教一二!

android系统通过图片绝对路径获取URI的三种方法的更多相关文章

  1. 【Android】Eclipse自己主动编译NDK/JNI的三种方法

    [Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 一.Eclipse关联cy ...

  2. 体温数据上传程序开发+获取时间的三种方法+DB Browser下载及安装

    今天开始了体温上传程序的开发 今日所学: 获取时间 (21条消息) (转)安卓获取时间的三种方法_sharpeha的博客-CSDN博客_安卓获取时间 DB Browser安装教程 (20条消息) sq ...

  3. win10系统U盘读取不了怎么解决 三种方法快速解决"文件或目录损坏且无法读取& 发布时间:2020-06-05 09:19:46 作者:佚名 我要评论

    win10系统U盘读取不了怎么解决 三种方法快速解决"文件或目录损坏且无法读取&   发布时间:2020-06-05 09:19:46   作者:佚名    我要评论 win10电脑 ...

  4. $Android去除系统默认的标题栏和全屏的三种方法

    在做应用的时候,很多时候是不需要系统自带的标题栏的,而是自己去实现标题栏,这就要去掉系统的标题栏,下面总结了三种方法.全屏也是一样的道理,也总结了实现的三种方法. (一)去除标题栏 1.方法1 在Ac ...

  5. java 获取随机数的三种方法

    方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...

  6. URL转Drawable之 Android中获取网络图片的三种方法

    转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Applicatio ...

  7. js jquery 获取服务器控件的三种方法

    由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<asp:TextBox ID=" ...

  8. 获取IP的三种方法

    第一种 取本主机ip地址 public string GetLocalIp() { ///获取本地的IP地址 string AddressIP = string.Empty; foreach (IPA ...

  9. android 获取sharedpreference的三种方法的区别

    1. public SharedPreferences getPreferences (int mode) 通过Activity对象获取,获取的是本Activity私有的Preference,保存在系 ...

随机推荐

  1. python循环语句详细讲解

    想必大家都知道python循环语句吧,可以python循环语句有多种,比如for循环.while循环.if.else等等,   我们可以通过设置条件表达式永远不为 false 来实现无限循环,实例如下 ...

  2. 从CSR产品名录看公司发展历程和业务方向

    产品型号                                                                           主要功能 BC3系列(例BC31A223, ...

  3. vue 自学笔记(七) 组件细节问题

    前情提要: 这里盘点一下,组件细节的问题 现在我们观察一些用框架开发的网页BiliBili.掘金,会发现很多部分都十分相似或者一模一样,我们甚至可以将其拆分归类.而事实上,页面的确是被一个个组件构成的 ...

  4. c++编程之内存的分配

    当我们在进行编程时,特别是使用c++语言进行编程时,需要知道内存有几个内存区可供我们使用,因为c++可以直接操作内存.接下让我们来看看内存中的几大内存区. 1.栈区 栈区(stack)是速度最快的一个 ...

  5. shell中的算数

    加法:let result=var1+var2result=$[$var1+var2]result=$(($var1+var2))result=`expr $var1 + $var2*` 加号前后有空 ...

  6. k8s总结(脑图图片)

  7. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十五):Spring Security 版本

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 到目前为止,我们使用的权限认证框架是 Shiro,虽然 Shiro ...

  8. C#中的Action和Func和Predicate

    一.[action<>]指定那些只有输入参数,没有返回值的委托 用了Action之后呢: 就是相当于省去了定义委托的步骤了. 演示代码: using System; using Syste ...

  9. layui 文字滚动

    将消息标题滚动 上面是效果 <li class="layui-nav-item"> <div class="layui-carousel" i ...

  10. c#实战开发:以太坊钱包对接私链 (二)

    上一篇讲了 以太坊私链搭建 首先下载Ethereum Wallet 钱包 可以直接百度 下载如果直接打开它会默认连接公链 所以我们要通过命令打开 "F:\Program Files\Ethe ...