2014-06-26 7 views
8

Mam następujący przycisk w mojej działalności, który otwiera galerię, aby wybrać jedno lub kilka zdjęć, a poniżej tego, funkcja OnActivityResult, że zwraca wynik jako RESULT_CANCELLED dla wielu obrazów, a RESULT_OK dla pojedynczego obrazu. Nie wiem, dlaczego tak się dzieje. Czy ktoś może ci pomóc.onActivityResult coraz RESULT_CANCELLED podczas korzystania 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 
} 

Dostaję data.getData() jak null, data.getExtras() jako null.

Czy ktoś może mi pomóc, jak uzyskać wymagane wyniki z powyższego kodu. Chcę URIs ze wszystkich obrazów, które użytkownik wybierze z galerii.

PS: Działa dobrze dla pojedynczego obrazu, nie wiem dlaczego.

Odpowiedz

18

W końcu mam rozwiązanie tego. Podczas korzystania z EXTRA_ALLOW_MULTIPLE, gdy istnieje więcej niż jedna treść, którą wybiera użytkownik, zamiast zwracana w intent.getExtra(), dane z intencji są zwracane w ClipData, która jest obsługiwana tylko dla zestawów SDK w wersji 18 i nowszych. Stamtąd, dane mogą być pobierane za pomocą następującego kodu ->

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

Włożyłam zerowej czek na intent.getData() ponieważ w przypadku pojedynczego obrazu, dane są odbierane w intent.getData(), natomiast w przypadku wielokrotności wybór, jest odbierany jako null.

Więc dla wersji SDK poniżej 18 lat, a dla pojedynczego wyboru (niezależnie od wersji SDK), dane mogą być łatwo pobierane w następujący sposób:

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

hepled mnie retriving URI do wielokrotnego URI, dzięki !!! –

+0

Wielkie dzięki, że zaoszczędziłeś mój czas :) – Atul

Powiązane problemy