Загрузка растрового изображения из изображения, выбранного пользователем, в просмотр изображения не устанавливает изображение

Здесь новичок ..

Я устанавливаю изображение в представление изображений, которое будет выбрано пользователем, но когда я выбираю изображение, просмотр изображения не загружает изображение.

Приложение M просто открывает средство выбора файлов, я выбираю изображение, и оно просто не загружает выбранное изображение в просмотр изображений.

<ImageView
    android:layout_marginRight="5dp"
    android:id="@+id/logoImageView"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_gravity="center|end"
     />

в java ..

ImageView logoimage=findViewById(R.id.logoImageView);

У меня есть прослушиватель onclick в моем просмотре изображений ..

logoImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent fileChoosingIntent =new Intent(Intent.ACTION_OPEN_DOCUMENT);
                fileChoosingIntent.setType("image/*");
                startActivityForResult(fileChoosingIntent,10);
            }
        });

Метод OnActivityResults

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(resultCode==10){

            logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));
        }
    }

Студия androdi выдает это предупреждение: «Вызов метода 'getData' может привести к 'NullPointerException'» в методе data.getData () ...

Я тоже пробовал скольжение

Glide.with(this).load(data.getData()).into(logoImage);

Я получаю такие же результаты, пустое изображение.

Остальная часть кода конфиденциальна (Разве у новичка нет секретного кода ..?: P)

ПРИМЕЧАНИЕ. В logcat ничего не отображается. Большое спасибо за вашу поддержку ... :-)


person Monk    schedule 08.07.2019    source источник


Ответы (2)


Вы ошиблись кодами в методе onActivityResult. requestCode - это тот, который идентифицирует ваш запрос.

Из исходного кода Activity:

requestCode Целочисленный код запроса, изначально предоставленный startActivityForResult(), позволяющий определить, от кого пришел этот результат.

resultCode Целочисленный код результата, возвращаемый дочерним действием через setResult().

Вы должны использовать resultCode, чтобы убедиться, что ваш запрос был успешным.

Когда дело доходит до NullPointerException предупреждения, вы всегда должны проверять, действительно ли используемая переменная, допускающая значение NULL, не null, прежде чем обращаться к ее полям или методам.

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

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == 10) {
            if (resultCode == RESULT_OK && data != null) {
               Glide.with(this).load(data.getData()).into(logoImage);
            } else {
              // optional null data handling
            }
        }
    }
person jsamol    schedule 08.07.2019
comment
wooooooooooooohhhooooooooooooo он работал ... но что ResultCode == RESULT_OK мы только добавили, если условие для проверки ResultCode == RESULT_OK, а затем он работал? но без этого, почему мой код не работал, хотя тело оператора IF такое же ... мы только добавили условие .. как? спасибо Edit- и как значение было нулевым? мы только что добавили условие if, и теперь значение не равно нулю .. это волшебство? - person Monk; 09.07.2019
comment
@Monk: Нет, изменение оператора resultCode == 10 на requestCode == 10 - вот что заставило код работать. Как я писал ранее, вы проверили неправильный код по сравнению с кодом, который вы использовали для запуска вашего запроса. resultCode == RESULT_OK - это просто своего рода подстраховка, позволяющая убедиться, что вы обрабатываете успешный ответ. - person jsamol; 09.07.2019
comment
эй, но я не проверяю это, тогда логически все мои операторы должны выполняться, так как у меня нет оператора If .. я ошибаюсь ?? :-( - person Monk; 09.07.2019
comment
@Monk: Значение data не было null, это могло быть null. Если это было null, код внутри оператора if не будет выполнен. Вы всегда должны проверять, не являются ли переменные, допускающие значение NULL, нулевыми, прежде чем использовать их, чтобы избежать NullPointerException, что приведет к сбою вашего приложения. - person jsamol; 09.07.2019
comment
@Monk: Если я вас правильно понял, да, если вы ничего не проверяли, код все равно работал бы в большинстве случаев. Проблема начинается, когда вы делаете несколько разных запросов или какой-либо из этих запросов не выполняется. - person jsamol; 09.07.2019
comment
@Monk: Позвольте мне объяснить, если: if (requestCode == 10) фильтрует ответы по запросам, которым они соответствуют. Без этого вы не можете быть уверены, что обрабатываете правильный ответ. if (resultCode == RESULT_OK) проверяет, успешно ли завершился запрос. Вы можете использовать это, чтобы избежать запуска ненужного фрагмента кода, потому что в большинстве случаев вы хотите обрабатывать успешные запросы, а не неудачные. if (data != null) проверяет, есть ли у вас доступ к data полям и методам. Если вы попытаетесь получить доступ к любому члену нулевого объекта, вы получите NullPointerException и аварийное приложение. - person jsamol; 09.07.2019
comment
@Monk: Дополнительную информацию см. В Руководстве разработчика Android на странице Получение результата от действия . - person jsamol; 09.07.2019

logoImage.setImageBitmap(BitmapFactory.decodeFile(data.getData().getPath()));

Вы не получаете файл, поэтому decodeFile() не будет работать.

На сегодняшний день лучшим решением является добавление Glide или Picasso в свой проект, затем передайте Uri (data.getData()) библиотеке для загрузки в ваш ImageView. Откровенно говоря: любой, кто не этого делает, нуждается в очень хорошем оправдании.

Самый прямой эквивалент вашего текущего кода - использовать getContentResolver().openInputStream() для получения InputStream на содержании, обозначенном Uri. Затем используйте BitmapFactory.decodeStream(), чтобы заполнить ImageView. Это будет работать с основным потоком приложения (раздражая разработчиков / менеджеров коллег) и замораживая ваш пользовательский интерфейс (раздражая пользователей). Вот почему вы должны просто использовать Glide или Picasso, поскольку они обрабатывают фоновую потоковую передачу за вас, а также множество других вещей (например, кеширование).

person CommonsWare    schedule 08.07.2019
comment
Студия androdi выдает это предупреждение. Вызов метода getData может вызвать исключение NullPointerException в методе data.getData () ... Я также пробовал glide Glide.with (this) .load (data.getData ()). into (logoImage ); Я получаю такие же результаты, пустое изображение. Спасибо... - person Monk; 09.07.2019
comment
Привет ... это сработало, но как просто добавить еще одно условие If решить ошибку? у нас был тот же код под оператором If, но тогда он не работал, почему ?? - person Monk; 09.07.2019