Я использую в своем приложении библиотеку BSImagePicker, чтобы пользователь мог выбрать или взять изображение. В библиотеке есть следующий метод (также мой код):
@Override
public void onSingleImageSelected(Uri uri) {
selectedImagePath = uri;
imageSelected = true;
imageViewContainer.setVisibility(View.VISIBLE);
imageView.setImageURI(uri);
imageView.invalidate();
}
Моя проблема в том, что ImageView остается пустым после того, как пользователь выбирает (или берет) изображение. URI правильный, потому что я также использую его для загрузки изображения в облако, и он там отлично работает. Обратный вызов работает правильно, потому что imageViewContainer появляется в нужное время.
Я также пробовал setImageBitmap с BitmapFactory и setImageDrawable, но ImageView остается пустым. Что я делаю неправильно?
Мой соответствующий xml:
<android.support.v7.widget.CardView
android:id = "@+id/imageview_container"
android:layout_width = "100dp"
android:layout_height = "150dp"
android:layout_below = "@id/image_container"
android:layout_marginStart = "10dp"
android:layout_marginEnd = "10dp"
android:layout_marginBottom = "15dp"
app:cardCornerRadius = "5dp"
app:cardElevation = "5dp">
<ImageView
android:id = "@+id/imageview"
android:layout_width = "match_parent"
android:layout_height = "match_parent"/>
</android.support.v7.widget.CardView>
Обновлено: URI, переданный функции: file:///storage/emulated/0/DCIM/Camera/IMG_20180829_211617.jpg
Да, подредактирую вопрос.
Нет, работает.
Не могли бы вы попытаться вызвать imageView.setImageDrawable (null); перед imageView.setImageURI (uri);
попробуйте после удаления imageView.invalidate ();
У вас есть разрешение на доступ к файлу: ///storage/emulated/0/DCIM/Camera/IMG_20180829_211617.j pg?
Если я открываю входной поток uri, первое чтение возвращает 255 (int), resolver.getType (uri) возвращает null. Установка изображения на null перед фактической установкой, похоже, ничего не делает, как удаление вызова invalidate. И да, у меня есть разрешение на чтение файла.
Я использую тот же самый uri позже в упражнении для загрузки изображения в облако, и он отлично работает, поэтому я не думаю, что это проблема с файлом или URI.
Как мне прочитать поток как шестнадцатеричный?
У меня ff d8 ff e1 2f 39 45 78 69 66. И да, BitmapFactory действительно создает ненулевое растровое изображение.
Как я уже упоминал в посте, я уже пробовал это, но это не сработало.
В режиме отладки я могу просматривать растровое изображение, и на самом деле оно не равно нулю. Но все же imageView остается пустым, когда я устанавливаю для него растровое изображение.
Так что я до сих пор не знаю, в чем проблема на самом деле, но я заставил ее работать так:
@Override
public void onSingleImageSelected(Uri uri) {
selectedImagePath = uri;
imageSelected = true;
imageViewContainer.setVisibility(View.VISIBLE);
try {
Bitmap image = scaleBitmap(MediaStore.Images.Media.getBitmap(getContentResolver(), uri));
imageView.setImageBitmap(image);
}
catch (IOException e) {
showAlertFlashBar("Image not found.");
}
}
, где scaleBitmap просто масштабировал растровое изображение до желаемых размеров.
Вы пробовали отладку и видели, какой URI передается в imageView?