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

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

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

拨打电话: 
调用拨号程序 
  1. Uri uri = Uri.parse("tel:xxxxxx"); 
  2. Intent it = new Intent(Intent.ACTION_DIAL, uri);   
  3. startActivity(it);   
  1. Uri uri = Uri.parse("tel.xxxxxx"); 
  2. Intent it =new Intent(Intent.ACTION_CALL,uri); 
  3. 要使用这个必须在配置文件中加入<uses-permission id="Android.permission.CALL_PHONE" />

发送SMS/MMS 
调用发送短信的程序 
  1. Intent it = new Intent(Intent.ACTION_VIEW); 
  2. it.putExtra("sms_body", "The SMS text"); 
  3. it.setType("vnd.android-dir/mms-sms"); 
  4. startActivity(it);   
发送短信 
  1. Uri uri = Uri.parse("smsto:0800000123"); 
  2. Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
  3. it.putExtra("sms_body", "The SMS text"); 
  4. startActivity(it);   
发送彩信 
  1. Uri uri = Uri.parse("content://media/external/images/media/23"); 
  2. Intent it = new Intent(Intent.ACTION_SEND); 
  3. it.putExtra("sms_body", "some text"); 
  4. it.putExtra(Intent.EXTRA_STREAM, uri); 
  5. it.setType("image/png"); 
  6. startActivity(it);

发送Email 
  1. 
  2. Uri uri = Uri.parse("mailto:xxx@abc.com"); 
  3. Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
  4. startActivity(it); 
  1. Intent it = new Intent(Intent.ACTION_SEND); 
  2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); 
  3. it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 
  4. it.setType("text/plain"); 
  5. startActivity(Intent.createChooser(it, "Choose Email Client"));   
  1. Intent it=new Intent(Intent.ACTION_SEND);   
  2. String[] tos={"me@abc.com"};   
  3. String[] ccs={"you@abc.com"};   
  4. it.putExtra(Intent.EXTRA_EMAIL, tos);   
  5. it.putExtra(Intent.EXTRA_CC, ccs);   
  6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");   
  7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");   
  8. it.setType("message/rfc822");   
  9. startActivity(Intent.createChooser(it, "Choose Email Client"));

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

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

Uninstall 程序 
  1. Uri uri = Uri.fromParts("package", strPackageName, null); 
  2. Intent it = new Intent(Intent.ACTION_DELETE, uri); 
  3. 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);

uninstall apk 
/**未测试 
Uri uninstallUri = Uri.fromParts("package", "xxx", null); 
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri); 
*/ 
Uri packageURI = Uri.parse("package:"+wistatmap);   
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);   
startActivity(uninstallIntent);

install apk 
Uri installUri = Uri.fromParts("package", "xxx", null); 
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 
play audio 
Uri playUri = Uri.parse("[url=]file:///sdcard/download/everything.mp3[/url]"); 
returnIt = new Intent(Intent.ACTION_VIEW, playUri);

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

//搜索应用 
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

//进入联系人页面 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(People.CONTENT_URI); 
startActivity(intent);

//查看指定联系人 
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);










1.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

我们很经常需要解析Uri,并从Uri中获取数据。

Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。

虽然这两类不是非常重要,但是掌握它们的使用,会便于我们的开发工作。

下面就一起看一下这两个类的作用。

2.UriMatcher

UriMatcher 类主要用于匹配Uri.

使用方法如下。

首先第一步,初始化:

  1. UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

第二步注册需要的Ur

  1. matcher.addURI("com.yfz.Lesson", "people", PEOPLE);
  2. matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);

第三部,与已经注册的Uri进行匹配:

  1. Uri uri = Uri.parse("content://" + "com.yfz.Lesson" + "/people");
  2. int match = matcher.match(uri);
  3. switch (match)
  4. {
  5. case PEOPLE:
  6. return"vnd.android.cursor.dir/people";
  7. case PEOPLE_ID:
  8. return"vnd.android.cursor.item/people";
  9. default:
  10. returnnull;
  11. }

