#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 для получения данных клипа?