最近做项目要通过的绝对路径找到的URI,然后删除,小小总结一下获取URI的方法,亲自试验在
android 413的系统上都是可用的。
1将所有的路径取出,遍历比较找到需要的路径,取出URI,效率较低
其中 MediaStoreMediaColumnsDATA 字段存的就是的绝对路径,
最后mImageUri得到的就是的URI
1 Uri mUri = Uriparse("content://media/external/images/media");
2 Uri mImageUri = null;
3 Cursor cursor = managedQuery(
4 MediaStoreImagesMediaEXTERNAL_CONTENT_URI, null, null, null,
5 MediaStoreImagesMediaDEFAULT_SORT_ORDER);
6 cursormoveToFirst();
7
8 while (!cursorisAfterLast()) {
9 String data = cursorgetString(cursor
10 getColumnIndex(MediaStoreMediaColumnsDATA));
11 if (picPathequals(data)) {
12 int ringtoneID = cursorgetInt(cursor
13 getColumnIndex(MediaStoreMediaColumns_ID));
14 mImageUri = UriwithAppendedPath(mUri, "" + ringtoneID);
15 break;
16 }
17 cursormoveToNext();
18 }
2直接从媒体数据库根据字段取出相应的记录,效率较高
1 //TYLT: add by duanyf 20121027 start
2 String type = UtilsensureNotNull(intentgetType());
3 Logd(TAG, "uri is " + uri);
4 if (urigetScheme()equals("file") && (typecontains("image/")))
{
5 String path = urigetEncodedPath();
6 Logd(TAG, "path1 is " + path);
7 if (path != null) {
8 path = Uridecode(path);
9 Logd(TAG, "path2 is " + path);
10 ContentResolver cr = thisgetContentResolver();
11 StringBuffer buff = new StringBuffer();
12 buffappend("(")
13 append(ImagesImageColumnsDATA)
14 append("=")
15 append("'" + path + "'")
16 append(")");
17 Cursor cur = crquery(
18 ImagesMediaEXTERNAL_CONTENT_URI,
19 new String[] { ImagesImageColumns_ID },
20 bufftoString(), null, null);
21 int index = 0;
22 for (curmoveToFirst(); !curisAfterLast(); cur
23 moveToNext()) {
24 index = curgetColumnIndex(ImagesImageColumns_ID);
25 // set _id value
26 index = curgetInt(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 Logd(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
ctxgetContentResolver()delete(MediaStoreImagesMediaEXTERNAL_CONTENT_URI,
MediaStoreImagesMediaDATA + " LIKE ", params);
ContentResolver resolver = getContentResolver();
Cursor cursor = resolverquery(originalUri, proj, null, null, null);
// 按我个人理解 这个是获得用户选择的的索引值
int column_index = cursorgetColumnIndexOrThrow(MediaStoreImagesMediaDATA);
// 将光标移至开头 ,这个很重要,不小心很容易引起越界
cursormoveToFirst();
// 最后根据索引值获取路径
String path = cursorgetString(column_index);
这样就获得了的路径。
下面说上传,现在一般上传都用Ok>
调用android系统的裁剪方式问题和解决方式:
如果你的程序中使用的裁剪方式是这样子的话:
1、调用系统自带的裁剪页面,吧保存在inetnt中;
2、裁剪完毕通过intentData取出
如果使用这种方式,就会遇到一个问题:
在某些手机(本人遇到的情况是小米3)上面无法跳转到系统的裁剪页面,或者IntentData是null。
这种方式是把放在intent中传递,而intent在安卓中的定义是传递轻量级的数据,显然传递是不合适的,高性能的手机可能没问题,性能差点的手机就会出问题了。、
解决方式:
1、用intent传递的Uri:
private staticUrimUriFile;
2、裁剪完毕通过Uri取出:
这里要注意取的方式,小心oom。把规避oom的方式也贴出来:
Android调用系统拍照的代码:
创建Intent Intent openCameraIntent = new Intent(MediaStoreACTION_IMAGE_CAPTURE);
String imagePath = EnvironmentgetExternalStorageDirectory() + "/image" ;
设置文件路径 File file = new File(imagePath);
if(!fileexists()){
filemkdirs(); }
设置URI,指定相册拍照后保存的路径,Uri imageUri = UrifromFile(new File(imagePath, "imagejsp"));
openCameraIntentputExtra(MediaStoreEXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, REQUEST_CODE_TAKING_PICTURES);
拍照完以后,文件就会保存在这个指定的目录下了。Uri 里指定了相机拍照的路径。
以上就是关于android如何通过path得到uri全部的内容,包括:android如何通过path得到uri、android:怎样将Uri类型的图片数据转换成流、调用android系统的图片裁剪方式问题和解决方式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)