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á.
- Picasso carga de imagen de devolución de llamada
- Fotos de la escala de Android picasso para ser más grande o ajustar el imageView (sin espacio en blanco)
- Cómo obtener ImageView negro utilizando Picasso y Glide
- Picasso - obtener el camino de la imagen cargada
- Cómo cargar imágenes de una tarjeta SD con la biblioteca de Picasso
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; }
- ¿No soporta Picasso para descargar imágenes que utilizan el protocolo https
- La transformación de la imagen no se aplica después del cambio de orientación con Picasso
- Cómo obtener un contexto en un adaptador de vista de reciclador
- ¿Cómo integrar Google Drive con Picasso en Android?
- Obteniendo el ancho y altura de la imagen con la biblioteca picasso
- Invalidar caché en Picasso
- Cómo configurar un @BindingAdapter con Picasso?
- Android: crear imagen circular con picasso
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 GlidedontAnimate()
.
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);
- ¿Cómo desactivo proguard para crear mi aplicación de Android?
- Actualización ADT 21 no reconocida por Eclipse