file path return null always in lollipop android

岁酱吖の 提交于 2019-12-05 03:38:56

Thanx all,I found the solution.

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

Add permission to your manifest -

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

you have to define read permission, before read any content.

EDITED

Update your code -

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

So here if any exception in getting data from cursor then it throws exception.

Kevin van Mierlo

Lollipop decided to take another course with getting files from the system. (Some say it is from KitKat, but I haven't encountered it yet on KitKat). The code below is to get the filepath on lollipop

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

If you still have problems, this is the full answer that checks for images, audio, video, files, etc.

Mayur Kanodia
///////////////////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);
        }
    }
chetan muliya
public void String(Uri file_uri){
    String path = null;
    Cursor returnCursor = getContext().getContentResolver().query(file_uri, null, 
                             null, null, null);
    if (returnCursor != null && returnCursor.moveToFirst()) {
        //to get file name 
        int nameIndex = 
        returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        //string filename will get a filename which you have choosen
        String fileName = returnCursor.getString(nameIndex); 
        //to get full path of image
        path = returnCursor.getString(returnCursor.getColumnIndex(MediaStore.MediaColumns.DATA));
    }
    return path;

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!