match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。

上述方法会返回"vnd.android.cursor.dir/person".

总结:

--常量 UriMatcher.NO_MATCH 
表示不匹配任何路径的返回码

--# 号为通配符

--* 号为任意字符

另外说一下,官方SDK说明中关于Uri的注册是这样写的:

  1. privatestaticfinal UriMatcher sURIMatcher = new UriMatcher();
  2. static
  3. {
  4. sURIMatcher.addURI("contacts", "/people", PEOPLE);
  5. sURIMatcher.addURI("contacts", "/people/#", PEOPLE_ID);
  6. sURIMatcher.addURI("contacts", "/people/#/phones", PEOPLE_PHONES);
  7. sURIMatcher.addURI("contacts", "/people/#/phones/#", PEOPLE_PHONES_ID);
  8. sURIMatcher.addURI("contacts", "/people/#/contact_methods", PEOPLE_CONTACTMETHODS);
  9. sURIMatcher.addURI("contacts", "/people/#/contact_methods/#", PEOPLE_CONTACTMETHODS_ID);
  10. sURIMatcher.addURI("contacts", "/deleted_people", DELETED_PEOPLE);
  11. sURIMatcher.addURI("contacts", "/phones", PHONES);
  12. sURIMatcher.addURI("contacts", "/phones/filter/*", PHONES_FILTER);
  13. sURIMatcher.addURI("contacts", "/phones/#", PHONES_ID);
  14. sURIMatcher.addURI("contacts", "/contact_methods", CONTACTMETHODS);
  15. sURIMatcher.addURI("contacts", "/contact_methods/#", CONTACTMETHODS_ID);
  16. sURIMatcher.addURI("call_log", "/calls", CALLS);
  17. sURIMatcher.addURI("call_log", "/calls/filter/*", CALLS_FILTER);
  18. sURIMatcher.addURI("call_log", "/calls/#", CALLS_ID);
  19. }

这个说明估计已经是Google官方没有更新,首先是初始化方法,没有传参,那么现在初始化时,实际是必须传参的。可以看一下Android2.2的源码,无参数的构造方法已经是private的了。

另外就是addURI这个方法,第二个参数开始时不需要"/", 否则是无法匹配成功的。

3.ContentUris

ContentUris 类用于获取Uri路径后面的ID部分

1)为路径加上ID: withAppendedId(uri, id)

比如有这样一个Uri

  1. Uri uri = Uri.parse("content://com.yfz.Lesson/people")

通过withAppendedId方法,为该Uri加上ID

  1. Uri resultUri = ContentUris.withAppendedId(uri, 10);

最后resultUri为: content://com.yfz.Lesson/people/10

2)从路径中获取ID: parseId(uri)

  1. Uri uri = Uri.parse("content://com.yfz.Lesson/people/10")
  2. long personid = ContentUris.parseId(uri);

最后personid 为 :10

附上实验的代码:

 
  1. package com.yfz;
  2. import com.yfz.log.Logger;
  3. import android.app.Activity;
  4. import android.content.ContentUris;
  5. import android.content.UriMatcher;
  6. import android.net.Uri;
  7. import android.os.Bundle;
  8. public class Lesson_14 extends Activity {
  9. private static final String AUTHORITY = "com.yfz.Lesson";
  10. private static final int PEOPLE = 1;
  11. private static final int PEOPLE_ID = 2;
  12. //NO_MATCH表示不匹配任何路径的返回码
  13. private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  14. static
  15. {
  16. sURIMatcher.addURI(AUTHORITY, "people", PEOPLE);
  17. //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本
  18. sURIMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID);
  19. }
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. Logger.d("------ Start Activity !!! ------");
  24. Uri uri1 = Uri.parse("content://" + AUTHORITY + "/people");
  25. Logger.e("Uri:" + uri1);
  26. Logger.d("Match 1" + getType(uri1));
  27. Uri uri2 = Uri.parse("content://" + AUTHORITY + "/people" + "/2");
  28. Logger.e("Uri:" + uri2);
  29. Logger.d("Match 2" + getType(uri2));
  30. //拼接Uri
  31. Uri cUri = ContentUris.withAppendedId(uri1, 15);
  32. Logger.e("Uri:" + cUri);
  33. //获取ID
  34. long id = ContentUris.parseId(cUri);
  35. Logger.d("Uri ID: " + id);
  36. }
  37. private String getType(Uri uri) {
  38. int match = sURIMatcher.match(uri);
  39. switch (match)
  40. {
  41. case PEOPLE:
  42. return "vnd.android.cursor.dir/person";
  43. case PEOPLE_ID:
  44. return "vnd.android.cursor.item/person";
  45. default:
  46. return null;
  47. }
  48. }
  49. }

