2015-06-18 9 views
10

ho il seguente codice che l'utente richiesta di scegliere un'immagine da applicazioni di foto o catturare un'immagine da app della fotocamera:Android 5.1.1 fotocamera di default tornare intento vuoto onActivityResult dopo l'acquisizione dell'immagine

// Camera 
    final List<Intent> cameraIntents = new ArrayList<Intent>(); 
    final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    final PackageManager packageManager = fragment.getActivity().getPackageManager(); 
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
    for(ResolveInfo res : listCam) { 
     final String packageName = res.activityInfo.packageName; 
     final Intent intent = new Intent(captureIntent); 
     intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
     intent.setPackage(packageName); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
     cameraIntents.add(intent); 
    } 

    // Filesystem. 
    final Intent galleryIntent = new Intent(); 
    galleryIntent.setType("image/*"); 
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

    // Chooser of filesystem options. 
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 

    // Add the camera options. 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{})); 

    fragment.startActivityForResult(chooserIntent, UPLOAD_IMAGE_ACTIVITY_REQUEST_CODE); 

E il mio codice di onActivityResult:

Questi codici funzionano bene nelle precedenti versioni di Android. Tuttavia, quando I ha aggiornato il mio Nexus 5 su Android 5.1.1 (insieme aggiornando l'app della fotocamera all'ultima versione), i codici non funzionano bene quando si richiede alla fotocamera predefinita di acquisire foto.

Secondo debugger, quando il codice raggiunge final String action = data.getAction(); dopo la cattura di un'immagine app videocamera predefinita, il risultato intenti data è sempre un intento vuoto (non nullo però) che non contiene azione, comparse, dati, etc. Quindi final String action = data.getAction(); restituisce sempre null e non riesce i miei codici seguenti.

Immagino che qualcosa sia cambiato per l'app fotocamera predefinita in 5.1.1, quindi il comportamento dell'intento della telecamera è diverso. Ma poi non ho idea di come farlo funzionare.

Qualsiasi suggerimento sarebbe gradito. Grazie!

+0

Hai risolto il tuo problema ho anche lo stesso problema – Tony

+0

@Tony scusa non l'ho fatto, la mia soluzione alla fine è salvare la foto solo nella memoria esterna, creare una variabile globale statica dell'URI dopo che è stata memorizzata, e controlla se questa variabile statica non è Null quando viene chiamato onActivityResult ... (E ogni volta che chiama la videocamera, imposta prima questa variabile Globale su null) – passer

risposta

1

La tua ipotesi è corretta, c'è un cambiamento in Lollipop:

public static final String ACTION_IMAGE_CAPTURE Aggiunto in livello di API 3

standard intenti azione che possono essere inviati per avere l'applicazione della fotocamera catturare un'immagine e restituirla.

Il chiamante può passare un extra EXTRA_OUTPUT per controllare dove verrà scritta questa immagine. Se EXTRA_OUTPUT non è presente, viene restituita un'immagine di dimensioni ridotte come oggetto Bitmap nel campo extra. Questo è utile per le applicazioni che richiedono solo una piccola immagine. Se è presente EXTRA_OUTPUT, l'immagine a dimensione intera verrà scritta nel valore Uri di EXTRA_OUTPUT. A partire da LOLLIPOP, questo uri può anche essere fornito tramite setClipData (ClipData). Se si utilizza questo approccio, è comunque necessario fornire l'uri attraverso il campo EXTRA_OUTPUT per la compatibilità con le vecchie applicazioni. Se non si imposta un ClipData, verrà copiato lì quando si chiama startActivity (Intento).

È necessario impostare la ClipData nell'intento, è così che lo faccio

intent.setClipData(ClipData.newRawUri(null, Uri.fromFile(file))); 

nel tuo caso penso che sia

intent.setClipData(ClipData.newRawUri(null, outputFileUri)); 

Anche io non imposto MediaStore. EXTRA_OUTPUT, perché per me restituisce dati nulli, non so come non ottieni dati nulli, impostando MediaStore.EXTRA_OUTPUT, ma questa è un'altra cosa: Camera activity returning null android

+0

Ancora lo stesso dopo aver aggiunto intent.setClipData() ai codici, restituendo un vuoto intento (ma non nullo). – passer

+0

ho provato la tua soluzione ma non funziona anche – Tony

3

Ho aggiunto un'altra condizione. Sembra funzionare bene senza problemi in 5.1.1 così come in diversi livelli di API

if(data == null){ 
isCamera = true; 
}else if(data.getData() == null){ 
isCamera = true; 
} 
else{ 
    //.... 
+0

Grazie per il tuo suggerimento. IMHO, ha bisogno di una modifica invece di data.getData() == null, la condizione dovrebbe essere data.getAction() == null. Funziona. Testato su 5.1.1. –

+0

In realtà, WAKALEY, ho il controllo esatto opposto nel mio codice: if (data.getAction() == null) isCamera = false; –

0

ho avuto lo stesso problema e ho aggiunto

mFileTemp.getParentFile().mkdirs();

prima uri passando per l'intento e la sua risolto per me.

Problemi correlati