Android || Uri介绍

1 Uri 的组成

通用资源标志符(Universal Resource Identifier)。
Uri代表着要操作的数据,android 上可用的每种资源(图像、视频片段、网页等)都可以用 Uri表示。从概念上来讲,URI包括URL。

【作用】

  • 唯一标识 ContentProvider 或者 其它的数据。

【具体使用】

  • Uri分为系统预置:系统内置的数据(如通讯录、日程表等);
  • 自定义:自定义的数据库。

【使用方式】

  • 方式1: [scheme:] [//authority] [path] [?query] [#fragment]
    用于访问本地资源,这里的 scheme 为 content 或者 file。
    例1:访问通讯录中的某个联系人,会从系统通讯录app提供的 provider 去读取联系人信息。
    例2:访问sdcard/download/ 目录下的音频文件,会利用系统提供的 provider 读取文件
//从 /data/data/com.android.providers.contacts/databases 中的数据库表来访问
content://contacts/people/5 

//从/data/data/com.android.providers.media/databases中的数据库表中访问 
file://sdcard/download/123.mp3
  • 方式2: [scheme:] [//host:port] [path] [?query] [#fragment]
    用于访问网络资源,这里的 scheme 通常为http。例如:
http://www.baidu.com
  • 方式3:[scheme:] scheme-specific-part [#fragment]
    用于电话等服务,这里scheme通常为 smsto 和 tel 等。
tel:13512341234             //给13512341234打电话
smsto:13512341234    //给135121341234发短信


其中,query的使用规则:

  • query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:
    scheme://authority/path1/path2/path3?id = 1#fragment,这里有一个参数id,它的值是1
  • query参数可以有多个,每个用&连接
    scheme://authority/path1/path2/path3?id = 1&name = mingming&old#fragment
    这里有三个参数:
    参数1:id,其值是:1
    参数2:name,其值是:mingming
    参数3:old,没有对它赋值,所以它的值是null
  • 在android中,path、query、fragment 可以选择性的要或不要

2 Urid的举例

【例一】

http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic
  • scheme:http
  • scheme-specific-part://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4
    • authority:www.java2s.com:8080 【host: www.java2s.com】【port:8080】
    • path::/yourpath/fileName.htm
    • query:stove=10&path=32&id=4
  • fragment:harvic

【例2】
在这里插入图片描述

// 设置Uri
Uri uri = Uri.parse("content://com.carson.provider/User/1")

上述URI指向的资源是:名为 com.carson.providerContentProvider 中表名 为User 中的 id为1的数据。

特别注意:Uri 模型存在匹配通配符 *、#

  • *:匹配任意长度的任何有效字符串。content://com.example.app.provider/*匹配provider的任何内容
  • #:匹配任意长度的数字字符。content://com.example.app.provider/table/#匹配provider中的table表的所有行

代码提取
上面是直观的获取到Uri每部分的内容,下面就说下如何使用代码提取

  • getScheme() : 获取Uri中的scheme字符串部分,在这里即,http
  • getSchemeSpecificPart(): 获取Uri中的scheme-specific-part:部分,这里是://www.java2s.com:8080/yourpath/fileName.htm?
  • getFragment(): 获取Uri中的Fragment部分,即harvic
  • getAuthority(): 获取Uri中Authority部分,即www.java2s.com:8080
  • getPath(): 获取Uri中path部分,即/yourpath/fileName.htm
  • getQuery(): 获取Uri中的query部分,即stove=10&path=32&id=4
  • getHost(): 获取Authority中的Host字符串,即www.java2s.com
  • getPost(): 获取Authority中的Port字符串,即8080
  • List< String> getPathSegments(): 上面我们的getPath()是把path部分整个获取下来:/yourpath/fileName.htm
  • getPathSegments(): 作用是依次提取出Path的各个部分的字符串,以字符串数组的形式输出

3 uri与file、path相互转化

  • uri 转 file】:
    file = new File(new URI(uri.toString()));
  • file 转 uri】:
    URI uri = file.toURI();
  • uri 转 path】:
private String getPath(Context context, Uri uri) {
         String path = null;
         Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);        
         if (cursor == null) {            
             result = uri.getPath();      
         }
         if (cursor.moveToFirst()) {            
             try {                
                 path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));            
             } catch (Exception e) {                
                 e.printStackTrace();            
                 }        
             }       
             cursor.close();       
             return path; 
}
 
  • path 转 uri】:
    Uri uri = Uri.parse(path);
  • file 转 path】:
    String path = file.getPath();
  • path 转 file】:
    File file = new File(path);

4 常用 Uri

//显示网页:
Uri uri = Uri.parse("http://www.google.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//显示地图:
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.Action_VIEW, uri);
startActivity(it);

//路径规划:
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
Intent it = new Intent(Intent.ACTION_VIEW, URI);
startActivity(it);

//拨打电话:
//调用拨号程序
Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);

Uri uri = Uri.parse("tel.xxxxxx");
Intent it = new Intent(Intent.ACTION_CALL, uri);
要使用这个必须在配置文件中加入 < uses - permission id = "Android.permission.CALL_PHONE" / >

//发送SMS / MMS
//调用发送短信的程序

Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);

//发送短信
Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);

//发送彩信
Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra("sms_body", "some text");
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png");
startActivity(it);

//发送Email
Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
startActivity(Intent.createChooser(it, "Choose Email Client"));

Intent it = new Intent(Intent.ACTION_SEND);
String[] tos = {"me@abc.com"};
String[] ccs = {"you@abc.com"};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//添加附件
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "[url=]file:///sdcard/mysong.mp3[/url]");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//播放多媒体
Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("[url=]file:///sdcard/song.mp3[/url]");
it.setDataAndType(uri, "audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//Uninstall 程序
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);


//调用相册
public static final String MIME_TYPE_IMAGE_JPEG = "image/*";
public static final int ACTIVITY_GET_IMAGE = 0;
Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
getImage.addCategory(Intent.CATEGORY_OPENABLE);
getImage.setType(MIME_TYPE_IMAGE_JPEG);
startActivityForResult(getImage, ACTIVITY_GET_IMAGE);


//调用系统相机应用程序,并存储拍下来的照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
time = Calendar.getInstance().getTimeInMillis();
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);
//查看指定联系人
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id联系人ID
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);


//进入联系人页面

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);


//搜索应用
Uri uri = Uri.parse("market://search?q=pname:pkg_name");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
//where pkg_name is the full package path for an application
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值