2013-03-14 17 views
16

Nel mio Fragment Provo a scattare foto dalla mia fotocamera ma non viene chiamato il onActivityResult del mio Fragment. Dopo aver scattato una foto, questo Fragment non viene visualizzato e sta passando al mio primo Fragment. C'è un altro modo per catturare foto in un Fragment o cosa sto sbagliando?Scatta una foto dalla fotocamera nel frammento

Ecco il mio codice corrente:

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

risposta

7

ho provato il codice il suo bel lavoro tizio. Ho cambiato

PhotosListFragment.this.startActivityForResult(intent, 100); 

a

getActivity().startActivityForResult(intent, 100); 

che dopo lo scatto, tornando di nuovo a stessa attività.

Penso che entrambi i tuoi frammenti siano sulla stessa attività.

se questa è la situazione, ti suggerisco di creare una nuova attività e inserire il nuovo frammento lì.

+0

È che onActivityResult sul frammento o attività? – Maxrunner

+3

my onActivityResult non è trigerato. ho inserito entrambi questi metodi nel mio frammento. c'è qualcos'altro che dovrei fare? – FilipLuch

+0

L'onActivityResult viene attivato nell'attività che ha chiamato il frammento –

18

Spero che questo vi aiuterà a:

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

      } 
     }   
    }  
} 
+0

Questo ha funzionato per me, esattamente quello che volevo! Tuttavia, restituisce solo l'anteprima. –

+0

@ user2630955 Ho usato il tuo codice e non è completamente funzionante. Non riesco a visualizzare l'immagine scattata dalla fotocamera. Potete per favore aiutarmi, ho bloccato da 2 giorni passati su questa materia. –

0

Per Frammento questo è soluzione più semplice:

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(); 

    } 
} 
7

Questo è uno dei temi più popolari. Possiamo trovare molte discussioni su questo problema. Ma nessuno di loro è utile per ME.

Quindi ho risolto questo problema utilizzando questa soluzione.

Iniziamo a capire perché questo sta accadendo.

Possiamo chiamare startActivityForResult direttamente dal frammento, ma in realtà dietro meccanico sono tutti gestiti dalla attività.

Una volta che si chiama startActivityForResult da un frammento, requestCode verrà modificato per fissare l'identità di Fragment al codice. Ciò consentirà a Activity di essere in grado di rintracciare chi invia questa richiesta una volta ricevuto il risultato.

Una volta che l'attività è stata spostata indietro, il risultato verrà inviato all'ActivityResult di Activity con il codice di richiesta modificato che verrà decodificato nell'identità requestCode + Fragment originale. Successivamente, Activity invierà il risultato dell'attività a quel frammento tramite onActivityResult. Ed è tutto fatto.

Il problema è:

attività potrebbe inviare il risultato al solo il frammento che è stato attaccato direttamente alla attività ma non quello nidificato. Questo è il motivo per cui onActivityResult del frammento annidato non sarebbe mai stato chiamato, non importa quale.

Soluzione:

1) Avviare Intent fotocamera del frammento dal codice qui sotto:

 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) Ora nel tuo padre esclusione di attività ** onActivityResult(): **

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

Devi chiamarlo nell'attività padre per farlo funzionare.

3) Nella tua chiamata frammento:

@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) Metodi di riferimento per ottenere URI:

-> Metodo per ottenere Uri dal Bitmap

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

-> Metodo per getti Percorso file ng dal 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(); 
      } 
     } 
    } 

Questo è tutto. Con questa soluzione, potrebbe essere applicata per ogni singolo frammento indipendentemente dal fatto che sia nidificato o meno. E sì, copre anche tutto il caso! Inoltre, i codici sono anche belli e puliti.

+0

Ehi amico, so che è un po 'tardi ma ha funzionato per me. Molte grazie! – revipod

+0

Questa risposta mi ha fatto capire che in realtà l'attività suActivityResult è stata ignorata e non ho chiamato super .. Salsa fantastica. – Aba

Problemi correlati