2014-06-26 4 views
8

Ich habe die folgende Schaltfläche in meiner Aktivität, die die Galerie zum Auswählen einzelner oder mehrerer Bilder öffnet, und darunter die OnActivityResult-Funktion, die Ergebnis als RESULT_CANCELLED für mehrere Bilder zurückgibt, und RESULT_OK für ein einzelnes Bild. Nicht sicher, warum es passiert. Kann mir bitte jemand helfen.onActivityResult Erhalten von RESULT_CANCELLED bei Verwendung von Intent.EXTRA_ALLOW_MULTIPLE

buttonGallery.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 
    intent.setType("image/*"); 
    startActivityForResult(Intent.createChooser(intent,"Select Picture"), choose_picture); 
    //startActivity(intent); 
    } 
}); 

//OnActivityResult for the above 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode == choose_picture) { 
      Uri imageUri = (Uri)data.getParcelableExtra(Intent.EXTRA_STREAM); 
     //Do something 
} 

Ich erhalte data.getData() als null, data.getExtras() als null.

Kann mir jemand sagen, wie man die erforderlichen Ergebnisse aus dem obigen Code bekommt. Ich möchte die URIs aller Bilder, die der Benutzer aus der Galerie auswählt.

PS: Es funktioniert gut für ein einzelnes Bild, nicht sicher warum.

Antwort

18

Endlich habe ich die Lösung dafür. Wenn bei der Verwendung von EXTRA_ALLOW_MULTIPLE mehr als ein vom Benutzer ausgewählter Inhalt anstelle von intent.getExtra() zurückgegeben wird, werden die Daten aus der Absicht in ClipData zurückgegeben, was nur für SDK-Versionen 18 und höher unterstützt wird. Von dort können die Daten mit dem folgenden Code abgerufen werden ->

if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) 
              && (null == data.getData())) 
{ 
       ClipData clipdata = data.getClipData(); 
       for (int i=0; i<clipdata.getItemCount();i++) 
       { 
        try { 
         Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), clipdata.getItemAt(i).getUri()); 
         //DO something 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
} 

ich die Null-Check für intent.getData() gesetzt haben, weil im Falle eines einzelnen Bildes, werden die Daten in intent.getData() empfangen, während im Falle von mehreren Auswahl wird dies als null empfangen.

Also, für sdk Versionen unter 18 und für einzelne Auswahl (unabhängig von sdk-Version), können die Daten einfach auf die folgende Weise abgerufen werden:

InputStream ist = this.getContentResolver() 
          .openInputStream(data.getData()); 
Bitmap bitmap = BitmapFactory.decodeStream(ist); 
+1

hepled mich für uri für mehr uri retriving dank !!! –

+0

Vielen Dank, du hast meine Zeit gerettet :) – Atul

Verwandte Themen