android camera:失败的结果ResultInfo {who = null,request = 0,result = -1,data = null}给activity

我真的很沮丧解决我的问题,我有一个应用程序,使用相机,当相机捕捉照片,它会显示活动,当我不使用cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 照片将显示在活动,但名称和path文件是不是像我想要的。 我使用星系选项卡编译它,我有跟随教程来解决我的问题从这里 , 这里 ,但在 这里,但我的应用程序仍然强制closures和错误,这是我的代码:

 { 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 ); } 

活动结果方法:

 @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); } 

这是我的logcat说:

  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 

我真的希望有人可以帮我解决我的问题,我已经堆叠,不能再反思了,请别人帮我…谢谢。

Solutions Collecting From Web of "android camera:失败的结果ResultInfo {who = null,request = 0,result = -1,data = null}给activity"

试试这个和我一样的魅力

 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="orientation|keyboardHidden|screenSize"

 btnGallery.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, 1); } }); btnCapture.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment .getExternalStorageDirectory(), "test.jpg"); outputFileUri = Uri.fromFile(file); Log.d("TAG", "outputFileUri intent" + outputFileUri); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, 0); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 0: if (resultCode == RESULT_OK) { Log.d("TAG", "outputFileUri RESULT_OK" + outputFileUri); if (outputFileUri != null) { Bitmap bitmap; bitmap = decodeSampledBitmapFromUri(outputFileUri, image.getWidth(), image.getHeight()); if (bitmap == null) { Toast.makeText(getApplicationContext(), "the image data could not be decoded", Toast.LENGTH_LONG).show(); } else { Toast.makeText( getApplicationContext(), "Decoded Bitmap: " + bitmap.getWidth() + " x " + bitmap.getHeight(), Toast.LENGTH_LONG) .show(); image.setImageBitmap(bitmap); } } } break; case 1: if (resultCode == RESULT_OK) { Uri targetUri = data.getData(); Log.d("TAG", "datae" + targetUri); Bitmap bitmap; bitmap = decodeSampledBitmapFromUri(targetUri, image.getWidth(), image.getHeight()); if (bitmap == null) { Toast.makeText(getApplicationContext(), "the image data could not be decoded", Toast.LENGTH_LONG).show(); } else { Toast.makeText( getApplicationContext(), "Decoded Bitmap: " + bitmap.getWidth() + " x " + bitmap.getHeight(), Toast.LENGTH_LONG) .show(); image.setImageBitmap(bitmap); } } break; default: break; } } public Bitmap decodeSampledBitmapFromUri(Uri uri, int reqWidth, int reqHeight) { Bitmap bm = null; try { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(getContentResolver() .openInputStream(uri), null, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; bm = BitmapFactory.decodeStream(getContentResolver() .openInputStream(uri), null, options); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); } return bm; } public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { if (width > height) { inSampleSize = Math.round((float) height / (float) reqHeight); } else { inSampleSize = Math.round((float) width / (float) reqWidth); } } return inSampleSize; } 

更清洁的代码,可以帮助别人寻找答案,基本上当你保存文件到外部存储包不再有位图的结果,而不是你必须从文件加载

 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传递EXTRA_OUTPUT时,您在onActivityResult()中收到的意图将为空。 如果你想在这个方法中获取图像,请使用EXTRA_OUTPUT传递的path获取图像。