web-dev-qa-db-ja.com

ファイルパスは常にLollipopでnullを返しますandroid

これは、内部ストレージ(ギャラリー)から画像を取得するときの私のコードです。 Lollipopファイルのパスでは、常に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();
        }
9
Gopal Singh

すべてに感謝します、私は解決策を見つけました。

    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);
24
Gopal Singh
///////////////////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
Mayur Kanodia

Lollipopは、システムからファイルを取得する別のコースを受講することにしました。 (キットカットからのものだと言う人もいますが、キットカットではまだ遭遇していません)。以下のコードは、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

マニフェストに権限を追加します-

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

コンテンツを読む前に、読み取り権限を定義する必要があります。

[〜#〜]編集済み[〜#〜]

コードを更新します-

        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
Ravi Bhandari
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;

}
0
chetan muliya