Java android摄像头:无法将结果ResultInfo{who=null,request=0,result=-1,data=null}传递给活动

Java android摄像头:无法将结果ResultInfo{who=null,request=0,result=-1,data=null}传递给活动,java,android,uri,android-camera-intent,Java,Android,Uri,Android Camera Intent,我真的很难解决我的问题,我有一个应用程序,当相机拍摄照片时,它会显示在活动中,当我不使用cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,mPhotoUri)时照片将显示在活动中,但名称和路径文件与我想要的不同。我正在使用galaxy tab进行编译,我已经按照教程解决了我的问题,但我的应用程序仍然强制关闭和eror,这是我的代码: { File sdCard= Environment.getExternalStorag

我真的很难解决我的问题,我有一个应用程序,当相机拍摄照片时,它会显示在活动中,当我不使用
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,mPhotoUri)时照片将显示在活动中,但名称和路径文件与我想要的不同。我正在使用galaxy tab进行编译,我已经按照教程解决了我的问题,但我的应用程序仍然强制关闭和eror,这是我的代码:

{

                File sdCard= Environment.getExternalStorageDirectory();
                File path = new File (sdCard.getAbsolutePath() + "/android/data/spaj_foto");
                path.mkdir();
                File file= new File (path,"spaj_foto.png");
                String filePath ="/android/data/spaj_foto/spaj_foto.png";

                  try {
                      file.createNewFile();
                    } catch (IOException e) {}       


                 mPhotoUri = Uri.fromFile(file); 
                 values.put( MediaStore.Images.ImageColumns.DATA, file.getPath());
                 mPhotoUri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                  Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
                  cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
                  startActivityForResult(cameraIntent,TAKE_PHOTO_CODE );  

            }
activityresult方法:

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
                Bitmap photo = (Bitmap) data.getExtras().get("data"); 
                image_spaj.setImageBitmap(photo);


                // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
                Uri tempUri = getImageUri(getApplicationContext(), photo);

                // CALL THIS METHOD TO GET THE ACTUAL PATH
                File finalFile = new File(getRealPathFromURI(tempUri));

//              System.out.println(mImageCaptureUri);
            }  
        }
        public String getRealPathFromURI(Uri mPhotoUri) {
            Cursor cursor = getContentResolver().query(mPhotoUri, null, null, null, null); 
            cursor.moveToFirst(); 
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
            return cursor.getString(idx); 
        }

        public Uri getImageUri(Context inContext, Bitmap inImage) {
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
            return Uri.parse(path);
        }
这是我的日志,上面写着:

    09-27 10:59:43.186: E/AndroidRuntime(31318): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {org.example.touch/org.example.touch.FormSpaj}: java.lang.NullPointerException
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3179)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3222)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.access$1100(ActivityThread.java:140)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1276)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.os.Looper.loop(Looper.java:137)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.main(ActivityThread.java:4895)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at java.lang.reflect.Method.invokeNative(Native Method)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at java.lang.reflect.Method.invoke(Method.java:511)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at dalvik.system.NativeStart.main(Native Method)
09-27 10:59:43.186: E/AndroidRuntime(31318): Caused by: java.lang.NullPointerException
09-27 10:59:43.186: E/AndroidRuntime(31318):    at org.example.touch.FormSpaj.onActivityResult(FormSpaj.java:993)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.Activity.dispatchActivityResult(Activity.java:5347)
09-27 10:59:43.186: E/AndroidRuntime(31318):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3175)
09-27 10:59:43.186: E/AndroidRuntime(31318):    ... 11 more

我真的希望有人能帮我解决我的问题,我已经堆积如山,不能再思考了,请有人帮我。。。谢谢。

确保您同时拥有摄像头权限和读/写外部存储权限

试试这对我来说很有魅力

private String selectedImagePath = "";
    final private int PICK_IMAGE = 1;
    final private int CAPTURE_IMAGE = 2;

