MediaStore 返回 NULL

MediaStore returning NULL

这应该比以前容易得多...但我只是想从 URI 获取图像的完整路径。

String[] projection = { MediaStore.MediaColumns.DISPLAY_NAME};

将正确显示文件名但是:

String[] projection = { MediaStore.MediaColumns.DATA};  

或...

String[] projection = { MediaStore.Images.Media.DATA};

...只会给我 NULL。

也许我只是太累了,没有想清楚(这是一个更大的应用程序中非常小的一部分)但我不太明白如果图像清晰地存在,位图,那怎么可能工作正常,显示名称有效。我确定我错过了一些简单的东西......我现在看不到它。

完整代码如下:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {

        Uri selectedImageUri = null;
        if (data != null) {

            selectedImageUri = data.getData();
            String[] projection = { MediaStore.MediaColumns.DISPLAY_NAME};

            ContentResolver cr = this.getApplicationContext().getContentResolver();

            Cursor metaCursor = cr.query(selectedImageUri,
                    projection, null, null, null);
          metaCursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);

            if (metaCursor != null) {
                try {
                    if (metaCursor.moveToFirst()) {
                        imagepath = metaCursor.getString(0);
                        Log.i(TAG, "UriB: " + metaCursor.getString(0));
                    }
                } finally {
                    metaCursor.close();
                }
            }

            Log.i(TAG, "Uri: " + selectedImageUri.toString());

        }





        try {
            Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImageUri));
            imageview.setImageBitmap(bitmap);
            messageText.setText("Uploading file path: " + imagepath);
        } catch (IOException ie) {
            messageText.setText("Error");
        }


    }
}

androidmanifest.xml

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jon.bon" >
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE_EXTERNAL_STORAGE"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >


        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DisplayMessageActivity" >
        </activity>
    </application>

我知道有很多关于此的页面,因为我现在打开了大约 7 个页面,但我就是不明白为什么我被卡住了。

编辑

看来我可能不得不使用 EXTERNAL_CONTENT_URI。但是当我这样做时:

Cursor metaCursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);

...无论我尝试使用什么图像,我都会得到一些完全随机的(好吧...实际上是一个非常具体的)路径。好像一点关系都没有。

如果允许,下面的代码将适用于 'Intent.ACTION_PICK'。

 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, Constants.PICK_GALLERY);

如果没有,则添加设备规范。 OnActivity 结果如下。

if(responseCode == activity.RESULT_OK && requestCode==Constants.PICK_GALLERY){
        Uri selectedImage = data.getData();
        String[] filePath = {MediaStore.Images.Media.DATA};
        try {
            Cursor c = activity.getContentResolver().query(selectedImage, filePath, null, null, null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePath[0]);
            String picturePath = c.getString(columnIndex);
            c.close();
            if(picturePath==null) {
                picturePath=selectedImage.getPath();
            }
            //Use picturePath for setting bitmap  or to crop 
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }