В моем 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(); */
}
}
Я попробую скользить. Кстати, это хорошая или плохая практика - иметь две библиотеки, такие как, например, Picasso и Glide, в одном проекте? Поскольку я использовал Picasso во многих ситуациях, нужно ли мне все заменять на glide?
Пройдите через это, вы можете получить хорошее заключение medium.com/@multidots/glide-vs-picasso-930eed42b81d
Хм, так что Glide лучше во многих ситуациях. Наверное, я перейду с Пикассо на Glide
В 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);
Эээ, это многое объясняет ... Стоит ли мне использовать другую библиотеку?
Даже если он кажется устаревшим, я решил проблему с помощью Imagerequest. Я добавляю пример в пост
Используйте преобразование Пикассо
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 выдает ошибку: не удается разрешить символ
Извините, я новичок в android. Мне нужно создать класс с таким именем?
защищенный int REQUEST_GALLERY = 1;
Сладкий, спасибо !. Последняя ошибка - это apply(RequestOptions.circleCropTransform()). В нем говорится, что невозможно применить метод разрешения
в моем случае он работает, если не работает, удалите его. но я думаю проблема с импортом. он показывает только округлое изображение.
Ну, я тестировал, и он вообще не отображает никакого изображения ахах
опубликуйте свой код для открытия галереи и выберите показ изображения в режиме скольжения.
Остальной код у меня точно такой же, как у вас: `@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); }} `
проверьте точку отладки, если входите внутрь, если условие. а также, если ваше изображение большое, загрузка займет немного времени.
Я проверил. Все делает нормально, ошибок нет. Когда доходит до части загрузки изображения в Glide, мой ImageView становится незаметным
Я не знаю, связано ли это с этим, но мой findViewById говорит, что это может вызвать java.lang.NullException
это означает, что изображение не определяется.
ImageView imgFotoCapa = getActivity (). FindViewById (R.id.imgFotoCapa); эта строка определяется как ImageView как уровень класса, после этого в методе oncrateView () определяется imageview = findviewbyid.
ImageView imgFotoCapa = getActivity (). FindViewById (R.id.imgFotoCapa); эта строка удаляется из метода onActivityResult.
И я поместил эту строку в onCreateView?
да, но объект imageview это уровень класса, тогда он может получить доступ к любому месту в классе.
Как мне сделать его уровнем класса, чтобы к нему можно было получить доступ в других классах? Я уже вставил эту строку в onCreateView
Надеюсь, вы знаете, как определить переменную как уровень класса.
На самом деле я не ахах
Я понял это, но теперь мое приложение вылетает
Вариант 1) Вместо изменения размера попробуйте сохранить ту же ширину / высоту, что и полученное изображение, посмотрите, сможет ли Пикассо справиться… Вариант 2) Попробуйте использовать github.com/codepath/android_guides/wiki/…, а не Picasso