Android--文件路径和Uri

Posted Navan-3

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android--文件路径和Uri相关的知识,希望对你有一定的参考价值。

一、Uri 

     通用资源标志符(Universal Resource Identifier, 简称"URI")。

  Uri代表要操作的数据,android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。

  URI一般由三部分组成:

    访问资源的命名机制。 

    存放资源的主机名。 

    资源自身的名称,由路径表示。 

  Android的Uri由以下三部分组成: "content://"、数据的路径、标示ID(可选)

  举些例子,如: 

    所有联系人的Uri: content://contacts/people

    某个联系人的Uri: content://contacts/people/5

    所有图片Uri: content://media/external

    某个图片的Uri:content://media/external/images/media/4

二、内部保存

首先我们来看一下android是如何管理多媒体文件(音频、视频、图片)的信息。通过DDMS,我们在/data/data/com.android.providers.media下找到数据库文件
打开external.db文件进一步查看:在media表格下,可以看到文件路径(_data)和Uri的标示ID(_id)的对应关系。             

三、相互转换

 1.从Uri获得文件路径

[java]  view plain copy print ?
  1. string  myImageUrl = "content://media/external/images/media/***";  
  2. Uri uri = Uri.parse(myImageUrl);  
  3.   
  4.   
  5. String[] proj =  MediaStore.Images.Media.DATA ;     
  6. Cursor actualimagecursor = this.ctx.managedQuery(uri,proj,null,null,null);    
  7. int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);     
  8. actualimagecursor.moveToFirst();     
  9.   
  10.   
  11. String img_path = actualimagecursor.getString(actual_image_column_index);    
  12. File file = new File(img_path);  
  13. Uri fileUri = Uri.fromFile(file);  

 2、从文件路径获得Uri

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

android 获取uri的正确文件路径的办法

有时会从其他的文件浏览器获取路径,这时根据路径去数据库取文件时会发现不成功,原因是由于android的文件浏览器太多,各自返回的路径不统一,而android本身的数据库中的路径是绝对路径,即"/mnt"开头的路径。

private String getRealPath(Uri fileUrl) 
		String fileName = null;
		Uri filePathUri = fileUrl;
		if (fileUrl != null) 
			if (fileUrl.getScheme().toString().compareTo("content") == 0)  // content://开头的uri
				Cursor cursor = context.getContentResolver().query(fileUrl,
						null, null, null, null);
				if (cursor != null && cursor.moveToFirst()) 
					int column_index = cursor
							.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA);
					fileName = cursor.getString(column_index); // 取出文件路径

					// if(!fileName.startsWith("/mnt"))
					// //检查是否有”/mnt“前缀
					// fileName = "/mnt" + fileName;
					// 

					cursor.close();
				
			 else if (fileUrl.getScheme().compareTo("file") == 0)  // file:///开头的uri
				fileName = filePathUri.toString();
				fileName = filePathUri.toString().replace("file://", "");

				// 替换file://
				// if(!fileName.startsWith("/mnt"))
				// fileName = "/mnt" + fileName;
				// 
			
		
		if (fileName != null) 
			// 避免空指针
			try 
				fileName = new String(fileName.getBytes(), "utf-8");
				System.out.println("编码了!!!!!");
			 catch (UnsupportedEncodingException e) 
				e.printStackTrace();
			
			// 编码含有中文路径
			fileName = URLDecoder.decode(fileName);
		
		return fileName;
	



以上是关于Android--文件路径和Uri的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何获取匹配缩略图 URI 的文件路径?

Android 通过uri获取文件路径path

在Android中将文件路径转换为Uri

android图片文件的路径地址与Uri的相互转换

从android中的文件路径获取内容uri

如何从android pie中的内容uri获取文件路径