目录
Uri简介
UriMatcher
ContentUris
获取Uri路径后面的ID
从路径中获取ID
uri与file、path相互转化
Uri转file
Uri转path
file转Uri
file转path
path转Uri
path转file
被document封装过后的Uri
Android4.4之前的Uri形式
Android4.4之后的Uri形式
通过获取图片路径代码来分析document
Android4.4之后获取图片路径
4.4以上获得的Uri内容
判断该Uri是否是document封装过的
获取图片数据库数据表里指定的行
获取Uri的路径 getAuthority()
观察获取图片完整路径的方法
Android4.4 之前获取图片路径
一个调用相册获取图片的demo
常用Uri
Uri简介
通用资源标识符(Universal Resource Identifier) 简称Uri
Uri 代表要操作的数据,Android 上可用的资源(图像、视频片段)都可以用Uri表示
Android的Uri由以下三部分组成
1."content://"、数据的路径、标识ID(可选)
例如所有图片
1. Uri:content://media/external
2. Uri uri = .EXTERNAL_CONTENT_URI;
某个图片
Uri:content://media/external/images/media/4
Android 提供他了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris
UriMatcher
UriMatcher 类主要用于匹配Uri
public static final int BOOK_DIR = 0;
public static final int BOOK_ITEM = 1;
//第一步,初始化
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
//第二步,注册待匹配的Uri
(AUTHORITY,"book",BOOK_DIR);
(AUTHORITY,"book/#",BOOK_ITEM);
//第三步,进行匹配
Uri uri = ("content://" + "" + "/book");
int match = (uri);
switch (match){
case BOOK_DIR:
return "/book";
case BOOK_ITEM:
return "/book";
default:
return null;
}
//上面返回的是Uri对应的MIME
ContentUris
获取Uri路径后面的ID
//比如有这样一个Uri
Uri uri = ("content:///book");
//通过ContentUris的withAppendedId()方法,为该Uri加上ID
Uri resultUri = (uri, 10);
//最后resultUri为:
//content:///book/10
从路径中获取ID
Uri uri = ("content:///book/10")
long personid = (uri);
uri与file、path相互转化
Uri转file
File = new File(new URI()));
Uri转path
private String getPath(Context context, Uri uri) {
String path = null;
Cursor cursor = ().query(uri, null, null, null, null);
if (cursor == null) {
return null;
}
if (()) {
try {
path = (());
} catch (Exception e) {
();
}
}
();
return path;
}
file转Uri
URI uri = ();
file转path
string path = ();
path转Uri
Uri uri = (path);
path转file
File file = new File(path);
被document封装过后的Uri
Android4.4之前的Uri形式
Uri : content://media/extenral/images/media/17766
Android4.4之后的Uri形式
content:///document/image%3A82482
由此可见,4.4以上的系统使用了document封装过了
通过获取图片路径代码来分析document
Android4.4之后获取图片路径
private void handleImageOkKitKat(Intent data) {
String imagePath=null;
Uri uri = ();
(" :",""+uri);
if ((this,uri)){
String docId = (uri);
("getDocumentId(uri) :",""+docId);
("() :",""+());
if ("".equals(())){
String id = (":")[1];
String selection = ._ID + "=" + id;
imagePath = getImagePath(.EXTERNAL_CONTENT_URI,selection);
}
else if (",".equals(())) {
Uri contentUri = (("content://downloads/public_downloads"),(docId));
imagePath = getImagePath(contentUri,null);
}
}
else if ("content".equalsIgnoreCase(())){
imagePath = getImagePath(uri,null);
}
displayImage(imagePath);
}
4.4以上获得的Uri内容
Uri uri = (); (" :",""+uri);
运行结果:D/uri= :﹕ content:// ./document/image%3A82483 可以看到Uri不同于之前系统版本, 选取不同的图片观察Uri是相同的。
判断该Uri是否是document封装过的
静态方法:isDocumentUri(Context context, Uri uri)
(this,uri
获取图片数据库数据表里指定的行
静态方法:getDocumentId(Uri uri)
String docId = (uri);
运行结果: D/getDocumentId(uri) :﹕ image:82482 返回一个字符串, 实际上就代表了该图片存储数据库数据表里的行的位置。
获取Uri的路径 getAuthority()
属于Uri对象的对象方法。
()
运行结果: D/() :﹕ 可以对照Uri的组成判断。 “content://” + 数据的路径 + 标示ID(可选)
如果路径不同获取图片的方式是不一样的
if ("".equals(())){
String id = (":")[1];
String selection = ._ID + "=" + id;
imagePath = getImagePath(.EXTERNAL_CONTENT_URI,selection); }
else if (",".equals(())) {
Uri contentUri = (("content://downloads/public_downloads"),(docId));
imagePath = getImagePath(contentUri,null);
}
路径下的图片是经过特殊封装的,
而并没有。
观察获取图片完整路径的方法
这里再观察获取图片完整路径的方法(getImagePath)的代码,本质是使用内容提供器获取数据:
public String getImagePath(Uri uri,String selection) {
String path = null;
Cursor cursor = getContentResolver().query(uri,null,selection,null,null); //内容提供器
if (cursor!=null){
if (()){
path = (()); //获取路径
}
}
();
return path;
}
由上,可以知道使用document封装是向数据表添加了列形成了一个新数据库
.EXTERNAL_CONTENT_URI只有根据来查询,此时的id(id指的不是之前的getDocumentId(uri)的docID,而是将docID以:分割获取的数值标号)是对应图片行列的标号。
而路径则是以4.4之前版本的形式的Uri存储的。
Android4.4 之前获取图片路径
private void handleImageBeforeKitKat(Intent data) {
Uri uri = ();
String imagePath = getImagePath(uri,null);
displayImage(imagePath);
}
Uri里就包含了该图片所在行的id。
Uri : content://media/extenral/images/media/17766
使用内容提供器可以轻松获取路径。
一个调用相册获取图片的demo
public class MainActivity extends AppCompatActivity {
private static final int TAKE_PHOTO = 1;
private static final int CROP_PHOTO = 2;
private static final int CHOOSE_PIC = 3;
private Button takePhoto;
private Button choosePicture;
private ImageView picture;
Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
setContentView(.activity_main);
picture = (ImageView) findViewById();
takePhoto = (Button) findViewById(.take_photo);
(new () {
@Override
public void onClick(View v) {
File outputFile = new File((),"output_image.jpg");
try{
if (()){
();
}
();
} catch (IOException e) {
();
}
imageUri = (outputFile);
Intent intent = new Intent(".IMAGE_CAPTURE");
(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
});
choosePicture = (Button) findViewById(.choose_picture);
(new () {
@Override
public void onClick(View v) {
Intent intent = new Intent(".GET_CONTENT");
("image/*");
startActivityForResult(intent,CHOOSE_PIC);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode){
case TAKE_PHOTO:
if (resultCode==RESULT_OK){
Intent intent = new Intent("");
(imageUri,"image/*");
("scale", true);
(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,CROP_PHOTO);
}
break;
case CROP_PHOTO:
if (resultCode==RESULT_OK){
try {
Bitmap bitmap = (getContentResolver().openInputStream(imageUri));
(bitmap);
} catch (FileNotFoundException e) {
();
}
}
break;
case CHOOSE_PIC:
if (resultCode==RESULT_OK){
if (.SDK_INT>=19){
handleImageOkKitKat(data);
}
else{
handleImageBeforeKitKat(data);
}
}
default:
break;
}
}
private void handleImageBeforeKitKat(Intent data) {
Uri uri = ();
String imagePath = getImagePath(uri,null);
displayImage(imagePath);
}
private void handleImageOkKitKat(Intent data) {
String imagePath=null;
Uri uri = ();
("uri= :",""+uri);
if ((this,uri)){
String docId = (uri); //数据表里指定的行
("getDocumentId(uri) :",""+docId);
("() :",""+());
if ("".equals(())){
String id = (":")[1];
String selection = ._ID + "=" + id;
imagePath = getImagePath(.EXTERNAL_CONTENT_URI,selection);
}
else if ("".equals(())) {
Uri contentUri = (("content://downloads/public_downloads"),(docId));
imagePath = getImagePath(contentUri,null);
}
}
else if ("content".equalsIgnoreCase(())){
imagePath = getImagePath(uri,null);
}
displayImage(imagePath);
}
private void displayImage(String imagePath) {
if (imagePath!=null){
Bitmap bitImage = (imagePath);
(bitImage);
}
else{
(,"failed to get image",Toast.LENGTH_SHORT).show();
}
}
public String getImagePath(Uri uri,String selection) {
String path = null;
Cursor cursor = getContentResolver().query(uri,null,selection,null,null); //内容提供器
if (cursor!=null){
if (()){
path = (()); //获取路径
}
}
();
return path;
}
}
常用Uri
显示网页:
1. Uri uri = ("");
2. Intent it = new Intent(Intent.ACTION_VIEW,uri);
3. startActivity(it);
显示地图:
1. Uri uri = ("geo:38.899533,-77.036476");
2. Intent it = new Intent(Intent.Action_VIEW,uri);
3. startActivity(it);
路径规划:
1. Uri uri = ("/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 = ("tel:xxxxxx");
2. Intent it = new Intent(Intent.ACTION_DIAL, uri);
3. startActivity(it);
1. Uri uri = ("");
2. Intent it =new Intent(Intent.ACTION_CALL,uri);
3. 要使用这个必须在配置文件中加入<uses-permission />
发送SMS/MMS
调用发送短信的程序
1. Intent it = new Intent(Intent.ACTION_VIEW);
2. ("sms_body", "The SMS text");
3. ("-dir/mms-sms");
4. startActivity(it);
发送短信
1. Uri uri = ("smsto:0800000123");
2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
3. ("sms_body", "The SMS text");
4. startActivity(it);
发送彩信
1. Uri uri = ("content://media/external/images/media/23");
2. Intent it = new Intent(Intent.ACTION_SEND);
3. ("sms_body", "some text");
4. (Intent.EXTRA_STREAM, uri);
5. ("image/png");
6. startActivity(it);
发送Email
1.
2. Uri uri = ("mailto:xxx@");
3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
4. startActivity(it);
1. Intent it = new Intent(Intent.ACTION_SEND);
2. (Intent.EXTRA_EMAIL, "me@");
3. (Intent.EXTRA_TEXT, "The email body text");
4. ("text/plain");
5. startActivity((it, "Choose Email Client"));
1. Intent it=new Intent(Intent.ACTION_SEND);
2. String[] tos={"me@"};
3. String[] ccs={"you@"};
4. (Intent.EXTRA_EMAIL, tos);
5. (Intent.EXTRA_CC, ccs);
6. (Intent.EXTRA_TEXT, "The email body text");
7. (Intent.EXTRA_SUBJECT, "The email subject text");
8. ("message/rfc822");
9. startActivity((it, "Choose Email Client"));
添加附件
1. Intent it = new Intent(Intent.ACTION_SEND);
2. (Intent.EXTRA_SUBJECT, "The email subject text");
3. (Intent.EXTRA_STREAM, "[url=]file:///sdcard/mysong.mp3[/url]");
4. ("audio/mp3");
5. startActivity((it, "Choose Email Client"));
播放多媒体
1.
2. Intent it = new Intent(Intent.ACTION_VIEW);
3. Uri uri = ("[url=]file:///sdcard/song.mp3[/url]");
4. (uri, "audio/mp3");
5. startActivity(it);
1. Uri uri = (.INTERNAL_CONTENT_URI, "1");
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. startActivity(it);
Uninstall 程序
1. Uri uri = ("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);
(Intent.CATEGORY_OPENABLE);
(MIME_TYPE_IMAGE_JPEG);
startActivityForResult(getImage, ACTIVITY_GET_IMAGE);
//调用系统相机应用程序,并存储拍下来的照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
time = ().getTimeInMillis();
(MediaStore.EXTRA_OUTPUT, (new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);
uninstall apk
/**未测试
Uri uninstallUri = ("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);
*/
Uri packageURI = ("package:"+wistatmap);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);
install apk
Uri installUri = ("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);
play audio
Uri playUri = ("[url=]file:///sdcard/download/everything.mp3[/url]");
returnIt = new Intent(Intent.ACTION_VIEW, playUri);
//发送附件
Intent it = new Intent(Intent.ACTION_SEND);
(Intent.EXTRA_SUBJECT, "The email subject text");
(Intent.EXTRA_STREAM, "[url=]file:///sdcard/eoe.mp3[/url]");
("audio/mp3");
startActivity((it, "Choose Email Client"));
//搜索应用
Uri uri = ("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.ACTION_VIEW);
(People.CONTENT_URI);
startActivity(intent);
//查看指定联系人
Uri personUri = (People.CONTENT_URI, );//联系人ID
Intent intent = new Intent();
(Intent.ACTION_VIEW);
(personUri);
startActivity(intent);