Tengo una aplicación para android que contiene múltiples actividades.

En uno de ellos estoy usando un botón que se llame a la cámara del dispositivo :

public void onClick(View view) {
    Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(photoIntent, IMAGE_CAPTURE);
}

En la misma actividad que yo llamo el OnActivityResult método para el resultado de la foto :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == IMAGE_CAPTURE) {
        if (resultCode == RESULT_OK) {
            Bitmap image = (Bitmap) data.getExtras().get("data");
            ImageView imageview = (ImageView) findViewById(R.id.pic);
            imageview.setImageBitmap(image);
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
        }
    }
}

El problema es que la intención data es nulo y la OnActivityResult método que va directamente a la (resultCode == RESULT_CANCELED) y la aplicación vuelve a la anterior avtivity.

¿Cómo puedo solucionar este problema y después de llamar a la cámara, la aplicación volverá a la actividad actual que contiene un ImageView que contiene la imagen tomada?

Gracias

9 Comentarios

  1. 205

    El de Android por defecto de la cámara de la aplicación devuelve un no-nula intención sólo al pasar de nuevo una imagen en miniatura en la devuelve Intención. Si pasa EXTRA_OUTPUT con un URI de escribir, se devolverá un null intención y la imagen está en el URI que pasa en.

    Usted puede verificar esto buscando en la aplicación de la cámara del código fuente en GitHub:

    Me imagino que está pasando en EXTRA_OUTPUT de alguna manera, o la aplicación de la cámara en su teléfono funciona de manera diferente.

    • ¿cómo puedo solucionar el poner una funcionalidad Extra, que dar no nulos de la intención en la cámara onActivityResult
    • Muy útil la respuesta me gustaría poder aceptar a los otros a encontrar la solución más eficiente.
    • Impresionante ! Muchas gracias por la explicación 🙂 +100
    • El enlace que has publicado, ya no es válido.
    • He arreglado el enlace punto a Gingerbread. No está seguro de dónde se encuentra en la última versión.
    • Pregunta: Es RESULT_CANCELED espera cuando se especifica el EXTRA_OUTPUT parámetro?
    • no es que no. Me enteré de que usted necesita para el suministro de un uri.fromFile() para conseguir que funcione. Uri.analizar no me funciona
    • hola, este no es trabajo para mí, me da un error: no se puede descodificar la secuencia: java.lang.NullPointerException: Intento de invocar el método virtual ‘char[] java.lang.De la cadena.toCharArray()’ en una referencia de objeto null
    • Podríamos inhiert la cámara de la clase y sólo cambia que un método para permitir tanto, o es más difícil entonces que?
    • La confusión posiblemente proviene de android de la página
    • Cómo se hace ya? Si el objeto es null, entonces, ¿cómo se supone que debemos conseguir los extras que son parte del objeto de datos, ya que es de null

  2. 13

    He encontrado una respuesta fácil. funciona!!

    o

    private void openCameraForResult(int requestCode){
        Intent photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri uri  = Uri.parse("file:///sdcard/photo.jpg");
        photo.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(photo,requestCode);
    }
    
    if (requestCode == CAMERA_REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                File file = new File(Environment.getExternalStorageDirectory().getPath(), "photo.jpg");
                Uri uri = Uri.fromFile(file);
                Bitmap bitmap;
                try {
                    bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                    bitmap = crupAndScale(bitmap, 300); //if you mind scaling
                    pofileImageView.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    //TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    //TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            }
        }

    si quieres recortar y escalar esta imagen

    public static  Bitmap crupAndScale (Bitmap source,int scale){
        int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth();
        int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth();
        int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2;
        int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2;
        source = Bitmap.createBitmap(source, x, y, factor, factor);
        source = Bitmap.createScaledBitmap(source, scale, scale, false);
        return source;
    }
    • Se da una FileUriExposedException en las modernas versiones de SDK.
  3. 4

    Simple de trabajo de la aplicación de la cámara evitando la nula intención problema

    – todo cambió el código que se incluye en esta respuesta; cerca de android tutorial

    He estado gastando un montón de tiempo en este tema, así que me decidí a crear una cuenta y compartir mis resultados con usted.

    La oficial de android tutorial «Tomando Fotos Simplemente» resultó no bastante para sostener lo que se prometió.
    El código no funciona en mi dispositivo: Samsung Galaxy S4 Mini GT-I9195 ejecutando la versión de android 4.4.2 /KitKat /Nivel de API 19.

    Me di cuenta de que el problema principal era la siguiente línea en el método que se invoca cuando la captura de la foto (dispatchTakePictureIntent en el tutorial):

    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

    Resultó en la intención posteriormente apresado por onActivityResult ser null.

    Para resolver este problema, me sacó mucho de la inspiración de anteriores respuestas aquí y algunos útiles puestos en github (en su mayoría por deepwinter – gracias a él; usted puede ser que desee comprobar hacia fuera su respuesta en una estrecha relación post así).

    Siguiendo estos agradables consejos, he elegido la estrategia de eliminación de la mencionada putExtra línea y hacer lo correspondiente de recuperar la imagen tomada desde la cámara dentro de la onActivityResult() método en su lugar.
    El decisivo líneas de código para obtener de nuevo el mapa de bits asociado con la imagen son:

            Uri uri = intent.getData();
            Bitmap bitmap = null;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
            } catch (IOException e) {
                e.printStackTrace();
            }

    He creado un ejemplar de la aplicación que tiene la capacidad de tomar una foto, guardarla en la tarjeta SD y mostrarlo.
    Creo que esto podría ser útil para la gente en la misma situación que yo, cuando me encontré con este problema, ya que la ayuda actual sugerencias se refieren principalmente a la extensa github puestos que hacer la cosa en cuestión, pero no demasiado fácil de usar para los novatos como yo.
    Con respecto a el sistema de archivos de Android Studio crea por defecto al crear un nuevo proyecto, yo solo tuve que cambiar tres archivos para mi propósito:

    activity_main.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.android.simpleworkingcameraapp.MainActivity">
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="takePicAndDisplayIt"
        android:text="Take a pic and display it." />
    
    <ImageView
        android:id="@+id/image1"
        android:layout_width="match_parent"
        android:layout_height="200dp" />
    
    </LinearLayout>

    MainActivity.java :

    package com.example.android.simpleworkingcameraapp;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.media.Image;
    import android.net.Uri;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.Toast;
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class MainActivity extends AppCompatActivity {
    private ImageView image;
    static final int REQUEST_TAKE_PHOTO = 1;
    String mCurrentPhotoPath;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    image = (ImageView) findViewById(R.id.image1);
    }
    //copied from the android development pages; just added a Toast to show the storage location
    private File createImageFile() throws IOException {
    //Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
    imageFileName,  /* prefix */
    ".jpg",         /* suffix */
    storageDir      /* directory */
    );
    //Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show();
    return image;
    }
    public void takePicAndDisplayIt(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(getPackageManager()) != null) {
    File file = null;
    try {
    file = createImageFile();
    } catch (IOException ex) {
    //Error occurred while creating the File
    }
    startActivityForResult(intent, REQUEST_TAKE_PHOTO);
    }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) {
    Uri uri = intent.getData();
    Bitmap bitmap = null;
    try {
    bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
    } catch (IOException e) {
    e.printStackTrace();
    }
    image.setImageBitmap(bitmap);
    }
    }
    }

    AndroidManifest.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.simpleworkingcameraapp">
    <!--only added paragraph-->
    <uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <!-- only crucial line to add; for me it still worked without the other lines in this paragraph -->
    <uses-permission android:name="android.permission.CAMERA" />
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    </application>
    </manifest>

    Tenga en cuenta que la solución que he encontrado para el problema también condujo a una simplificación del archivo de manifiesto de android: los cambios sugeridos por el android tutorial en términos de adición de un proveedor no son necesarios, ya que no soy de hacer uso de cualquier en mi código de java. Por lo tanto, sólo unas pocas líneas estándar -sobre todo en relación con los permisos – tuvo que ser añadido para el archivo de manifiesto.

    Podría además ser valioso señalar que Android Studio autoimport puede no ser capaz de manejar java.text.SimpleDateFormat y java.util.Date. Tuve que importar tanto de forma manual.

    • esto requiere soluciones de ALMACENAMIENTO de permiso, que no es muy buen enfoque.
    • La pregunta dice claramente que la Intención parámetro denominado «datos» que se pasa para onActivityResult() es nulo, mientras que su solución, a continuación, sigue adelante y trata de usar que.
  4. 2

    Probablemente porque había algo como esto?

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                        
    Uri fileUri =  CommonUtilities.getTBCameraOutputMediaFileUri();                  
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);                        
    startActivityForResult(takePictureIntent, 2);

    Sin embargo, usted no debe poner el extra de salida en la intención, porque, a continuación, los datos van en la URI en lugar de la variable de datos. Por esa razón, usted tiene que tomar las dos líneas en el centro, de modo que usted tiene

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(takePictureIntent, 2);

    Eso es lo que causó el problema para mí, la esperanza de que la ayudó.

    • Esta respuesta es engañosa. Obtendrá una vista en miniatura en lugar de tamaño completo con foto sin poner MediaStore.EXTRA_OUTPUT. Es resaltada en la documentación y en otras respuestas.
    • Es absolutamente esta respuesta engañosa.
  5. 1

    Ive había experimentado este problema, el intent no es nulo, pero la información que se envíe a través de este intent no es recibido en onActionActivit()

    Android Cámara : datos intención devuelve null

    Esta es una mejor solución con el uso de getContentResolver() :

        private Uri imageUri;
    private ImageView myImageView;
    private Bitmap thumbnail;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    ...    
    ...
    myImageview = (ImageView) findViewById(R.id.pic); 
    values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, "MyPicture");
    values.put(MediaStore.Images.Media.DESCRIPTION, "Photo taken on " + System.currentTimeMillis());
    imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intent, PICTURE_RESULT);
    }

    la onActivityResult() obtener un mapa de bits almacenado por getContentResolver() :

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_TAKE_PHOTO && resultCode == RESULT_OK) {
    Bitmap bitmap;
    try {
    bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
    myImageView.setImageBitmap(bitmap);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    Android Cámara : datos intención devuelve null
    Android Cámara : datos intención devuelve null

    Comprobar mi ejemplo en github:

    https://github.com/Jorgesys/TakePicture

  6. 0

    El siguiente código me funciona:

    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, 2);

    Y aquí está el resultado:

    protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
    { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    if(resultCode == RESULT_OK)
    {
    Uri selectedImage = imageReturnedIntent.getData();
    ImageView photo = (ImageView) findViewById(R.id.add_contact_label_photo);
    Bitmap mBitmap = null;
    try
    {
    mBitmap = Media.getBitmap(this.getContentResolver(), selectedImage);
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }
    • Yo lo probé, pero es el mismo problema 🙁
    • ¿Cuál es tu dispositivo?
    • Samsung Galaxy S II
    • estoy recibiendo imageReturnedIntent.getData() valor null. Estoy creando intención mismo que el suyo. No puso ningún extra params.
  7. 0

    Kotlin código que me funciona:

     private fun takePhotoFromCamera() {
    val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
    startActivityForResult(intent, PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA)
    }

    Y consigue el Resultado :

     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA) {
    if (resultCode == Activity.RESULT_OK) {
    val photo: Bitmap? =  MediaStore.Images.Media.getBitmap(this.contentResolver, Uri.parse( data!!.dataString)   )
    //Do something here : set image to an ImageView or save it ..   
    imgV_pic.imageBitmap = photo 
    } else if (resultCode == Activity.RESULT_CANCELED) {
    Log.i(TAG, "Camera  , RESULT_CANCELED ")
    }
    }
    }

    y no se olvide de declarar el código de solicitud:

    companion object {
    const val PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA = 300
    }
  8. -1

    Cuando nos capturar la imagen de la Cámara en Android, a continuación, Uri o data.getdata() se convierte en nulo. Tenemos dos soluciones para resolver este problema.

    1. Recuperar la dirección Uri de la Imagen de mapa de bits
    2. Recuperar el Uri de la ruta de acceso desde el cursor.

    Esta es la forma de recuperar el Uri de la Imagen de mapa de bits. La primera captura de la imagen por medio de la Intención que será el mismo para ambos métodos:

    //Capture Image
    captureImg.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(intent, reqcode);
    }
    }
    });

    Ahora implementar OnActivityResult, que será el mismo para ambos métodos:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==reqcode && resultCode==RESULT_OK)
    {
    Bitmap photo = (Bitmap) data.getExtras().get("data");
    ImageView.setImageBitmap(photo);
    //CALL THIS METHOD TO GET THE URI FROM THE BITMAP
    Uri tempUri = getImageUri(getApplicationContext(), photo);
    //Show Uri path based on Image
    Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show();
    //Show Uri path based on Cursor Content Resolver
    Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
    Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
    }

    Ahora crear todos los métodos anteriores para crear el Uri de la Imagen y el Cursor métodos:

    Dirección Uri de la Imagen de mapa de bits:

    private Uri getImageUri(Context applicationContext, Bitmap photo) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
    }

    Uri de la Verdadera ruta de guardado de imagen:

    public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here