3

herunterladen Ich verwende Firebase-Speicher in meiner Android App, um Bilder von Benutzern hochgeladen zu speichern. Alle hochgeladenen Bilder sind quadratisch. Ich entdecken, dass diese Bilder eine Menge Benutzer der Download-Bandbreite verbraucht, und ich mag diesen Verbrauch reduzieren, indem die Größe des Bildes in einen Platz Imageview heruntergeladen reduziertWie Bilder mit bestimmter Größe aus Firebase-Speicher

I Glide bin mit diesem Bild zum Download und ich habe habe versucht, Bilder mit benutzerdefinierter Größe herunterzuladen, aber das Bild wird nicht in der Bildansicht angezeigt.

Schnittstelle

public interface MyDataModel { 
    public String buildUrl(int width, int height); 
} 

meine Klasse, die BaseGlideUrlLoader

public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> { 
    public MyUrlLoader(Context context) { 
    super(context); 
    } 

    @Override 
    protected String getUrl(MyDataModel model, int width, int height) { 
    // Construct the url for the correct size here. 
    return model.buildUrl(width, height); 
    } 
} 

Klasse, die Schnittstelle

public class CustomImageSize implements MyDataModel { 

    private String uri; 

    public CustomImageSize(String uri){ 
    this.uri = uri; 
    } 

    @Override 
    public String buildUrl(int width, int height) { 

    return uri + "?w=" + width + "&h=" + height; 
    } 
} 
implementiert MyDataModel erweitert Schließlich

CustomImageSize size = new CustomImageSize(uri); 

    Glide.with(context) 
    .using(new MyUrlLoader(context)) 
    .load(size) 
    .centerCrop() 
    .priority(Priority.HIGH) 
    .into(imageView); 

ERGEBNISSE DER LÖSUNG OBEN

Bild wird erscheinen nicht in meinem Platz Imageview

Lösung 2: Verwenden Sie Feuerbasis Bild loader

// Reference to an image file in Firebase Storage 
StorageReference storageReference = ...; 

ImageView imageView = ...; 

// Load the image using Glide 
Glide.with(this /* context */) 
     .using(new FirebaseImageLoader()) 
     .load(storageReference) 
     .into(imageView); 

ERGEBNIS DER LÖSUNG 2 ÜBER

funktioniert! Bild erscheint aber ABER Es ist wie das gesamte Bild heruntergeladen wurde, die eine Menge Bandbreite verbrauchen. Ich möchte nur ein benutzerdefiniertes Bild, z. B. 200px bis 200px, heruntergeladen werden.

Wie kann ich in meiner obigen Lösung 1 Bilder der benutzerdefinierten Größe aus dem Firebase-Speicher herunterladen oder ändern?

EDIT

Ich habe versucht, einen meiner Bilder aus dem Browser https://firebasestorage.googleapis.com/....m.png zuzugreifen und es wurde erfolgreich auf die Webseite geladen.aber wenn ich versuche zu Größe spezifische Parameter zu meinem Bild-URL-Link zu setzen https://firebasestorage.googleapis.com/....m.png?w=100&h=100 ein Fehler erschien auf der Webseite

{ 
    "error": { 
    "code": 403, 
    "message": "Permission denied. Could not perform this operation" 
    } 
} 
+0

Ich weiß nicht, dass Sie eine bestimmte Größe für ein hochgeladenes Bild in Firebase Storage anfordern können, indem Sie die Anfrage "w" und "h" GET übergeben. Können Sie die Dokumentation oder den Artikel teilen, der diese Fähigkeit erwähnt? Ich kann es in der offiziellen Dokumentation nicht finden. – Wilik

+0

@Wilik finden Sie irgendwelche Lösungen? – ono

Antwort

1

war ich endlich in der Lage zum herunterladen von Bildern aus Feuerbasis Speicher mit MyUrlLoader Klasse

Sie sehen, sehen Feuerbasis Speicher Urls wie diese

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX 

Wie Sie oben sehen können, hat die Verbindung bereits diesen spezielle Fragezeichen Charakter ?, die für den Start steht Kette Abfrage so, wenn ich CustomImageSize Klasse zu verwenden, eine andere ? hinzugefügt wurde, so dass die Verbindung mit zwei enden wurde ? die

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX?w=200&h=200 

Lösung zum scheitern verurteilt Herunterladen gemacht war, die ? in meiner CustomImageSize Klasse zu entfernen. so dass es am Ende wie diese

public class CustomImageSize implements MyDataModel { 

    private String uri; 

    public CustomImageSize(String uri){ 
    this.uri = uri; 
    } 

    @Override 
    public String buildUrl(int width, int height) { 

    return uri + "w=" + width + "&h=" + height; 
    } 
} 

Obwohl es heruntergeladen hat, ist nicht sicher, ob gesamtes Bild heruntergeladen wurde oder nur die individuelle Größe ein. Dies liegt daran, dass ich versucht habe, auf das Bild in meinem Browser zuzugreifen, nachdem ich den Fehler behoben hatte, der die Anzeige zum Fehlschlagen brachte, aber immer noch ein ganzes Bild empfing. kein skaliertes Bild (w = 200 & h = 200)

0

Versuchen Sie Ihr Bild Download der folgenden Befehle: -

StorageReference islandRef = storageRef.child("yourImage.jpg"); 
    // defines the specific size of your image 
    final long ONE_MEGABYTE = 1024 * 1024; 
    islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
     @Override 
     public void onSuccess(byte[] bytes) { 
      // Data for "yourImage.jpg" is returns, use this as needed 
     } 
    }).addOnFailureListener(new OnFailureListener() { 
     @Override 
     public void onFailure(@NonNull Exception exception) { 
      // Handle any errors 
     } 
    }); 
+0

Das ist gut, aber nicht effizient, "OutOfMemoryError" kann ausgelöst werden, was zu App-Konflikten führen kann. Ich möchte Lo benutzerdefinierte Bilder effizient mit Glide –

+0

laden Aber anstelle dieser ONE_MEGABYTE Konstante wie 1024 * 1024, können Sie weniger Wert nach Ihren Anforderungen nehmen. –

Verwandte Themen