android相机图片uri返回一个失败交付结果ResultInfo



我做了一个有两个按钮的应用程序

  • 从图库中选择图片
  • 用相机拍摄新图像

画廊选择的过程很好,如果我用相机拍照,它会一直得到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);  
            }
        });

我尝试过的事情:

  • 我已经仔细检查了SDcard上的写权限清单
  • 奇怪的是,处理程序必须是正确的,因为从画廊的图片工作良好
  • 某些版本的android有这个相机处理程序的错误,但我检查过了,我的Nexus S不是其中之一。
  • google/调试了好几个小时

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

我刚刚帮助了一个在PhoneGap问题列表上有相同错误的人。我相信你错过了许可:

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

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

EDIT

原来我以为清除手机上的应用程序并重新安装它就可以解决这个问题。但事实并非如此。我发现有一个问题,当试图从相机中抓取图像时,PhoneGap应用程序与Android垃圾收集一起被删除。在搜索了几个小时后,我最终选择了使用前景相机插件。这个插件在应用程序内部创建自己的摄像头,这样你就不必担心垃圾收集会把它捡起来。

不幸的是,它的功能不全,大多数相机选项对用户来说都是不可用的。它也只支持Cordova 2.4.0,这意味着我不得不从2.7.0降级。这个解决方案将适用于我当前的应用程序,希望在我编写的下一个应用程序中会有更好的解决方案。希望这对大家有所帮助!

相关内容

最新更新