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.provider
的ContentProvider
中表名 为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