public Uri setImageUri() {
        // Store image in dcim
        File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".png");
        Uri imgUri = Uri.fromFile(file);
        this.imgPath = file.getAbsolutePath();
        return imgUri;
    }


    public String getImagePath() {
        return imgPath;
    }

btnGallery.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);

            }
        });

        btnCapture.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri());
                startActivityForResult(intent, CAPTURE_IMAGE);
            }
        });

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_CANCELED) {
            if (requestCode == PICK_IMAGE) {
                selectedImagePath = getAbsolutePath(data.getData());
                imgUser.setImageBitmap(decodeFile(selectedImagePath));
            } else if (requestCode == CAPTURE_IMAGE) {
                selectedImagePath = getImagePath();
                imgUser.setImageBitmap(decodeFile(selectedImagePath));
            } else {
                super.onActivityResult(requestCode, resultCode, data);
            }
        }

    }


public Bitmap decodeFile(String path) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                scale *= 2;

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeFile(path, o2);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;

    }

public String getAbsolutePath(Uri uri) {
        String[] projection = { MediaColumns.DATA };
        @SuppressWarnings("deprecation")
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }

试试这个,昨天我也有同样的问题。使用下面的代码我纠正问题。试试看

注意:并为特定活动添加
configChanges
。调用相机时,将刷新意图活动。你需要避免这样<代码>android:configChanges=“方向|键盘隐藏|屏幕大小”


更干净的代码,可能会帮助寻找答案的人,基本上当你们将文件保存到外部存储包时,并没有更多的位图结果,相反,你们必须从文件中加载

String fileName;
.
. 
private void takePicture() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File

        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)        {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

       loadImageFromFile();
    }
}
public void loadImageFromFile(){

    ImageView view = (ImageView)this.findViewById(R.id.imageViewHeader);
    view.setVisibility(View.VISIBLE);


    int targetW = view.getWidth();
    int targetH = view.getHeight();

    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(fileName, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bmOptions.inPurgeable = true;

    Bitmap bitmap = BitmapFactory.decodeFile(fileName, bmOptions);
    view.setImageBitmap(bitmap);
}
private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    fileName =  image.getAbsolutePath();
    return image;
}

我认为这是问题的根源

Bitmap photo = (Bitmap) data.getExtras().get("data"); 
您已经按如下方式传递了文件uri

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);

当您用URI传递额外的_输出时,您在onActivityResult()中收到的意图将为null。如果要在此方法中获取图像,请使用通过额外输出传递的路径获取图像。

这只是一个空指针异常,FormSpaj.java:993的行是什么?Bitmap photo=(Bitmap)data.getExtras().get(“data”)<如果没有附加包,code>getExtras()可以返回null。您应该确保从
getExtras()
返回的值不是
null
。此外,您正在使用“key”
MediaStore.EXTRA\u输出设置Extras,但试图获取key
数据
——您确定它们相等吗?编辑:他们不是
MediaStore.EXTRA\u OUTPUT==“OUTPUT”
。如果您使用“key”
MediaStore.EXTRA\u OUTPUT
存储值,您当然希望使用相同的键获取它,但绝对不是“data”。感谢您的帮助。。。但是我有一个问题,为什么当我捕获另一个图像时,这不是重写以前创建的图像?因为我们在这个方法setImageUri()中通过附加当前时间毫秒来生成唯一的uri。如果要覆盖该文件,请在setImageUri()方法中指定静态硬编码文件名。我这样做:file file=new file(Environment.getExternalStorageDirectory()+“/android/data/spaj_foto/spaj_foto.png”);Uri imgUri=Uri.fromFile(文件);this.imgPath=file.getAbsolutePath();对于运行在安卓N之上的安卓版本来说,这并不是一种魅力,只适用于下面的安卓版本。非常感谢。我仍在尝试
Bitmap picture=(Bitmap)data.getExtras().get(“data”)这确实有效。我开始在安卓7.0上面临崩溃问题,删除这一行就成功了。此外,删除这一行也不会影响牛轧糖前的设备。从Android 4.4及以上版本进行测试。@Jose Jithin bro u r真棒
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);