2016-08-02 5 views
0

Ich versuche, Foto-URL von Firebase abrufen und in Bitmap konvertieren. Das Hochladen auf Firebase und das Abrufen von Images aus dem Firebase-Speicher, um sie in der Listenansicht anzuzeigen, ist kein Problem, da die Glide-Bibliothek die URL konvertiert und das Image in ein ImageView platziert. Für eine Bitmap-Textur in OpenGL ist Glide jedoch nicht geeignet. Das Foto url kommt wie folgt aus (Schlüsselinformationen geändert worden Sicherheit zu bewahren, aber das Format ist das gleiche):Wie konvertiert man die Bildzeichenfolge von Firebase Database in Bitmap in Android?

https://firebasestorage.googleapis.com/v0/b/api-project-123456789000.appspot.com/o/jzL123yO1ZxTZ1Se4ldYk2YD92v1%2Ffull%2F1234572738682%2Fcropped.jpg?alt=media&token=1e6cad76-1234f-4f9d-8923-7af07015da7d

Im logcat es zeigt die abgerufenen URL. In diesem Format allerdings. Ich speichere die URL mit SharedPreferences. Ich verwende das Rajawali OpenGL-Framework, um ein 3D-Modell zu zeigen, das seine Bitmap von der Bild-URL erhält, die in SharedPreferences gespeichert wurde. Ich benutze diese Async-Klasse, um die URL in Bitmap zu konvertieren und sie auf die Textur des 3D-Modells anzuwenden.

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.util.Log; 

import org.rajawali3d.materials.textures.Texture; 
import org.rajawali3d.materials.textures.TextureManager; 

public class AsyncLoadImageTask extends AsyncTask<String, String, Bitmap> { 
    private final static String TAG = "AsyncTaskLoadImage"; 
    private Texture texture; 
    public AsyncLoadImageTask(Texture texture) { 
     this.texture = texture; 
    } 
    @Override 
    protected Bitmap doInBackground(String... params) { 
     Bitmap bitmap = null; 
     try { 
      URL url = new URL(params[0]); 
      bitmap = BitmapFactory.decodeStream((InputStream)url.getContent()); 
     } catch (IOException e) { 
      Log.e(TAG, e.getMessage()); 
     } 
     return bitmap; 
    } 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     texture.setBitmap(bitmap); 
     TextureManager.getInstance().replaceTexture(texture); 
    } 
} 

Ich nenne das dann in meinem Renderer OnRender() -Methode:

try { 
     //This is reference to the String containing the url 
     String url = UserPrefs.getCustomLabel(mContext); 
     new AsyncLoadImageTask(labelTex).execute(url); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    } 

Wenn der Rajawali Rahmen die konvertierte Bitmap anzuwenden versucht, heißt es, dass die URL-Zeichenfolge ist null/leer.

Dies ist die referenzierte Methode von UserPrefs.getCustomLabel():

public static String getCustomLabel(Context context){ 
    SharedPreferences settings; 
    String text; 
    settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); //1 
    text = settings.getString(LABEL_KEY, null); //2 
    Log.d(UP_TAG, "Retrieved Url: " + text); 
    return text; 
} 
+0

also Ihre Frage hat nichts wirklich mit Firebase und mehr mit dem Laden einer Textur in eine OpenGL-Ansicht zu tun? –

+0

Bitte zeigen Sie, wo Sie 'putString (LABEL_KEY, ...)' in Ihrem Code haben. –

+0

@ cricket_007 nein, ich weiß jetzt, um eine Textur zu laden und sie auf ein 3D-Modell in OpenGL anzuwenden. Meine Frage bezieht sich auf Firebase, weil ich glaube, dass die konvertierte URL/Zeichenkette in Bitmap keine gültige Bitmap ist, aufgrund des zusätzlichen Textes nach dem .jpg in meinem obigen Beispiel. –

Antwort

0

Es gibt eine sehr gute Chance, dass Rajawali eine nicht authentifizierte Anforderung an Firebase Lagerung macht. Wenn Sie die Standardsicherheitsregeln verwenden, wird diese nicht authentifizierte Anforderung abgelehnt.

Die übliche Lösung ist eine so genannte Download-URL, um das Bild abzurufen. Eine Download-URL ist eine öffentlich zugängliche, aber nicht zu verweisende URL. Sie können aus dem Firebase documentation on downloading files mithilfe dieser Code-Schnipsel solche URL von einem Firebase Speicher URL erhalten:

storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { 
    @Override 
    public void onSuccess(Uri uri) { 
     // Got the download URL for 'users/me/profile.png' 
    } 
}).addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception exception) { 
     // Handle any errors 
    } 
}); 
Verwandte Themen