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