C'è un apposito capitolo...
Creiamo, ovviamente, sempre il riferimento. Lo rifaccio a titolo di esercizio.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReference("gs://jaccaprogetto.appspot.com");Questo è il riferimento allo storage per intero.
Ora io ho un'immagine nella cartella "cazzate".
Quindi faccio un riferimento alla cartella stessa.
Primo errore già fatto, ecco la correzione:
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
Bene.Mi porto sulla cartella che voglio:
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com"); StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg");Ecco, la prima modalità che mi viene presentata è proprio l'inverso di quello che ho fatto prima, ossia ritirare un file in forma di byte array.
Due ordini di considerazioni rispetto alle procedure di upload:
- Manca qualcosa di corrispettivo a UploadTask.
- il metodo che si usa qui è storageRef.getBytes() laddove lì era storageRef.putBytes().
Bisogna predisporre una variabile nella quale leggere il file.
Nell'esempio la variabile è ONE_MEGABYTE, ed è di tipo long.
Ecco:
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com"); StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg"); long ONE_MEGABYTE = 1024*1024; pathReference.getBytes(ONE_MEGABYTE);Quello che non capisco è perché la variabile ONE_MEGABYTE sia eguagliata a 1024*1024.
Proviamo ugualmente.
Sì, non ottengo messaggi di errore, ma vorrei ottenere l'immagine, e non so come si faccia.
E' possibile convertire un long in un byte array?
Sicuramente sì, vediamo come si fa...
Ah, ma ecco: da una lettura più attenta leggo che quel ONE_MEGABYTE è soltanto un limite alla quantità di bytes scaricabile per evitare un sovraccarico di memoria nel dispositivo, non i bytes che compongono effettivamente il file.
Di conseguenza è necessario applicare i listeners perché in OnSuccessListener viene restituita la matrice di bytes che compone l'immagine.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com"); StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg"); long ONE_MEGABYTE = 1024*1024; pathReference.getBytes(ONE_MEGABYTE).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { } }).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { } });Ecco: ora io cerco di convertire, dopo averne ripassato la procedura, i bytes in bitmap.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com"); StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg"); long ONE_MEGABYTE = 1024*1024; pathReference.getBytes(ONE_MEGABYTE).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { } }).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length); imageView.setImageBitmap(bitmap); } });Ho predisposto una ImageView nella quale far apparire l'immagine dopo averla convertita da array di bytes in bitmap.
E andiamo a provare...
Esperimento perfettamente riuscito!
Nessun commento:
Posta un commento