为什么我会失败使用相机提供结果ResultInfo?

时间:2013-04-03 12:54:06

标签: android camera nullpointerexception cursor uri

我是Android开发的菜鸟,我无法返回相机拍摄的图像。当我垂直拍摄照片/肖像时,我的应用程序运行正常,但是当水平/横向拍摄照片时,应用程序崩溃时出现错误,显示失败传递结果ResultInfo {who = null,request = 1,result = -1,data = null }。我调整了宽度和宽度我输出图片的高度没有成功。非常感谢任何帮助。

我的代码

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {
        //check if we are returning from picture selection
        if (requestCode == PICKER) {

            //the returned picture URI
     //       Uri pickedUri = data.getData();

            //declare the bitmap
            Bitmap pic = null;
            //declare the path string
            String imgPath = "";

            //retrieve the string using media data
            String[] medData = { MediaStore.Images.Media.DATA };
            //query the data
            Cursor picCursor = managedQuery(outputFileUri, medData, null, null, null);
            if(picCursor!=null)
            {
                //get the path string
                int index = picCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                picCursor.moveToFirst();
                imgPath = picCursor.getString(index);
            }
            else
                imgPath = outputFileUri.getPath();

            //if and else handle both choosing from gallery and from file manager

            //if we have a new URI attempt to decode the image bitmap
            if(outputFileUri!=null) {

                //set the width and height we want to use as maximum display
                int targetWidth = 600;
                int targetHeight = 400;

                //sample the incoming image to save on memory resources

                //create bitmap options to calculate and use sample size
                BitmapFactory.Options bmpOptions = new BitmapFactory.Options();

                //first decode image dimensions only - not the image bitmap itself
                bmpOptions.inJustDecodeBounds = true;
                BitmapFactory.decodeFile(imgPath, bmpOptions);

                //work out what the sample size should be

                //image width and height before sampling
                int currHeight = bmpOptions.outHeight;
                int currWidth = bmpOptions.outWidth;

                //variable to store new sample size
                int sampleSize = 1;

                //calculate the sample size if the existing size is larger than target size
                if (currHeight>targetHeight || currWidth>targetWidth) 
                {
                    //use either width or height
                    if (currWidth>currHeight)
                        sampleSize = Math.round((float)currHeight/(float)targetHeight);
                    else 
                        sampleSize = Math.round((float)currWidth/(float)targetWidth);
                }
                //use the new sample size
                bmpOptions.inSampleSize = sampleSize;

                //now decode the bitmap using sample options
                bmpOptions.inJustDecodeBounds = false;

                //get the file as a bitmap
                pic = BitmapFactory.decodeFile(imgPath, bmpOptions);

                if(currentPic<=10){                     
                    //pass bitmap to ImageAdapter to add to array
                    imgAdapt.addPic(pic);
                    currentPic++;
                }

                //redraw the gallery thumbnails to reflect the new addition
                picGallery.setAdapter(imgAdapt);

                //display the newly selected image at larger size
                picView.setImageBitmap(pic);
                //scale options
                picView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            }
        }
    }
    //superclass method
    super.onActivityResult(requestCode, resultCode, data);
}

logcat的

04-03 08:26:46.113: E/AndroidRuntime(15318): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.pickenssurvey/com.example.pickenssurvey.PictureGallery}: java.lang.NullPointerException
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3179)
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2534)
04-03 08:26:46.113: E/AndroidRuntime(15318):    ... 13 more
04-03 08:26:46.113: E/AndroidRuntime(15318): Caused by: java.lang.NullPointerException
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.content.ContentResolver.acquireProvider(ContentResolver.java:913)
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.content.ContentResolver.query(ContentResolver.java:305)
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.app.Activity.managedQuery(Activity.java:1742)
04-03 08:26:46.113: E/AndroidRuntime(15318):    at com.example.pickenssurvey.PictureGallery.onActivityResult(PictureGallery.java:241)
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.app.Activity.dispatchActivityResult(Activity.java:4723)
04-03 08:26:46.113: E/AndroidRuntime(15318):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3175)

3 个答案:

答案 0 :(得分:2)

当您的屏幕方向发生变化时,您的活动将被销毁并以新方向重新创建。因此,在Activity生命周期中获得引用的任何变量将不再引用任何内容,如果您尝试访问它们引用的对象而不重新赋值,则会出现NullPointerException。

onSaveInstanceState()方法用于在配置更改之间保存临时数据。这会创建一个Bundle,当Activity再次启动时会传递给onCreate()。

没有任何代码,我不知道这是不是你的问题,但值得一看。

有关详细信息,请参阅http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges(毫无疑问,这些信息比我提供的信息更准确)。

不是我从其他帖子中复制的

答案 1 :(得分:2)

您想在应用中支持纵向和横向视图吗?如果没有,可以通过防止方向改变来解决问题。将以下代码放入onCreate:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

仍然可以更改相机意图中的方向。

答案 2 :(得分:1)

我之前遇到过这个问题,并没有看到任何符合我原因的答案。

问题是:

  1. 相机接管
  2. 在相机模式下旋转设备
  3. 拍照并确认
  4. 图片将被发送回活动,但您的活动/片段会获得 在屏幕方向更改时销毁并重新创建 包括 存储输出URI文件/字符串
  5. 的变量

    解决方案:

    1. 将输出URI存储在包含用于重新创建活动的包的onSaveInstanceState方法中
    2. 从活动onRestoreInstanceState中的Bundle中检索文件,为片段onCreateView检索文件