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á.
- Android borrar algunas fotos de caché Picasso
- Android: utilice picasso para cargar imágenes sin almacenarlas en caché
- Android Picasso - Marcador de posición y estilo de imagen de error
- RecyclerView desplazamiento laggy
- ImageView con mapas de bits descargados desde URL (modo de repetición de mosaico)
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; }
- Redimensionar la imagen a todo el ancho y la altura fija con Picasso
- ¿Cómo evitar la reordenación de elementos en StaggeredGridLayoutManager después del cambio de orientación?
- Rotar correctamente las imágenes web utilizando Picasso de Square
- Android - picasso muestra solo marcador de posición, no la imagen de URL
- Uso de la biblioteca Picasso con ListView
- Biblioteca de Android Picasso o Glide?
- Imagen parpadeando mientras se desplaza en RecyclerView
- ViewPager + 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