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.
È che onActivityResult sul frammento o attività? – Maxrunner
my onActivityResult non è trigerato. ho inserito entrambi questi metodi nel mio frammento. c'è qualcos'altro che dovrei fare? – FilipLuch
L'onActivityResult viene attivato nell'attività che ha chiamato il frammento –