2014-11-24 530 views
4

我想从图库中选择图像,然后将此图像转换为文件并通过HttpPost发送它,但我总是得到FileNotFoundException。这是我的代码:从Uri类型创建文件android

选择照片

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 

因此,任何他LP?


更新 我曾尝试这种解决方案也:

//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卡鲁解决方案,但它返回结果始终为空。

回答

6
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(); 
    } 
    } 
} 

得到真正的路径现在modifiy你的代码像

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(); 
    } 
    } 
} 
+0

我想这已经检查我的更新吧。 – Chlebta 2014-11-24 11:44:07

+8

你给的函数总是返回null。 – Chlebta 2014-11-24 12:11:05