Загрузить изображения

В моем ProfileFargment.java я создаю профиль пользователя. Прямо сейчас у него есть изображение профиля (которое происходит от изображения профиля пользователя Google) и изображение баннера. Я сделал кнопку, которая в основном позволяет пользователю изменять изображение баннера, но могут быть загружены только некоторые изображения. Я не знаю, связано ли это с размером изображений или нет ... Это код, который я использую:

Кнопка

 btnEditarFotoCapa.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openGallery(); // Chama a função para abrir a galeria
        }
    });

Намерение

private void openGallery(){
    Intent gallery = new Intent(Intent.ACTION_PICK, 
    MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(gallery, PICK_IMAGES);
}

Получить изображение из галереи

// Caso a galeria tenha sido aberta, aplica a imagem na foto de capa
//
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == getActivity().RESULT_OK && requestCode == PICK_IMAGES){
        imageUri = data.getData();
        ImageView imgFotoCapa = getActivity().findViewById(R.id.imgFotoCapa);
        Picasso.with(getContext()).load(imageUri).resize(446, 203).into(imgFotoCapa);

        /* SharedPreferences myPrefs = getContext().getSharedPreferences("FotoCapa", Context.MODE_PRIVATE);
        SharedPreferences.Editor myPrefsEdit = myPrefs.edit();
        myPrefsEdit.putString("fotoCapa", imageUri.toString());
        myPrefsEdit.commit(); */
    }
}

Вариант 1) Вместо изменения размера попробуйте сохранить ту же ширину / высоту, что и полученное изображение, посмотрите, сможет ли Пикассо справиться… Вариант 2) Попробуйте использовать github.com/codepath/android_guides/wiki/…, а не Picasso

Sreehari 26.06.2018 10:59

Я попробую скользить. Кстати, это хорошая или плохая практика - иметь две библиотеки, такие как, например, Picasso и Glide, в одном проекте? Поскольку я использовал Picasso во многих ситуациях, нужно ли мне все заменять на glide?

André Silva 26.06.2018 11:03

Пройдите через это, вы можете получить хорошее заключение medium.com/@multidots/glide-vs-picasso-930eed42b81d

Sreehari 26.06.2018 11:11

Хм, так что Glide лучше во многих ситуациях. Наверное, я перейду с Пикассо на Glide

André Silva 26.06.2018 11:27
1
4
64
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В onActivityResult вашей деятельности позвоните в super.onActivityResult(). Обычно фрагмент может получить результат только в том случае, если вы сделаете свою операцию переопределением onActivityResult и вызовете его super.

Ответ принят как подходящий

Я недавно использовал библиотеку Пикассо, как и у вас, и у меня была аналогичная проблема. Причина, по которой некоторые изображения не загружаются, связана с их размером. У Picasso есть некоторые проблемы с загрузкой больших изображений из-за некоторых проблем с кешем.

Вот пример этого выпуска Проблема с большими изображениями GitHub Picasso

Пример ImageRequest

RequestQueue rq = Volley.newRequestQueue(context);
    ImageRequest request = new ImageRequest(link, new 
    Response.Listener<Bitmap>() {
                @Override
                public void onResponse(Bitmap bitmap) {
                    setBackground(context,bitmap);
                }
            }, 0, 0, null, new Response.ErrorListener() {
                public void onErrorResponse(VolleyError error) {
                    Log.e("VolleyImage",error.toString());
                }
            });
    rq.add(request);

Эээ, это многое объясняет ... Стоит ли мне использовать другую библиотеку?

André Silva 26.06.2018 10:58

Даже если он кажется устаревшим, я решил проблему с помощью Imagerequest. Я добавляю пример в пост

Vito Ferrulli 26.06.2018 11:02

Используйте преобразование Пикассо

Picasso.with(context).load(url).transform(new ImageTransformation()).placeholder(placeHolder).error(placeHolder).into(imageView);


