2014-11-24 3 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 

변환을 선택하고 debuging 동안 사람들은 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 it-1

또한 내가 시도 @Praneeth Kalluri 솔루션에 idx var에 ==을 가지고 있지만, 결과로서 항상 null을 리턴합니다.

답변

6
Uri currImageURI = data.getData(); 

currImageURI를 인쇄하는 당신에게이 같은 어떤 것을 줄 것이다 :

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

그러나 우리가 필요로하는 특정 이미지의 절대 경로입니다. 그래서 우리는

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

URI

에서 실제 경로를 얻을 필요가 이제

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

같은 코드가 나는이 이미 내 업데이 트를하시기 바랍니다 확인하려고 modifiy. – Chlebta

+8

지정한 함수는 항상 null을 반환합니다. – Chlebta