onActivityResult получение RESULT_CANCELLED при использовании Intent .EXTRA_ALLOW_MULTIPLE

#android #android-intent

#Android #android-намерение

Вопрос:

В моей деятельности есть следующая кнопка, которая открывает галерею для выбора одного или нескольких изображений, а под ней 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 , чтобы все изображения, которые пользователь выбирает из галереи.

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

Ответ №1:

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

  if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) 
                                            amp;amp; (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);
  

Комментарии:

1. У меня есть данные: Intent == null, как вы получили его как not null для получения данных клипа?