public class ImageTransformation implements Transformation {
    @Override public Bitmap transform(Bitmap source) {
        int targetWidth = 256;
        double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
        int targetHeight = (int) (targetWidth * aspectRatio);
        Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, true);
        if (result != source) {
            // Same bitmap is returned if sizes are the same
            source.recycle();
        }
        return result;
    }

    @Override public String key() {
        return "cropPosterTransformation" + 256;
    }
}

Попробуйте этот код ..

использовал Glide для загрузки изображения, это просто и актуально.

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

    implementation 'com.github.bumptech.glide:glide:4.7.1'

после кода ниже открыта галерея

            Intent intent = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(
                Intent.createChooser(intent, "Select File"),
                REQUEST_GALLERY);

получить путь к выбранному изображению ..

    /**
 * this method used to get camera image path.
 *
 * @param
 * @return
 */

public String getPathFromURI(Uri contentUri) {
    String res = null;
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor.moveToFirst()) {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}

после этого метода onActivity Result ..

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
        Uri uri = data.getData();
        String path = getPathFromURI(uri);
            Glide.with(this)
                    .load(path)
                    .apply(RequestOptions.circleCropTransform())
                    .into(epfIvUserImage);
        } 
}

REQUEST_GALLERY выдает ошибку: не удается разрешить символ

André Silva 26.06.2018 11:37

Извините, я новичок в android. Мне нужно создать класс с таким именем?

André Silva 26.06.2018 11:40

защищенный int REQUEST_GALLERY = 1;

Android Team 26.06.2018 11:41

Сладкий, спасибо !. Последняя ошибка - это apply(RequestOptions.circleCropTransform()). В нем говорится, что невозможно применить метод разрешения

André Silva 26.06.2018 11:43

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

Android Team 26.06.2018 11:44

Ну, я тестировал, и он вообще не отображает никакого изображения ахах

André Silva 26.06.2018 11:47

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

Android Team 26.06.2018 11:49

Остальной код у меня точно такой же, как у вас: `@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {super.onActivityResult (requestCode, resultCode, data); если (requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {Uri uri = data.getData (); ImageView imgFotoCapa = getActivity (). FindViewById (R.id.imgFotoCapa); Путь к строке = getPathFromURI (uri); Glide.with (это) .load (путь) .into (imgFotoCapa); }} `

André Silva 26.06.2018 11:51

проверьте точку отладки, если входите внутрь, если условие. а также, если ваше изображение большое, загрузка займет немного времени.

Android Team 26.06.2018 11:54

Я проверил. Все делает нормально, ошибок нет. Когда доходит до части загрузки изображения в Glide, мой ImageView становится незаметным

André Silva 26.06.2018 11:55

Я не знаю, связано ли это с этим, но мой findViewById говорит, что это может вызвать java.lang.NullException

André Silva 26.06.2018 11:56

это означает, что изображение не определяется.

Android Team 26.06.2018 11:57

ImageView imgFotoCapa = getActivity (). FindViewById (R.id.imgFotoCapa); эта строка определяется как ImageView как уровень класса, после этого в методе oncrateView () определяется imageview = findviewbyid.

Android Team 26.06.2018 11:59

ImageView imgFotoCapa = getActivity (). FindViewById (R.id.imgFotoCapa); эта строка удаляется из метода onActivityResult.

Android Team 26.06.2018 11:59

И я поместил эту строку в onCreateView?

André Silva 26.06.2018 12:01

да, но объект imageview это уровень класса, тогда он может получить доступ к любому месту в классе.

Android Team 26.06.2018 12:02

Как мне сделать его уровнем класса, чтобы к нему можно было получить доступ в других классах? Я уже вставил эту строку в onCreateView

André Silva 26.06.2018 12:03

Надеюсь, вы знаете, как определить переменную как уровень класса.

Android Team 26.06.2018 12:05

На самом деле я не ахах

André Silva 26.06.2018 12:07

Я понял это, но теперь мое приложение вылетает

André Silva 26.06.2018 12:15

Другие вопросы по теме