2014-03-06 19 views
3

我一直在嘗試獲取在KitKat畫廊中選擇的圖像的絕對圖像路徑,但它似乎並沒有工作。無論我做什麼,我的變量IMAGE_FILEPATH總是「」。這裏是我的代碼onActivityResult()Android KitKat圖像選擇不返回任何東西

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode != Activity.RESULT_OK) return; 
    if (null == data) return; 
    Uri originalUri = null; 
    if (requestCode == 1) { 
     //JB!!! 
      Uri uri = data.getData(); 

      if (uri != null) { 

       try { 
        // User had pick an image. 
        String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

        Cursor cursor = getContentResolver() 
          .query(uri, 
            filePathColumn, null, null, null); 

        cursor.moveToFirst(); 

        IMAGE_FILEPATH = cursor.getString(0); 
        cursor.close(); 
       } catch (Exception e) { 
        Crouton.makeText(this, "Failed to get image", Style.ALERT).show(); 
       } 
      } 
    } else if (requestCode == 2) { 
     //KK!!! 
      Uri uri = data.getData(); 

      if (uri != null) { 
       try { 
        if(uri == null) { 
         IMAGE_FILEPATH = uri.getPath(); 
        } else { 
         String[] projection = { MediaStore.Images.Media.DATA }; 
         Cursor cursor = managedQuery(uri, projection, null, null, null); 
         if(cursor != null){ 
          int column_index = cursor 
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
          cursor.moveToFirst(); 
          IMAGE_FILEPATH = cursor.getString(column_index); 
         } else { 
          IMAGE_FILEPATH = uri.getPath(); 
         } 
        } 


       } catch (Exception e) { 
        Crouton.makeText(this, "Failed to get image", Style.ALERT).show(); 
       } 
      } 
    } 
    Resource.toast(IMAGE_FILEPATH); 

    super.onActivityResult(requestCode, resultCode, data); 
} 

怎麼回事?我嘗試了多種解決方案,似乎沒有任何工作。

回答

9

在奇巧圖庫返回一個URI像這樣的:content://com.android.providers.media.documents/document/image:1

代替:

content://media/external/images/media/1 

所以,這裏是你可以KK在寫什麼,使其工作:

if (uri != null) { 
    try { 
     if(uri == null) { 
      IMAGE_FILEPATH = uri.getPath(); 
     } else { 
      // get the id of the image selected by the user 
      String wholeID = DocumentsContract.getDocumentId(data.getData()); 
      String id = wholeID.split(":")[1]; 

      String[] projection = { MediaStore.Images.Media.DATA }; 
      String whereClause = MediaStore.Images.Media._ID + "=?"; 
      Cursor cursor = getContentResolver().query(getUri(), projection, whereClause, new String[]{id}, null); 
      if(cursor != null){ 
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
       if (cursor.moveToFirst()) { 
        IMAGE_FILEPATH = cursor.getString(column_index); 
       } 

       cursor.close(); 
      } else { 
       IMAGE_FILEPATH = uri.getPath(); 
      } 
     } 
    } catch (Exception e) { 
     Crouton.makeText(this, "Failed to get image", Style.ALERT).show(); 
    } 
} 

而我使用的功能:

private Uri getUri() { 
    String state = Environment.getExternalStorageState(); 
    if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) { 
     return MediaStore.Images.Media.INTERNAL_CONTENT_URI; 
    } 

    return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
} 

這些貼子對我有幫助:retrieve absolute path when select image from gallery kitkat androidGet real path from URI, Android KitKat new storage access framework

0

moveToFirst返回一個布爾值,指示移動到該位置是否導致了數據。

boolean haveData; 
haveData = cursor.moveToFirst(); 

if (haveData) { 
cursor.getString(..... 

這就是你應該做的,這是好的,防禦性的編程。現在,爲什麼你的光標是空的,這將需要更多的挖掘你的contentResolver。