2016-08-02 13 views
0

Firebaseから写真のURLを取得してビットマップに変換しようとしています。 GlideライブラリがURLを変換してイメージをImageViewに置くので、FirebaseへのアップロードとFirebaseストレージからのイメージの取得は問題ありません。しかし、OpenGLのビットマップテクスチャの場合、Glideは適切ではありません。それが取得したURLを示しlogcatでAndroidでFirebaseデータベースの画像文字列をビットマップに変換するには?

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

:写真のURLは、この(キー情報は、セキュリティを確保するように変更されているが、形式は同じである)のように出てきます。しかし、その形式で。 SharedPreferencesでURLを保存します。私はRajawali OpenGLフレームワークを使ってSharedPreferencesに保存された画像URLからビットマップを取得する3Dモデルを表示しています。この非同期クラスを使用してURLをビットマップに変換し、3Dモデルのテクスチャに適用します。

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); 
    } 
} 

私は、()メソッドonRender私のレンダラーでこれを呼び出す:

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(); 
    } 

    } 

をラジャワリフレームワークは、変換後のビットマップを適用しようとすると、それは、URL文字列が空/ nullであることを述べています。ラジャワリがFirebaseストレージへの認証されていない要求を行っていることは非常に良いチャンスがあり

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

だから、あなたの質問はFirebaseと本当に何の関係もありませんし、より多くのOpenGLビューにテクスチャをロードすると? –

+0

あなたのコードに 'putString(LABEL_KEY、...)'がある場所を示してください。 –

+0

@ cricket_007いいえ、私は今、テクスチャを読み込んでOpenGLの3Dモデルに適用することを知っています。私の質問はFirebaseに関するものです。変換されたURL /文字列をビットマップに変換するのは、上の例の.jpgの後に余分なテキストがあるため、有効なビットマップではないと思います。 –

答えて

0

これはUserPrefs.getCustomLabel()から参照する方法です。デフォルトのセキュリティー・ルールを使用すると、その非認証要求は拒否されます。

一般的な解決方法は、画像を取得するために、というダウンロードURL を使用することです。ダウンロードURLは一般にアクセス可能ですが、推測できないURLです。あなたはFirebase documentation on downloading filesから、このコードスニペットを使用してFirebaseストレージURLから、このようなURLを取得することができます:

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 
    } 
}); 
関連する問題