1

I am trying to get the real path of a URI.

First I start the gallery app through an intent:

Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select picture"), SELECT_IMAGE );

After that the onActivityResult gets called, where I try to get the absolut path of the URI.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        if (resultCode == RESULT_OK) {
            Uri uri;
            if (requestCode == SELECT_IMAGE) {
                final Uri uri_data = data.getData();
                // Get the path from the Uri
                final String path = getPathFromURI(uri_data);
                if (path != null) {
                    File f = new File(path);
                    uri = Uri.fromFile(f);
                }
            }
        }
    } catch (Exception e) {
        Log.e("FileSelectorActivity", "File select error", e);
    }
}

The uri_data contains "content://com.android.providers.media.documents/document/image%3A67", but the resulting path is null.

The pathFromUri method looks like this:

private String getPathFromURI(Uri contentUri) {
String res = null;
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    res = cursor.getString(column_index);
}
cursor.close();
return res;
}

Here the column_index is 0, but cursor.getString returns null.

Why does this happen?

I have the permission android.permission.READ_EXTERNAL_STORAGE

EDIT: So I want to take a picture through the camera app, and the user then chooses the image. So the file should be acutally stored on the phone (which is, since I am testing it on my phone)

EDIT:

Okey, the solution was to request the permissions at runtime...sorry guys

  • Note that your code will fail on lots of devices for lots of users. There is no requirement for `ACTION_GET_CONTENT` to return a `Uri` for which your `getPathFromURI()` will work. See [this](https://stackoverflow.com/a/49221353/115145) and [this](https://stackoverflow.com/a/48510756/115145) for more. – CommonsWare Jun 30 '18 at 23:10

0 Answers0