package com.yfz; import com.yfz.log.Logger; import android.app.Activity; import android.content.ContentUris; import android.content.UriMatcher; import android.net.Uri; import android.os.Bundle; public class Lesson_14 extends Activity { private static final String AUTHORITY = "com.yfz.Lesson"; private static final int PEOPLE = 1; private static final int PEOPLE_ID = 2; //NO_MATCH表示不匹配任何路径的返回码 private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sURIMatcher.addURI(AUTHORITY, "people", PEOPLE); //这里的#代表匹配任意数字,另外还可以用*来匹配任意文本 sURIMatcher.addURI(AUTHORITY, "people/#", PEOPLE_ID); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Logger.d("------ Start Activity !!! ------"); Uri uri1 = Uri.parse("content://" + AUTHORITY + "/people"); Logger.e("Uri:" + uri1); Logger.d("Match 1" + getType(uri1)); Uri uri2 = Uri.parse("content://" + AUTHORITY + "/people" + "/2"); Logger.e("Uri:" + uri2); Logger.d("Match 2" + getType(uri2)); //拼接Uri Uri cUri = ContentUris.withAppendedId(uri1, 15); Logger.e("Uri:" + cUri); //获取ID long id = ContentUris.parseId(cUri); Logger.d("Uri ID: " + id); } private String getType(Uri uri) { int match = sURIMatcher.match(uri); switch (match) { case PEOPLE: return "vnd.android.cursor.dir/person"; case PEOPLE_ID: return "vnd.android.cursor.item/person"; default: return null; } } }

好了,就讲这么多。

附:Android Uri命名格式:

ContentProvider进行数据交互时就需要用到URI。为了让客户端程序能够使用你的数据,你必须要定义一个公开的URI,它由一些固定格式的文字组成,可以分成下面几个部分:

content://

一个标准的URI前缀,它用来指示Android必须从ContentProvider中挑出一个来处理这个URI。

authority

一个唯一的标识符,标示这个URI需要查找的ContentProvider是由哪个组织开发的,一般用跟java包命名规范相似的方式来署名这个开发组织。如果是Android内置的provider,则这个authority可以省略掉,否则authority是必须的,Google建议使用用户自定义的继承ContentProvider的类的全名来作为,这个ContentProvider所要处理的URI的authority

path(路径)

ContentProvider根据这个路径信息来判断要返回什么类型的数据,所以这个后缀路径可以自由定义,但是有一些条件限制:

如果一个ContentProvider能查询返回很多种不同类型的数据,URI后缀要设置不同类型的数据所对应不同的URI后缀如内置的Contact 
ContentProvider就是用来处理名片夹,它可以返回很多种类型的数据:联系人、电话、联系方式等。所以对应这些不同类型的数据就有不同的URI后缀匹配:

1

content://contacts/people/1

上面是返回一个人员

1

content://contacts/people/1/phone/3

返回一个电话号码。

而且我们要为不同的数据类型设置不同的MIME类型,第一个MIME类型是:vnd.android.cursor.item/person第二个MIME类型是:vnd.android.cursor.item/phone。

同时ContentProvider不仅可以返回单条数据,也可能以目录的形式返回多条数据。以上面2个URI来说,后缀的结尾都是数字,这表示查询对应某条记录,所以返回的数据是单条的,而如果是查询目录的形式就要去掉后面的数字如:

1
2

content://contacts/people/1/phone
content://contacts/people

上面就是目录形式,对应他们的MIME类型也不同,所以我们将单条的MIME类型中的item改为dir,所以MIME类型是:vnd.android.cursor.dir/phone和vnd.android.cursor.dir/person。

A: 标准前缀,表达的意思是使用ContentProvider来处理信息。

B: authority

C: 后缀1,一般用来表示请求需要获取的是哪种类型的数据(确定MIME类型的功能)。

D:定位记录。确定对应类型的数据中的哪条记录。

android之Uri的常用几个例子的更多相关文章

  1. android.net.Uri 简介 API

    android.net.Uri 简介 public abstract class android.net.Uri extends Object implements Parcelable, Compa ...

  2. 用Android Studio开发最常用到的快捷键

    Android Studio常用快捷键 Android Studio日常开发常用快捷键. 快捷键版本: Mac OS X 10.5+ 搜索查看类 用途 Mac快捷键 搜索所有文件 double Shi ...

  3. android 中uri.parse()用法

    android 中uri.parse()用法 1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = ...

  4. 【Android】安卓中常用的图片加载方法

    一.通过相机选图片: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  5. 单页Html及Android App供小孩学习常用汉字

    为了检验及帮助小孩学习常用汉字,简单开发本网页应用: 常用汉字是按使用频率排序的,来源于网上: 该简单应用 有Android APP下载 “学习常用汉字_20150910.apk” 单页Html 示例 ...

  6. Android Studio开发工具常用快捷键。部分总结,不全面,只包含新手可能少用的

    Android Studio开发工具常用快捷键.部分总结,不全面,只包含新手可能少用的 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 首先说明,因为 ...

  7. Android ADB原理及常用命令

    Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...

  8. Android UI-开源框架ImageLoader的完美例子

    Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...

  9. Android学习笔记_60_Android常用ADB命令

    第一部分: 1. ubuntu下配置环境anroid变量: 在终端执行 sudo gedit /etc/profile 打开文本编辑器,在最后追加#set android environment 2. ...

随机推荐

  1. KVM WEB管理工具webvirtmgr安装和使用

    生产环境的KVM宿主机越来越多,需要对宿主机的状态进行调控.这里用webvirtmgr进行管理.图形化的WEB,让人能更方便的查看kvm 宿主机的情况和操作 1 安装支持的软件源 yum -y ins ...

  2. python函数回顾:dir()

    描述 dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表: 带参数时,返回参数的属性.方法列表.如果参数包含方法__dir__(),该方法将被调用. 如果参数不包含__dir__( ...

  3. Python文件操作——逐行插入内容

    需求: 分析: 1)打开文件 2)readlines() 读文件(按行读) --> 拿到文件内容 data 3)循环遍历 data 的每行,在每行后面进行拼接要插入的内容 4)往新文件里写 代码 ...

  4. mui上传图片

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. 剑指offer 面试10题

    面试10题: 题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 n=0时,f(n)=0 n=1时,f(n)=1 n>1时,f(n)=f(n-1 ...

  6. Python操作SQLAlchemy

    Mysql环境: MySQL 一.概述什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 什么是 MySQL.Oracle.SQLite.Access.MS ...

  7. 【CodeChef】Enormous Input Test

    The purpose of this problem is to verify whether the method you are using to read input data is suff ...

  8. android驱动USB摄像头

    http://blog.csdn.net/mirkerson/article/details/50764314 多亏了stackoverflow看到的一篇帖子,其中有几句关键的话,然后顺藤摸瓜解决了问 ...

  9. Shell编程之运算

    一.变量的数值计算 1.算术运算符 常用的运算符号 常用的运算命令 (1)双小括号 基本语法 1)利用"(())"进行简单运算 [root@codis-178 ~]# echo $ ...

  10. H3C 交换机设置telnet WEB用户

    huwei : local-user admin password cipher @#$@#$ service-type telnet ssh service-type telnet ssh leve ...