【问题标题】:Create File from Uri type android从 Uri 类型的 android 创建文件
【发布时间】:2014-11-24 11:15:06
【问题描述】:

我正在尝试从图库中选择图像,然后将此图像转换为文件并通过 HttpPost 发送,但我总是得到FileNotFoundException。这是我的代码:

选择照片

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 1) {
                // currImageURI is the global variable I’m using to hold the content:
                currImageURI = data.getData();
                //Save the currImageUri (URI type) to global variable.
                photosHolder.getInstance().setOneIm(currImageURI);
            }
        }
    }

转换照片

                // First Try
                File myFile = new File((photosHolder.getInstance().getOneIm()).toString());
                params.put("visit_report[photos_attributes][0][file]",myFile); **The exception Raised here
// second try 
                File myFile2 = new File((photosHolder.getInstance().getOneIm()).getPath());
                params.put("visit_report[photos_attributes][1][file]",myFile2); ** Also here

这些是调试时的 myFiles 值:

mFile : content:/com.android.providers.media.documents/document/image%3A19143
myFile2 : /document/image:19143

那么有什么帮助吗?


更新 我也试过这个解决方案:

//get The real path from uri then save it (and then use it to create the file)
photosHolder.getInstance().setUriString(getRealPathFromURI(currImageURI));

//Convert the image URI to the direct file system path of the image file
    private String getRealPathFromURI(Uri contentURI) {
        String result = "";
        try {
        Cursor cursor = getActivity().getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) { // Source is Dropbox or other similar local file path
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
            result = cursor.getString(idx); // Exception raised HERE
            cursor.close(); }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

但我得到了java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from itidx var == 到-1

我也尝试过@Praneeth Kalluri 解决方案,但它总是返回 null 作为结果。

【问题讨论】:

    标签: java android file uri loopj


    【解决方案1】:
     Uri currImageURI = data.getData();
    

    打印 currImageURI 会给你这样的东西:

    content://media/external/images/media/47
    

    但我们需要的是该特定图像的绝对路径。所以我们需要从uri获取真实路径

    public String getRealPathFromURI(Context context, Uri contentUri) {
      Cursor cursor = null;
      try { 
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
      } finally {
        if (cursor != null) {
          cursor.close();
        }
      }
    }
    

    现在修改你的代码

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == Activity.RESULT_OK) {
                if (requestCode == 1) {
                    // currImageURI is the global variable I’m using to hold the content:
                    currImageURI = data.getData();
                    //Save the currImageUri (URI type) to global variable.
                    photosHolder.getInstance().setOneIm(getRealPathFromURI(getActivity(),currImageURI));
                }
            }
        }
    
    public String getRealPathFromURI(Context context, Uri contentUri) {
      Cursor cursor = null;
      try { 
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
      } finally {
        if (cursor != null) {
          cursor.close();
        }
      }
    }
    

    【讨论】:

    • 你给的函数总是返回 null 。
    猜你喜欢
    • 2018-01-13
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多