En mi Fragment trato de tomar la foto de mi cámara, pero la onActivityResult de mi Fragment no es llamado. Después de tomar la foto esta Fragment no se muestra y se cambio a mi primer Fragment. En hay alguna otra manera para la captura de fotos en un Fragment, o lo estoy haciendo mal?

Aquí está mi código actual:

public void takePhoto() {
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photo));
        imageUri = Uri.fromFile(photo);
        PhotosListFragment.this.startActivityForResult(intent, 100);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case 100:
            if (resultCode == Activity.RESULT_OK) {
                Uri selectedImage = imageUri;
                getActivity().getContentResolver().notifyChange(selectedImage, null);
                ContentResolver cr = getActivity().getContentResolver();
                Bitmap bitmap;
                try {
                     bitmap = android.provider.MediaStore.Images.Media
                     .getBitmap(cr, selectedImage);

                    viewHolder.imageView.setImageBitmap(bitmap);
                    Toast.makeText(getActivity(), selectedImage.toString(),
                            Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    Toast.makeText(getActivity(), "Failed to load", Toast.LENGTH_SHORT)
                            .show();
                    Log.e("Camera", e.toString());
                }
            }
        }
    }

OriginalEl autor user2106897 | 2013-03-14

4 Comentarios

  1. 7

    Probé tu código de trabajo fino amigo. He cambiado

    PhotosListFragment.this.startActivityForResult(intent, 100);

    a

    getActivity().startActivityForResult(intent, 100);

    que después de tomar la foto, regreso a la misma actividad.

    Yo creo que ambos de sus fragmentos están en la misma actividad.

    si ese es el caso, te sugerimos crear una nueva actividad y poner el nuevo fragmento de allí.

    ES que onActivityResult en el fragmento o de la actividad?
    mi onActivityResult no es trigered. pongo ambos de estos métodos dentro de mi fragmento. ¿hay algo más que debo hacer?
    El onActivityResult se activa en la actividad, que se llama el fragmento

    OriginalEl autor Amitabh Sarkar

  2. 20

    Espero que esto le ayudará:

    public class CameraImage extends Fragment {
    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1888;
    Button button;
    ImageView imageView;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    final View rootView = inflater.inflate(R.layout.camera_image,
    container, false);
    button = (Button) rootView.findViewById(R.id.button);
    imageView = (ImageView) rootView.findViewById(R.id.imageview);
    button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent,
    CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
    });
    return rootView;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == Activity.RESULT_OK) {
    Bitmap bmp = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    //convert byte array to Bitmap
    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
    byteArray.length);
    imageView.setImageBitmap(bitmap);
    }
    }        
    }    
    }
    Esto funcionó para mí, exactamente lo que yo quería! Esto sólo devuelve la miniatura, aunque.
    He utilizado el código y que no es completamente de trabajo. Yo no soy capaz de ver la imagen tomada desde la cámara. Puede usted por favor me ayude, me quedé desde el pasado 2 días en esta materia.
    imageView.setImageBitmap(mapa de bits); es necesario agregar ImageView en su diseño…

    OriginalEl autor Sanjay Mangaroliya

  3. 11

    Este es uno de los más populares de la cuestión. Podemos encontrar un montón de hilo sobre este tema. Pero ninguno de ellos es útil para MÍ.

    Así que he resuelto este problema con esta solución.

    Primero vamos a entender por qué está pasando esto.

    Podemos llamar startActivityForResult directamente a partir de un Fragmento, pero en realidad mecánico detrás son todos manejados por la Actividad.

    Una vez que usted llame startActivityForResult de un Fragmento, requestCode será cambiado para adjuntar Fragmento de identidad para el código. Que le permitirá a la Actividad de ser capaz de realizar un seguimiento de la espalda que que enviar esta solicitud una vez que el resultado se recibe.

    Una vez que la Actividad fue desplazado de nuevo, el resultado será enviado a la Actividad del onActivityResult con la modificación de requestCode que va a ser decodificado a la original requestCode + Fragmento de la identidad. Después de eso, la Actividad enviará el Resultado de la Actividad para que el Fragmento a través de onActivityResult. Y todo se hace.

    El problema es:

    Actividad podría enviar el resultado a sólo el Fragmento que ha sido conectado directamente a la Actividad, pero no la anidados uno. Esa es la razón por la que onActivityResult de anidado fragmento nunca ha llamado, no importa qué.

    Solución:

    1) Inicio de la Cámara Intención en el Fragmento de código a continuación:

           Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Fragment frag = this;
    /** Pass your fragment reference **/
    frag.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); //REQUEST_IMAGE_CAPTURE = 12345

    2) Ahora en su Actividad principal, anular **onActivityResult() :**

        @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    }

    Usted tiene que llamar a este en la actividad de los padres para hacer que funcione.

    3) En el fragmento de la llamada:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
    if (requestCode == REQUEST_IMAGE_CAPTURE) {
    //Do something with imagePath  
    Bitmap photo = (Bitmap) data.getExtras().get("data");
    imageview.setImageBitmap(photo);
    //CALL THIS METHOD TO GET THE URI FROM THE BITMAP
    Uri selectedImage = getImageUri(getActivity(), photo);
    String realPath=getRealPathFromURI(selectedImage);
    selectedImage = Uri.parse(realPath);
    }    
    }
    }

    4) métodos de Referencia para la obtención de URI:

    -> Método para la obtención de Uri desde el mapa de bits

     public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
    }

    -> Método para obtener la ruta de Archivo de la Uri

      public String getRealPathFromURI(Uri contentUri) {
    Cursor cursor = null;
    try {
    String[] proj = { MediaStore.Images.Media.DATA };
    cursor = getActivity().getContentResolver().query(contentUri,  proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
    } finally {
    if (cursor != null) {
    cursor.close();
    }
    }
    }

    Que es.
    Con esta solución, puede ser aplicado para cualquier fragmento de si está anidada o no. Y sí, también cubre todos los caso! Por otra parte, los códigos son también muy agradable y limpio.

    Hey amigo, yo sé que es un poco tarde, pero a mí me funcionó. Muchas gracias!
    Esta respuesta me hizo darme cuenta de que en realidad tenía la actividad del onActivityResult reemplazado & no llamar a super.. la salsa Impresionante.

    OriginalEl autor KishuDroid

  4. 0

    De este Fragmento es la solución más sencilla:

    cameraIamgeView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent cameraIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    getActivity().startActivityFromFragment(PlaceOrderFragment.this, cameraIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }
    });
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
    //super.onActivityResult(requestCode, resultCode, data);
    try {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == Activity.RESULT_OK && data != null) {
    Bitmap bmp = (Bitmap) data.getExtras().get("data");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    /*
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    //convert byte array to Bitmap
    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
    byteArray.length);
    */
    cameraIamgeView.setImageBitmap(bmp);
    }
    }
    }catch(Exception e){
    Toast.makeText(this.getActivity(), e+"Something went wrong", Toast.LENGTH_LONG).show();
    }
    }

    OriginalEl autor Paras BK

Dejar respuesta

Please enter your comment!
Please enter your name here