程序中对话框打开手机本身的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格式不对!求解

解决方案 »

  1.   

    file:///sdcard/image.jpg  这个是真实路径, 在sd 卡上的路径
    content://media/external/images/media/53 是用来在Media Provider 查询的路径, 
      

  2.   

    自己做字符串处理下吧,检测到路径中有file://就去掉。
      

  3.   

     Uri.getPath()这个函数试过没有?
      

  4.   


    用过了!会在路径前面加上data:
      

  5.   

    这么久了都没人回复,那我说说我的解决方法吧,给其他人作为参考,很笨的一个办法,
    1、检测Uri字符串中是否包含“file:”有的话,使用uri.getPath()直接得到路径,
    2、如果没,刚用上面的查询数据库方法,查询文件路径!
      

  6.   

    复写onActivityResult函数
    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);
      

  7.   

    纠正一下 是Cursor中编号为1的列即为相应的绝对路径
      

  8.   

    MediaStore.Images.Media.DATA 
    绝对路径
      

  9.   


    这个跟我的差不多吧。执行这个System.out.println("data : "+uri.toString());的时候,就会输出file:///sdcard/image.jpg 下面的查询结果就为空了 
      

  10.   


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

  11.   


    这个就是真是路径啊,不明白你想要什么路径,如果要/sdcard/imeg.jpg就去掉千前面的file://
      

  12.   


    我就是想要这样的/sdcard/imeg.jpg路径,你说的把file去掉,那我问你,你怎么知道别人手机上返回会出现file://这个头(会不会哪个文件浏览器返回这个data:///sdcard/image.jpg给你呢?),不是每个手机返回的Intent中的uri都会包含file://的,没安装文件浏览器的手机,返回的就是那个Media Provider 查询的路径,我想问的就是有没有通用的方法,不管你装了什么软件,都返回一个类型的路径,而不是有的返回真实路径,有的返回Media Provider 查询的路径。