Android——Uri全解

一、URI简介

统一资源定位符,Universal Resource Identifier的简称。Android的Uri主要分三个部分:scheme, authority and path。

进一步划分:

[scheme:][//authority][path][?query][#fragment]

终极划分:

[scheme:][//host:port][path][?query][#fragment]

例如:http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic

二、URI 常用方法

//将一个字符串转换为Uri

Uri uri = Uri.parse("http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic");

String Scheme = uri.getScheme();//http

String SchemeSpecificPart = uri.getSchemeSpecificPart();////www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4

String Authority = uri.getAuthority();//www.java2s.com:8080

String Host = uri.getHost();//www.java2s.com

int Post = uri.getPort();//8080

String Path = uri.getPath();// /yourpath/fileName.htm

String Query = uri.getQuery();//stove=10&path=32&id=4

List Segments= uri.getPathSegments();//获取uri中path路径部分存入一个List中

Int stove = uri.getQueryParameter("stove")//stove=10

三、UriMatcher类与ContentUris类的引入

1、UriMatcher

UriMatcher 类主要用于匹配Uri.

使用方法如下,

首先第一步,初始化:

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

第二步,注册需要的Uri:

matcher.addURI("com.yfz.Lesson", "people", PEOPLE);

matcher.addURI("com.yfz.Lesson", "person/#", PEOPLE_ID);

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

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

int match = matcher.match(uri);

switch (match)

{

case PEOPLE:

return "vnd.Android.cursor.dir/people";

case PEOPLE_ID:

return "vnd.android.cursor.item/people";

default:

return null;

}

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

上述方法会返回vnd.Android.cursor.dir/people

2、ContentUris

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

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

比如有这样一个Uri

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

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

Uri resultUri = ContentUris.withAppendedId(uri, 10); //https://link.jianshu.com?t=content://com.yfz.Lesson/people/10

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

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

long personid = ContentUris.parseId(uri); //最后personid 为 :10

四、uri与file、path相互转化

1、uri转file:

file = new File(new URI(uri.toString()));

2、file转uri:

URI uri = file.toURI();

3、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) {

return null;

}

if (cursor.moveToFirst()) {

try {

path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));

} catch (Exception e) {

e.printStackTrace();

}

}

cursor.close();

return path;

}

4、path转uri:

Uri uri = Uri.parse(path);

5、file转path:

String path = file.getPath();

6、path转file:

File file = new File(path);

五、常用uri

显示网页:

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. 要使用这个必须在配置文件中加入

发送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);