studio picture intent getdata from fileprovider example data action_image_capture java android uri android-camera-intent

java - picture - cámara android: error en la entrega del resultado ResultInfo{who=null, request=0, result=-1, data=null} a la actividad



onactivityresult camera android (4)

Creo que la siguiente línea causa el problema.

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

Pasas el archivo uri ya como sigue

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);

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

Realmente me frustro para resolver mi problema, tengo una aplicación que usa 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 archivo de nombre y ruta no es como lo que quería. Estoy usando la pestaña de la galaxia para compilarla, he seguido el tutorial para resolver mi problema desde here , here y here pero mi aplicación aún se fuerza y ​​se cierra, 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 de actividadresultado:

@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 pueda ayudarme a resolver mi problema, ya apilé y no puedo pensar de todos modos, por favor alguien que me ayude ... gracias


Intenta esto, Ayer tuve el mismo problema. utilizando el código de abajo rectifico el problema. sólo inténtalo.

Nota: Y también agrega configChanges para una actividad particular. mientras se llama la actividad de la cámara se actualizará. Necesitas 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 podría ayudar a alguien a buscar una respuesta, básicamente cuando guarda un archivo en un paquete de almacenamiento externo, ya no tiene un mapa de bits, sino que tiene que cargar un 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; }


Intenta esto está trabajando a la perfección 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; }