Java cursor.getString返回空值和有效uri

Java cursor.getString返回空值和有效uri,java,android,bitmap,Java,Android,Bitmap,程序突然停止了工作 我有一个URI:“content://com.android.providers.media.documents/document/image%3A13”,图像的文件路径 URI的路径选择如下: protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data)

程序突然停止了工作

我有一个URI:“
content://com.android.providers.media.documents/document/image%3A13
”,图像的文件路径

URI的路径选择如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode,  data);
        if(resultCode == RESULT_OK) {
            try {

                // This bit here
                Bitmap bitmap = getPath(data.getData());
                Log.i("Bitmap", "Bmp: " + data.getData());

            }catch (Exception e){
                Log.e("Error", "Error with setting the image.");
                e.printStackTrace();
            }
        }
    }
因此,调用了
getPath()
,将数据作为URI放入(URI是正确的,日志显示)

getPath()
中:

Logcat输出:

 java.lang.IllegalArgumentException: filename cannot be null
     at android.media.ExifInterface.<init>(ExifInterface.java:121)
     at build.com.build.SubmitPicActivity.getPath(SubmitPicActivity.java:123)
     at build.com.build.SubmitPicActivity.onActivityResult(SubmitPicActivity.java:93)
     at android.app.Activity.dispatchActivityResult(Activity.java:5423)
     at android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
     at android.app.ActivityThread.access$1300(ActivityThread.java:135)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:136)
     at android.app.ActivityThread.main(ActivityThread.java:5017)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
     at dalvik.system.NativeStart.main(Native Method)
java.lang.IllegalArgumentException:文件名不能为null
在android.media.ExifInterface.(ExifInterface.java:121)
在build.com.build.SubmitPicActivity.getPath(SubmitPicActivity.java:123)
在build.com.build.SubmitPicActivity.onActivityResult(SubmitPicActivity.java:93)上
位于android.app.Activity.dispatchActivityResult(Activity.java:5423)
位于android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
位于android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
在android.app.ActivityThread.access$1300(ActivityThread.java:135)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:136)
位于android.app.ActivityThread.main(ActivityThread.java:5017)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:515)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
在dalvik.system.NativeStart.main(本机方法)
第123行是:
stringfilepath=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA))

第93行是:
Bitmap Bitmap=getPath(data.getData())

有什么建议吗?

。您尝试为
Uri
获取
文件
时使用的代码从来都不可靠,将来也不会起多大作用


请使用
ContentResolver
openInputStream()
getType()
等方法适当地使用
Uri
。本质上,你对待
Uri
的方式与对待Web服务器的URL的方式相同,原因也大致相同:不要求
ContentProvider
提供的内容来自你的应用程序可以访问的普通
文件。

私有位图getPath(Uri)
名称错误,因为它不返回路径,而是返回位图。最好让它返回filePath。然后使另一个函数Bitmap=getBitmap(字符串路径);。使您的代码更具可读性。@greenapps这是一个很好的建议,谢谢。谢谢您的评论。我的理解是,
Uri
是指向图像位置的路径,
Bitmap Bitmap=BitmapFactory.decodeFile(filePath)“合成”图像?这是正确的吗?@Joshbooth:“我的理解是Uri是指向映像位置的路径”——仅限于HTTP URL是“指向映像位置的路径”。位图Bitmap=BitmapFactory.decodeFile(filePath);“合成”图像?”--正如方法名称所示,它对图像进行解码。它读入PNG或JPEG文件,并根据该数据创建一个
位图
对象。对于
Uri
,使用
decodeStream()
,使用
inputsream()
ContentResolver
上从
openinputsream()
获得的
inputsream()
。谢谢,这对我来说是“啊哈!”的时刻。意识到返回的Uri不能保证它是一个文件是有意义的,这也是为什么它不平凡的原因?
 java.lang.IllegalArgumentException: filename cannot be null
     at android.media.ExifInterface.<init>(ExifInterface.java:121)
     at build.com.build.SubmitPicActivity.getPath(SubmitPicActivity.java:123)
     at build.com.build.SubmitPicActivity.onActivityResult(SubmitPicActivity.java:93)
     at android.app.Activity.dispatchActivityResult(Activity.java:5423)
     at android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
     at android.app.ActivityThread.access$1300(ActivityThread.java:135)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:136)
     at android.app.ActivityThread.main(ActivityThread.java:5017)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
     at dalvik.system.NativeStart.main(Native Method)