程序中对话框打开手机本身的sdcard,由于手机中安装有ES文件浏览器,每次打开文件后返回的uri变成file:///sdcard/image.jpg这个格式,这样是不能使用查询数据库方法获得图片的真实路径,而且不能确定手机上都会有这样的软件,有什么办法可以解决这个问题,获取到这种格式的Uri --》content://media/external/images/media/53 真实文件路径,部分代码:private final String IMAGE_TYPE = "image/*";
private final int IMAGE_CODE = 0; //这里的IMAGE_CODE是自己任意定义的
//使用intent调用系统提供的相册功能,使用startActivityForResult是为了获取用户选择的图片
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
startActivityForResult(getAlbum, IMAGE_CODE);
//重写onActivityResult以获得你需要的信息
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode != RESULT_OK) { //此处的 RESULT_OK 是系统自定义得一个常量
Log.e(TAG,"ActivityResult resultCode error");
return;
}
Bitmap bm = null;
//外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
ContentResolver resolver = getContentResolver();
//此处的用于判断接收的Activity是不是你想要的那个
if (requestCode == IMAGE_CODE) {
try {
Uri originalUri = data.getData(); //获得图片的uri
bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); //显得到bitmap图片
这里开始的第二部分,获取图片的路径:
String[] proj = {MediaStore.Images.Media.DATA};
//好像是android多媒体数据库的封装接口,具体的看Android文档
Cursor cursor = managedQuery(originalUri, proj, null, null, null);
//按我个人理解 这个是获得用户选择的图片的索引值
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
//将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToFirst();
//最后根据索引值获取图片路径
String path = cursor.getString(column_index);
}catch (IOException e) {
Log.e(TAG,e.toString());
}
}
}
注:有es文件浏览器的机子,managedQuery()这里cursor为null,因为uri格式不对!求解
private final int IMAGE_CODE = 0; //这里的IMAGE_CODE是自己任意定义的
//使用intent调用系统提供的相册功能,使用startActivityForResult是为了获取用户选择的图片
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
startActivityForResult(getAlbum, IMAGE_CODE);
//重写onActivityResult以获得你需要的信息
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode != RESULT_OK) { //此处的 RESULT_OK 是系统自定义得一个常量
Log.e(TAG,"ActivityResult resultCode error");
return;
}
Bitmap bm = null;
//外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
ContentResolver resolver = getContentResolver();
//此处的用于判断接收的Activity是不是你想要的那个
if (requestCode == IMAGE_CODE) {
try {
Uri originalUri = data.getData(); //获得图片的uri
bm = MediaStore.Images.Media.getBitmap(resolver, originalUri); //显得到bitmap图片
这里开始的第二部分,获取图片的路径:
String[] proj = {MediaStore.Images.Media.DATA};
//好像是android多媒体数据库的封装接口,具体的看Android文档
Cursor cursor = managedQuery(originalUri, proj, null, null, null);
//按我个人理解 这个是获得用户选择的图片的索引值
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
//将光标移至开头 ,这个很重要,不小心很容易引起越界
cursor.moveToFirst();
//最后根据索引值获取图片路径
String path = cursor.getString(column_index);
}catch (IOException e) {
Log.e(TAG,e.toString());
}
}
}
注:有es文件浏览器的机子,managedQuery()这里cursor为null,因为uri格式不对!求解
解决方案 »
- 困惑已久的Android问题!!!
- 监听去电状态
- 弹出窗口的程序中showAsDropDown,showAtLocation方法的参数分别什么意思?求解!
- 求助:无法从引用非静态方法
- 谁有android广播/网络电台的源码吗?
- onKeyListener 软键盘不起作用?--讨论
- android上如何同时实现左右翻页和底部菜单栏导航?不用TabActivity
- 为什么animation没有set方法设置属性?
- android.content.pm.PackageManager$NameNotFoundException,请问各位好心大神这个一般是什么错误 怎么解决
- uri.getPath() 获取地址 上传提示 No such file or directory
- android发布问题
- ndk 开发环境怎么搭建
content://media/external/images/media/53 是用来在Media Provider 查询的路径,
用过了!会在路径前面加上data:
1、检测Uri字符串中是否包含“file:”有的话,使用uri.getPath()直接得到路径,
2、如果没,刚用上面的查询数据库方法,查询文件路径!
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
if(resultCode==RESULT_OK)
{
if(requestCode==1)
{
//获取图片的Uri
Uri uri=data.getData();
System.out.println("data : "+uri.toString());
//通过ContentReslover查找对应的uri的信息
ContentResolver cr = this.getContentResolver();
Cursor cursor = cr.query(uri, null, null, null, null);
cursor.moveToFirst();
for (int i = 0; i < cursor.getColumnCount(); i++)
{
System.out.println(i+"-----------------"+cursor.getString(i));
}
//cursor中的第一列就是绝对地址
System.out.println(cursor.getString(1));
pic_file=new File(cursor.getString(1));
}
}
super.onActivityResult(requestCode, resultCode, data);
绝对路径
这个跟我的差不多吧。执行这个System.out.println("data : "+uri.toString());的时候,就会输出file:///sdcard/image.jpg 下面的查询结果就为空了
Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
这个就是真是路径啊,不明白你想要什么路径,如果要/sdcard/imeg.jpg就去掉千前面的file://
我就是想要这样的/sdcard/imeg.jpg路径,你说的把file去掉,那我问你,你怎么知道别人手机上返回会出现file://这个头(会不会哪个文件浏览器返回这个data:///sdcard/image.jpg给你呢?),不是每个手机返回的Intent中的uri都会包含file://的,没安装文件浏览器的手机,返回的就是那个Media Provider 查询的路径,我想问的就是有没有通用的方法,不管你装了什么软件,都返回一个类型的路径,而不是有的返回真实路径,有的返回Media Provider 查询的路径。