Android相机拍照后返回的图片URI出现问题,结果是“传递结果失败(ResultInfo)”。

6
我已经制作了一个带有两个按钮的应用程序:
  • 一个用于从图库选择图片
  • 一个用于使用相机拍摄新图片
从图库中选择的过程正常工作,但如果我使用相机拍照,则会持续出现“Failure delivering result ResultInfo”错误。而且似乎图片没有被写入文件夹。
由于两者都返回相同的结果,因此我只需一个处理程序来处理结果;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if (requestCode == 1) {  
            if (resultCode == RESULT_OK && data.getData() != null){
                try {
                    Log.i("YADDA",data.getData().toString());
                    Uri targetUri = data.getData();
                    if (targetUri != null) {
                        //Log.i("YADDA",targetUri.toString());
                        myImage nsi = new myImage();
                        nsi.ThumbNail = getThumbnail(targetUri);
                        nsi.path = targetUri;
                        nsi.FileName = FileNameBase + "_" +     String.valueOf(1 + photos.size());
                        photos.add(nsi);
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }

                DrawImageGallery();
            }
        }

按钮处理程序;
    nsbu1.setOnClickListener(new Button.OnClickListener() {
         public void onClick(View v){
             Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
             photoPickerIntent.setType("image/*");
             startActivityForResult(photoPickerIntent, 1);
        }
    });

    nsbu2.setOnClickListener(new Button.OnClickListener() {
         public void onClick(View v){
             Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                 // Uri myuri=Uri.fromFile(new     File(Environment.getExternalStorageDirectory().getAbsolutePath(), FileNameBase + ".jpg"));
                 Uri myuri=Uri.fromFile(new File("/mnt/sdcard/tmp/" + FileNameBase + ".jpg"));

                 Log.i("YADDA", myuri.toString());
                 intent.putExtra(MediaStore.EXTRA_OUTPUT, myuri );

                 startActivityForResult(cameraIntent, 1);  
            }
        });

我尝试的事情:

  • 我已经双重检查了SD卡的写入权限清单
  • 奇怪的是,处理程序必须是正确的,因为从图库中选择一张照片可以正常工作
  • 某些版本的Android存在此相机处理程序的错误,但我已经检查过了,我的Nexus S不是其中之一。
  • 我进行了几个小时的谷歌搜索和调试

Logcat输出:

 09-01 10:02:59.085: ERROR/AndroidRuntime(1898): FATAL EXCEPTION: main
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.android.spot/com.android.spot.newsite}: java.lang.NullPointerException
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.ActivityThread.access$2000(ActivityThread.java:117)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.os.Handler.dispatchMessage(Handler.java:99)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.os.Looper.loop(Looper.java:130)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.ActivityThread.main(ActivityThread.java:3683)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at java.lang.reflect.Method.invokeNative(Native Method)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at java.lang.reflect.Method.invoke(Method.java:507)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at dalvik.system.NativeStart.main(Native Method)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898): Caused by: java.lang.NullPointerException
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at com.android.spot.newsite.onActivityResult(newsite.java:351)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.Activity.dispatchActivityResult(Activity.java:3908)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
 09-01 10:02:59.085: ERROR/AndroidRuntime(1898):     ... 11 more

1
http://www.softwarepassion.com/android-series-taking-photos-with-andorid-built-in-camera/ - Peter Knego
谢谢您的建议,我已经尝试过了,但没有结果,还是出现了同样的错误。无论如何,还是谢谢! - Dennis
你能发布一下错误日志吗? - Peter Knego
我已将其添加到原始帖子中,因为它太大了,无法在此处回复... - Dennis
有可能是因为在返回后图像没有直接可用。 - Dennis
目前正在阅读这个:http://code.google.com/p/android/issues/detail?id=1480 - Dennis
2个回答

1

我刚刚在PhoneGap问题列表上帮助了一个遇到同样错误的人。我相信您缺少了权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

从您的AndroidManifest.xml文件中。我们需要能够将捕获的图像写入.jpg文件。


但是,您不需要将此内容编写到内部存储器中吗? - Vincent Paing
1
@Vincent_Paing,我的回答已经有9年了,事情已经改变了。当时PhoneGap默认写入/sdcard/Camera或/sdcard/Photos目录是正确的答案。请记住,那时候是Android 2.x版本。 - Simon MacDonald

1

编辑

最初我以为清除手机上的应用程序并重新安装它已经解决了问题。结果证明这不是事实。我发现在尝试从相机中获取图像时,Android垃圾回收会删除PhoneGap应用程序存在的问题。经过几个小时的搜索,我最终选择使用前台相机插件来解决此问题。该插件在应用程序内部创建自己的相机,因此您不必担心垃圾回收会将其拾取。

不幸的是,它没有完整的功能,大多数相机选项也不可用于用户。它仅支持Cordova 2.4.0,这意味着我必须降级到2.7.0。这个解决方案将适用于我的当前应用程序,希望下一个我编写的应用程序会有更好的解决方案。希望这对某人有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接