最近做项目要通过图片的绝对路径找到图片的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,不知这两种有什么区别,望大神指教一二!