onActivityResult получение результата отменено при использовании Intent.ДОПОЛНИТЕЛЬНО РАЗРЕШИТЬ НЕСКОЛЬКО

у меня есть следующая кнопка в моей деятельности, которая открывает галерею для выбора одного или нескольких изображений, а ниже этого OnActivityResult функция, которая возвращает результат в виде RESULT_CANCELLED для нескольких изображений, и RESULT_OK для одного изображения. Не знаю, почему это происходит. Кто-нибудь может помочь.

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
}

Я data.getData() as null, data.getExtras() as null.

может ли кто-нибудь указать мне, как получить необходимые результаты из вышеуказанного кода. Я хочу URIs of все изображения, которые пользователь выбирает из галереи.

PS: он отлично работает для одного изображения, не уверен, почему.

1 ответов


наконец-то я нашел решение. При использовании EXTRA_ALLOW_MULTIPLE, когда пользователь выбирает более одного содержимого, а не возвращается в intent.getExtra(), данные из намерения возвращаются в ClipData, который поддерживается только для SDK версии 18 и выше. Оттуда данные можно получить, используя следующий код ->

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

я поставил нулевую проверку для intent.getData() потому что в случае одного изображения данные принимаются в intent.getData(), а в случае множественный выбор, это получено как null.

Итак, для версий sdk ниже 18 и для одиночного выбора (независимо от версии sdk) данные могут быть просто получены следующим образом :

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