【问题标题】:cursor.getString returns null with a valid uricursor.getString 返回具有有效 uri 的 null
【发布时间】:2014-11-27 13:34:16
【问题描述】:

程序突然停止工作。

我有一个 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():

private Bitmap getPath(Uri uri) {

        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null,null);

        cursor.moveToFirst();

        // it is this line here, it returns null for some reason.
        String filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));

        // Convert file path into bitmap image using below line.

        Log.i("File Path", "File name: " + filePath); // this comes out as NULL in the logcat

        Bitmap bitmap = BitmapFactory.decodeFile(filePath);

        filePathForUpload = filePath;

        try {
            ExifInterface exif = new ExifInterface(filePath);
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
            bitmap = rotateBitmap(bitmap, orientation);
        }catch (Exception e){
            Log.d("Error", "error with bitmap!");
            e.printStackTrace();
        }

        return bitmap;
    }

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)

第 123 行是:String filePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));

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

有什么建议吗?

【问题讨论】:

  • private Bitmap getPath(Uri uri) 名称错误,因为它返回的不是路径而是位图。最好让它返回filePath。然后制作另一个函数Bitmap bitmap = getBitmap(String path);。使您的代码更具可读性。
  • @greenapps 好建议,谢谢。

标签: java android bitmap


【解决方案1】:

A Uri is not necessarily a File。您用来尝试为Uri 获取File 的代码从来都不是可靠的,并且不会有太多的工作。

请适当使用Uri,使用ContentResolveropenInputStream()getType() 等方法。从本质上讲,您对待Uri 的方式与对待Web 服务器的URL 相同,而且原因大致相同:ContentProvider 显示的内容不需要来自普通的@987654332 @ 你的应用可以访问。

【讨论】:

  • 感谢您的评论。我的理解是 Uri 是图像位置的路径,而 Bitmap bitmap = BitmapFactory.decodeFile(filePath); '合成'图像?对吗?
  • @JoshBoothe:“我的理解是 Uri 是图像位置的路径”——仅在 HTTP URL 是“图像位置的路径”的范围内。 “而位图位图 = BitmapFactory.decodeFile(filePath); '合成'图像?” -- 正如方法名称所暗示的那样,它对其进行解码。它读取 PNG 或 JPEG 文件并从该数据创建一个Bitmap 对象。对于Uri,使用decodeStream(),在ContentResolver 上使用从openInputStream() 获得的InputStream
  • 谢谢,这是“啊哈!”我的时刻。意识到返回的 Uri 不能保证是 File 是有道理的,这就是这不重要的原因。
  • 你们能提供一个例子而不是“啊哈”时刻吗?
  • @CommonsWare 如果内容 uri 来自选择文件,有没有办法硬编码 content-uri-string(或任何其他相关信息),以便在重新启动程序后我可以访问没有必须再次手动选择文件? (这是出于开发目的)
猜你喜欢
  • 2016-06-24
  • 1970-01-01
  • 2017-02-05
  • 2018-05-29
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 2016-05-21
  • 2017-11-29
相关资源
最近更新 更多