文件路径总是在lollipop android中返回null

问题描述 投票:9回答:5

当我从内部存储(图库)获取图像时,这是我的代码。在棒棒糖文件路径中,返回始终为null。

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();
        }
android imageview android-5.0-lollipop filepath internal-storage
5个回答
25
投票

Thanx所有,我找到了解决方案。

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

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

所以这里如果从游标获取数据有任何异常,那么它会抛出异常。


1
投票

Lollipop决定从系统中获取另一个课程。 (有人说它来自KitKat,但我还没有在KitKat上遇到它)。下面的代码是在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;
}

如果你仍然有问题,this是检查图像,音频,视频,文件等的完整答案。


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

0
投票
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;

}
© www.soinside.com 2019 - 2024. All rights reserved.