【问题标题】:Capturing from Camera resulting in Failure delivering result ResultInfo从相机捕获导致传递结果 ResultInfo 失败
【发布时间】:2014-01-09 02:08:30
【问题描述】:

我收到以下错误:

Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity

用我的相机拍完照片后。

这是 onActivityResult 的代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode == RESULT_OK)
    {
        if(requestCode == 1888)
        {
            final boolean isCamera;
            if(data == null)
            {
                isCamera = true;
            }
            else
            {
                final String action = data.getAction();
                if(action == null)
                {
                    isCamera = false;
                }
                else
                {
                    isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }

            Uri selectedImageUri;
            if(isCamera)
            {
                selectedImageUri = outputFileUri;
            }
            else
            {
                selectedImageUri = data == null ? null : data.getData();
            }

            Log.i("DEBUG", "IMAGEURI: " + selectedImageUri);
            coverPhoto.setImageURI(selectedImageUri);
            setRealPath(selectedImageUri); <--- if i remove this it works.
        }
    }
}

这是我用来获取真实路径的代码。

public String getRealPathFromURI(Context context, Uri contentUri) {
  Cursor cursor = null;
  try { 
    String[] proj = {MediaStore.Images.Media.DATA };
    cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);

    // ERROR ORIGINATING THE LINE BELOW
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
  } finally {
    if (cursor != null) {
      cursor.close();
    }
  }
}

一些getter和setter

public void setRealPath(Uri uri){
    this.realPath = getRealPathFromURI(getApplicationContext(),uri);
}

public String getRealPath(){
    return this.realPath;
}

我使用 genymotion 模拟器对此进行了测试。我已经从 VirtualBox 设置了我的共享文件夹。

但是,我在“我的图片”(从 VirtualBox 中设置)中看不到任何图片。

完整的 LogCat:

01-09 09:16:42.293: E/AndroidRuntime(1921): FATAL EXCEPTION: main
01-09 09:16:42.293: E/AndroidRuntime(1921): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity {com.gelliesmedia.thumbqoo/com.gelliesmedia.thumbqoo.ProductPublishActivity}: java.lang.NullPointerException
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3319)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.ActivityThread.access$1100(ActivityThread.java:141)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.os.Looper.loop(Looper.java:137)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at java.lang.reflect.Method.invokeNative(Native Method)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at java.lang.reflect.Method.invoke(Method.java:511)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at dalvik.system.NativeStart.main(Native Method)
01-09 09:16:42.293: E/AndroidRuntime(1921): Caused by: java.lang.NullPointerException
01-09 09:16:42.293: E/AndroidRuntime(1921):     at com.gelliesmedia.thumbqoo.ProductPublishActivity.getRealPathFromURI(ProductPublishActivity.java:267)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at com.gelliesmedia.thumbqoo.ProductPublishActivity.setRealPath(ProductPublishActivity.java:357)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at com.gelliesmedia.thumbqoo.ProductPublishActivity.onActivityResult(ProductPublishActivity.java:351)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.Activity.dispatchActivityResult(Activity.java:5293)
01-09 09:16:42.293: E/AndroidRuntime(1921):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
01-09 09:16:42.293: E/AndroidRuntime(1921):     ... 11 more

谁能告诉我如何解决这个错误?谢谢。

【问题讨论】:

    标签: android url android-camera realpath


    【解决方案1】:

    我正在使用类似的代码来检测生成的图像是否来自相机。似乎在某些设备(主要是摩托罗拉和 HTC)上,data.getAction() 即使对于来自相机的结果 Intent 也会为空。这意味着selectedImageUri 变为空。当您将其传递给查询 context.getContentResolver().query(contentUri, proj, null, null, null); 时,结果 Cursor 为空,因此当您尝试与之交互时会得到 NPE。

    我正在研究另一种方法来确定图像是否来自相机,并在我找到解决方案时更新。

    1/24 更新:我无法找到更好的方法来确定图像是否来自相机。看起来有些设备只是以不同的方式报告 Uri,并且没有一个好的方法来检查它。但是,如果光标为空,使用原始 Uri 似乎是安全的:

        /** snip **/
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        if (cursor == null) {
            return contentUri;
        }
        /** carry on **/
    

    我在几部不同的手机上对此进行了测试,它似乎可以处理相机图像、画廊图像以及来自其他来源(例如 Dropbox)的图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-13
      • 2021-06-18
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多