Android之Uri与URL

URI与URL都是Java.net包下的,而Uri是Android.net包下的

URL

URL:Uniform/Universal Resource Locator统一资源定位符,也被称为网页地址。

URL的地址格式:scheme://host:port/path

它可以唯一定位一个互联网上的资源,可以告诉本地浏览器去哪里找到一个资源

URL由五部分构成,

  • 模式,也称为协议
  • 授权机构
  • 路径
  • 片段标识符,ref
  • 查询字符串

Demo:http://www.ibiblio.com/javafaq/books/jnp/index.html?isbn=1565299#toc

  • 模式 http
  • 授权机构 www.ibiblio.com
  • 路径 javafaq/books/jnp/index.html
  • 片段标识符 toc,ref
  • 查询字符串 isbn=1565299

其中,授权机构还可以进一步分为:用户信息,主机,端口

URLEncoder,URL默认不进行编码,其他附加的内容需要编码,比如json字符串

Uri

Uri:Uniform Resource identifier统一资源标识符

相信看完这个中文解释,大家心里应该有点想法了。没错,标识与定位的区别还是很大的,标识包含于定位,因此,Uri是URL的子类。
它可以标识一个资源,但未必可以定位。

在Java的URI中,一个URI的实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL包含了定位该资源的信息,因此它不能是相对的,scheme必须被指定。

相对而言,Android中的Uri要严格一些,可以确定一个资源。

MIME 媒体类型

MIME是一种被广泛接受的多媒体类型表达方式,尤其在linux系统中。所以Android系统中也使用这个标准来区分文件类型。

MIME目前支持100多种预定义的内容类型,内容分为2级,类型和子类型。比如:image/gif,video/mpeg等。

除了标准的类型以外,还可以定义一些非标准的类型供自我使用,比如application/x-uif。

Uri格式分为三部分,scheme:sheeme-part:fragment

URI top = new URI("http://www.example.com/");
URI relative = new URI('image/logo.png');
URI resolved = top.resolve(relative);

output:http://www.example.com/image/logo.png

URI可以做绝对路径与相对路径的转化,而URL必须是绝对路径。

接下来讲解一下,

Uri的使用

读取联系人信息

Cursor c = getContentResolver().query(ContactsContact.Contacts.CONTENT_URI,null,null,null);
while(c.moveToNext){
    c.getString(c.getColumnIndex(ContactsContact.Contacts.DISPLAY_NAME));//列名的索引
}

更多的,我们会在一个Activity跳转到另一个Activity返回的数据中用到,即startActivityForResult();

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==Activity.RESULT_OK){
        Uri uri = data.getData();
        if(uri==null){
            return;
            String path = uri.getPath();//获取路径
            System.out.println("path:"+path);
            File file = new File(path);
            String name = file.getName();
            System.out.println("file name:"+name);
        }
    }
}

输出:
05-28 22:38:35.623: I/System.out(24915): path:/storage/sdcard0/MIUI/Gallery/cloud/.thumbnailFile/3025d24eb6a1972fff06ef8e4d2ca0609bd97131.jpg

05-28 22:38:35.623: I/System.out(24915): file name:3025d24eb6a1972fff06ef8e4d2ca0609bd97131.jpg

还有一个更好的方法

/**
 * Try to return the absolute file path from the given Uri
 * 
 * @param context
 * @param uri
 * @return the file path or null
 */
public static String getRealFilePath(final Context context, final Uri uri) {
    if (null == uri)
        return null;
    final String scheme = uri.getScheme();
    String data = null;
    if (scheme == null)
        data = uri.getPath();
    else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
        data = uri.getPath();
    } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
        Cursor cursor = context.getContentResolver().query(uri,
                new String[] { ImageColumns.DATA }, null, null, null);
        if (null != cursor) {
            if (cursor.moveToFirst()) {
                int index = cursor.getColumnIndex(ImageColumns.DATA);
                if (index > -1) {
                    data = cursor.getString(index);
                }
            }
            cursor.close();
        }
    }
    return data;
}

或者这个

public static String getFilePath(Context context, Uri uri) {
    String filepath = "";
    String uriPath = uri.toString();

    // Handle local file and remove url encoding
    if (uriPath.startsWith("file://")) {
        filepath = uriPath.replace("file://", "");
        try {
            return URLDecoder.decode(filepath, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    try {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = context.getContentResolver().query(uri, projection,
                null, null, null);
        if (cursor != null && cursor.getCount() != 0) {
            int column_index = cursor
                    .getColumnIndex(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            filepath = cursor.getString(column_index);
        }
    } catch (Exception e) {
        Log.e("Path Error", e.toString());
    }
    return filepath;
}

打印一下

String path = uri.getPath();//获取路径
System.out.println("path:"+path);

String realFilePath = FileUtil.getRealFilePath(getActivity(),uri);
System.out.println("realFilePath:"+realFilePath);

String filePath = FileUtil.getFilePath(getActivity(),uri);
System.out.println("filePath:"+filePath);

效果是一样的

热评文章