Android camera: Fallo en la entrega del resultado ResultInfo {who = null, request = 0, result = -1, data = null} a la actividad

Realmente he frustado para resolver mi problema, tengo una aplicación que el uso de la cámara, cuando la cámara captura una foto, se mostrará en la actividad, cuando no estoy usando cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); La foto se mostrará en la actividad, pero el nombre y el archivo de la ruta no es como lo que quería. Estoy usando la pestaña de galaxia para compilarlo, tengo seguir tutorial para resolver mi problema de aquí , aquí y aquí, pero mi aplicación sigue siendo la fuerza de cerca y eror, este es mi código:

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

Método 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); } 

Este es mi logcat dice:

  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 

Realmente espero que alguien me puede ayudar a resolver mi problema, ya apilar y no puedo pensar de todos modos de nuevo, por favor alguien me ayude … gracias.

Pruebe esto funciona como un encanto conmigo

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

Prueba esto, ayer tuve el mismo problema. Utilizando el siguiente código i rectificar el problema. Sólo intentarlo.

Nota: Y también añadir configChanges para la actividad en particular. Mientras llama, la actividad de intención de la cámara se actualizará. Usted necesita evitar eso. 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; } 

Un código más limpio, puede ayudar a alguien buscando respuesta, básicamente al guardar archivo en el paquete de almacenamiento externo no más tiene mapa de bits en el resultado, en lugar de lo que tiene que cargar desde el archivo

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

Creo que la siguiente línea causa el problema.

 Bitmap photo = (Bitmap) data.getExtras().get("data"); 

Usted pasa el archivo uri ya como siguiente

 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri); 

Cuando pasa EXTRA_OUTPUT con un URI, la intención que recibe en onActivityResult () será null. Si desea obtener la imagen en este método, busque la imagen con la ruta que pasa con EXTRA_OUTPUT.

  • Obtener todos los sms de un teléfono Android
  • Obtener el historial del navegador y el resultado de la búsqueda en android
  • Content: // mms-sms / conversations / return NullPointerException en Android ICS Samsung
  • Proveedor de contenido grant uri permission
  • Cómo obtener un objeto Uri desde Bitmap
  • Uso de una URL web para SUGGEST_COLUMN_ICON_1 para sugerencias de búsqueda
  • Obtener el camino real para Uri Android
  • Cambiar URI de MediaPlayer
  • Convierta java.net.URI a android.net.Uri
  • Cómo recuperar ImageUri de un ImageView?
  • Crear archivo de tipo android de Uri
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.