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