Picasso no puede cargar imagen dentro del método onSuccess de StorageReference

Al intentar Picasso en el onStart() runtime onStart() normalmente carga la imagen desde Firebase usando el enlace de descarga desde la consola.

Pero cuando intento cargar una imagen dentro del método de StorageReference onSuccess simplemente no funcionará.

Esta clase se extiende Fragmento:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == GALLERY_IN && resultCode == Activity.RESULT_OK) { isGranted = true; String path = FireStorage.retUID() + "/"; showIndProgress(); Uri uri = data.getData(); StorageReference childPathRef = FireStorage.storageRef.child(path + uri.getLastPathSegment()); childPathRef.putFile(uri) .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() { @Override public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { if(task.isSuccessful()) { Picasso.with(mContext).load(task.getResult().getDownloadUrl()) .into(profView); Picasso.Builder build = new Picasso.Builder(mContext); build.listener(new Picasso.Listener() { @Override public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { Toast.makeText(mContext, "exception\n" + exception.toString(), Toast.LENGTH_SHORT).show(); } }); progressDialog.dismiss(); } else { //failed } } }); } } 

Esta es mi instancia de FirebaseStorage en otra clase:

 public static FirebaseStorage storage = FirebaseStorage.getInstance(); public static StorageReference storageRef = storage.getReferenceFromUrl("gs://myurl.appspot.com/"); 

Manifiesto:

 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

Mi diseño XML:

 <RelativeLayout android:layout_width="match_parent" android:layout_height="200dp" android:background="@drawable/gcover" android:id="@+id/relativeLayout"> <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/profPhoto" android:clickable="true" android:layout_width="120dp" android:layout_height="120dp" android:padding="20dp" android:src="@drawable/default_prof" android:scaleType="centerCrop" app:civ_border_color="@color/trans" app:civ_border_width="2dp" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout> 

Mi inicialización de vistas:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_prof, container, false); profView = (CircleImageView) view.findViewById(R.id.profPhoto); btn1 = (Button) view.findViewById(R.id.btn_1); btn2 = (Button) view.findViewById(R.id.btn_2); btn3 = (Button) view.findViewById(R.id.btn_3); return view; } 

Actualización 2:

Mientras que el código que publiqué trabaja para mí, usted indica que falla para usted. Mi prueba no utiliza un fragmento, no sé qué versión de las bibliotecas que está utilizando, ahora se sabe cómo se está agregando el fragmento al diseño, etc. Hay demasiadas causas posibles del comportamiento diferente para depurar de forma efectiva En SO.

Como experimento, puede intentar usar Glide y FirebaseUI para realizar la descarga en lugar de Picasso. El código se muestra a continuación y funciona para mí. Dado que la descarga proviene de la referencia de almacenamiento y no de la URL, este enfoque requiere acceso de lectura al almacenamiento. También es necesario agregar estas líneas a las dependencias de construcción:

 // FirebaseUI 2.0.1 is the version to use for Firebase SDK version 11.0.1 // SDK/Firebase version compatibility is important. // See the FirebaseUI docs for a table of compatible versions. compile 'com.firebaseui:firebase-ui-storage:2.0.1' compile 'com.github.bumptech.glide:glide:3.8.0' 

.

 childPathRef.putFile(Uri.fromFile(file)) .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() { @Override public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { if (task.isSuccessful()) { Log.d(TAG, "Upload: SUCCESS"); Glide.with(mContext) .using(new FirebaseImageLoader()) .load(childPathRef) .dontAnimate() .listener(new RequestListener<StorageReference, GlideDrawable>() { @Override public boolean onException(Exception e, StorageReference model, Target<GlideDrawable> target, boolean isFirstResource) { Log.e(TAG, "Download: FAILED: ", e); return false; } @Override public boolean onResourceReady(GlideDrawable resource, StorageReference model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { Log.d(TAG, "Download: SUCCESS"); return false; } }) .into(mCircleImageView); } else { Log.e(TAG, "Upload: FAILED: " + task.getException().getMessage()); } } }); 

Actualizar:

La depuración adicional mostró que la carga y descarga estaban completando correctamente. El problema fue con la prestación de la imagen descargada. La documentación de CircleImageView indica que noFade() debe utilizarse al descargar desde Picasso:

Si utiliza una biblioteca de carga de imágenes como Picasso o Glide, debe desactivar sus animaciones de fade para evitar imágenes desordenadas. Para Picasso use la opción noFade() , para el uso de Glide dontAnimate() .

También se encontró que las imágenes pequeñas se mostraron, pero las imágenes grandes se mostraron en negro. fit() se añadió para que Picasso cambiara el tamaño de la imagen.


Para detectar el éxito y el fracaso de la subida, utilice un oyente de finalización en lugar de sólo un detector de éxito y pruebe task.isSuccessful() . Es probable que la subida falle debido a las reglas de seguridad o a StorageReference no StorageReference :

 StorageReference childPathRef = Class.storageRef.child(path + uri.getLastPathSegment()); childPathRef.putFile(uri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() { @Override public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) { if (task.isSuccessful()) { Log.d(TAG, "Upload: SUCCESS"); Picasso.with(mContext) .load(task.getResult().getDownloadUrl()) .noFade() .fit() .into(profView, new Callback() { @Override public void onSuccess() { Log.d(TAG, "Download: SUCCESS"); Toast.makeText(mContext, "download done" , Toast.LENGTH_SHORT).show(); } @Override public void onError() { Log.d(TAG, "Download: FAILED"); } }); Toast.makeText(mContext, "upload done" , Toast.LENGTH_SHORT).show(); } else { Log.e(TAG, "Upload: FAILED: " + task.getException().getMessage()); } progressDialog.dismiss(); } }); 

Limitaciones para de.hdodenhof.circleimageview.CircleImageView

  • El ScaleType siempre es CENTER_CROP y obtendrá una excepción si intenta cambiarlo. Esto es (actualmente) por diseño, ya que está perfectamente bien para las imágenes de perfil.
  • Habilitar adjustViewBounds no es compatible ya que requiere un ScaleType no compatible
  • Si utiliza una biblioteca de carga de imágenes como Picasso o Glide, debe desactivar sus animaciones de fade para evitar imágenes desordenadas. Para Picasso use la opción noFade (), para el uso de Glide dontAnimate (). Si desea conservar la animación de fadeIn, debe buscar la imagen en un destino y aplicar una animación personalizada al recibir el mapa de bits.
  • El uso de un TransitionDrawable con CircleImageView no funciona correctamente y conduce a imágenes desordenadas.

Acabo de cambiar de CircleImageView a un ImageView normal y de repente funcionó.

Es posible que en esta línea de código:

  Picasso.with(mContext).load(task.getResult().getDownloadUrl()) .into(profView); 

ProfView está recreando con fragmento, y Picasso.into(View view) mantiene la referencia de la semana a la vista.

De los documentos:

Public void into (android.widget.ImageView target) Cumple asincrónicamente la petición en el ImageView especificado. Nota: Este método mantiene una referencia débil a la instancia de ImageView y admite automáticamente el reciclaje de objetos.

Tratar de usar:

 public void into(@NotNull ImageView target, Callback callback) 

Tal vez sea un conflicto con el CircleImageView .

Intente cambiarlo con un ImageView o defina el CircleImageView como un ImageView .

Tratar :

 ImageView profView = (ImageView) view.findViewById(R.id.profPhoto); 
  • ¿Es posible descargar imágenes de la memoria caché en picasso?
  • Redimensionar la imagen a todo el ancho y la altura fija con Picasso
  • Android Studio Picasso gif loading image para marcador de posición
  • Picasso: cómo cancelar todas las peticiones de imagen hechas en un adaptador
  • Android + Picasso: cambiar la caducidad del caché de URL
  • OkHTTP y Picasso no funcionan juntos
  • RecyclerView con GridLayoutManager y Picasso mostrando imagen incorrecta
  • Appcompat CardView y Picasso sin esquinas redondeadas
  • Clase de ImageView personalizada que no funciona con la biblioteca de descarga de imágenes de Picasso
  • Establecer recurso de fondo con Picasso
  • Glide - carga un solo fotograma del video en un momento específico?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.