7

這是我的代碼,當我從內部存儲(庫)獲取圖像時。 在棒棒糖文件路徑中,返回值始終爲空。文件路徑返回null總是在棒棒糖android

if (requestCode == PICK_IMAGE) { 
     if(resultCode == RESULT_OK){ 
      //image successfully picked 
      // launching upload activity 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
      Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      columnindex = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
      file_path = cursor.getString(columnindex); 
      Log.d(getClass().getName(), "file_path"+file_path); 
      fileUri = Uri.parse("file://" + file_path); 
      cursor.close(); 
      launchUploadActivity(true, PICK_IMAGE); 
     }else if (resultCode == RESULT_CANCELED) { 
      // user cancelled recording 
      Toast.makeText(getApplicationContext(),"User cancelled image selection", Toast.LENGTH_SHORT).show(); 
     } else { 
      // failed to record video 
      Toast.makeText(getApplicationContext(),"Sorry! failed to pick image", Toast.LENGTH_SHORT).show(); 
     } 

回答

17

Thanx all,I found th e解決方案。

Uri selectedImage = data.getData(); 
      String wholeID = DocumentsContract.getDocumentId(selectedImage); 

      // Split at colon, use second item in the array 
      String id = wholeID.split(":")[1]; 

      String[] column = { MediaStore.Images.Media.DATA };  

      // where id is equal to    
      String sel = MediaStore.Images.Media._ID + "=?"; 

      Cursor cursor = getContentResolver(). 
             query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
             column, sel, new String[]{ id }, null); 

      String filePath = ""; 

      int columnIndex = cursor.getColumnIndex(column[0]); 

      if (cursor.moveToFirst()) { 
       filePath = cursor.getString(columnIndex); 
      } 
      cursor.close(); 
      setImageFromIntent(filePath); 
+0

我得到了非法的參數異常無效uri – BooDoo 2016-06-09 21:41:38

+0

你能分享你的代碼和日誌嗎? – 2016-06-10 10:33:44

1

添加權限您的清單 -

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

你必須定義讀取權限,前閱讀任何內容。

EDITED

更新你的代碼 -

 Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 

     columnindex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     file_path = cursor.getString(columnindex); 
     Log.d(getClass().getName(), "file_path"+file_path); 
     fileUri = Uri.parse("file://" + file_path); 
     cursor.close(); 
     launchUploadActivity(true, PICK_IMAGE); 

所以在這裏,如果從光標獲取數據的任何異常則拋出異常。

+0

感謝名單,但我已經做到了這一點。 – 2015-03-19 12:27:25

+0

你是否得到任何錯誤? – Ravi 2015-03-19 12:28:06

+0

圖像路徑顯示null ..但是當我點擊圖像從相機它工作正常。還有一個問題是隻有棒棒糖版本。 – 2015-03-19 12:30:00

1

棒棒堂決定採取另一個課程從系統獲取文件。 (有人說它來自KitKat,但我還沒有在KitKat上遇到它)。下面的代碼是得到棒棒糖的文件路徑

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && isMediaDocument(uri)) 
    { 
     final String docId = DocumentsContract.getDocumentId(uri); 
     final String[] split = docId.split(":"); 
     final String type = split[0]; 

     Uri contentUri = null; 
     if ("image".equals(type)) 
     { 
      contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     } 

     final String selection = "_id=?"; 
     final String[] selectionArgs = new String[] { 
       split[1] 
     }; 

     String filePath = getDataColumn(context, contentUri, selection, selectionArgs); 
    } 

isMediaDocument:

public static boolean isMediaDocument(Uri uri) 
{ 
    return "com.android.providers.media.documents".equals(uri.getAuthority()); 
} 

getDataColumn:

private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) 
{ 
    Cursor cursor = null; 
    final String column = "_data"; 
    final String[] projection = { 
      column 
    }; 

    try { 
     cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); 
     if (cursor != null && cursor.moveToFirst()) 
     { 
      final int column_index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(column_index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

如果你還有問題,this是檢查圖像的完整的答案,音頻,視頻,文件等

+0

什麼是DocumentsContract.getDocumentId(uri);這裏.. – 2015-03-20 10:02:34

+0

在棒棒糖圖片也被視爲文件。所以getDocumentId檢索圖像的ID。這用於獲取類型(在本例中僅包含圖像)並從查詢中獲取正確的圖像(請參閱getDataColumn - > selection)。這裏是DocumentsContract的開發者網站:http://developer.android.com/reference/android/provider/DocumentsContract.html#getDocumentId(android.net.Uri) – 2015-03-20 10:07:59

+0

已經使用過這段代碼,在文件路徑中也返回null – 2015-03-20 10:17:15

0
///////////////////create file obj: 
private File mFileTemp; 

String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      mFileTemp = new File(Environment.getExternalStorageDirectory(), InternalStorageContentProvider.TEMP_PHOTO_FILE_NAME); 
     } 
     else { 
      mFileTemp = new File(getFilesDir(), InternalStorageContentProvider.TEMP_PHOTO_FILE_NAME); 
     } 
/////////////////// use in start activity for result 
try { 

        InputStream inputStream = getContentResolver().openInputStream(data.getData()); 
        FileOutputStream fileOutputStream = new FileOutputStream(mFileTemp); 
        copyStream(inputStream, fileOutputStream); 
        fileOutputStream.close(); 
        inputStream.close(); 

        imagepath = mFileTemp.getPath(); 

       } catch (Exception e) { 

        Log.e("TAG", "Error while creating temp file", e); 
       } 
///////////////// 
    public static void copyStream(InputStream input, OutputStream output) 
      throws IOException 
      { 
     byte[] buffer = new byte[1024]; 
     int bytesRead; 
     while ((bytesRead = input.read(buffer)) != -1) 
     { 
      output.write(buffer, 0, bytesRead); 
     } 
    } 
+1

請解釋你的代碼。雖然純粹的代碼答案可能會使提問者的代碼正常工作,但它不會回答他們的問題,因爲他們通常不會理解解決方案。 – SuperBiasedMan 2015-06-04 09:27:28