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();
}
}
这应该比以前容易得多...但我只是想从 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();
}
}