【问题标题】:How to convert image string from Firebase Database to bitmap in Android?如何将图像字符串从 Firebase 数据库转换为 Android 中的位图?
【发布时间】:2016-12-07 06:28:39
【问题描述】:

我正在尝试从 Firebase 检索照片网址并将其转换为位图。上传到 Firebase 并从 Firebase 存储中检索图像以显示在列表视图中没有问题,因为 Glide 库正在转换 url 并将图像放入 ImageView。但是,对于 OpenGL 中的位图纹理,Glide 是不合适的。照片 url 是这样出来的(关键信息已被更改以保护安全,但格式相同):

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

在 logcat 中显示检索到的 url。虽然是那种格式。我使用 SharedPreferences 保存 url。我正在使用 Rajawali OpenGL 框架来展示一个 3d 模型,它从保存到 SharedPreferences 的图像 url 中获取它的位图。我使用这个异步类将 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();
    }

    }

当 Rajawali 框架尝试应用转换后的位图时,它说 url 字符串为空/空。

这是来自 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;
}

【问题讨论】:

  • 那么,您的问题实际上与 Firebase 无关,更多的是与将纹理加载到 OpenGL 视图中有关?
  • 请在您的代码中显示putString(LABEL_KEY, ...)
  • @cricket_007 不,我现在知道加载纹理并将其应用于 OpenGL 中的 3d 模型。我的问题是关于 Firebase 的,因为我认为转换为位图的 url/字符串不是有效的位图,因为在我上面的示例中 .jpg 之后有额外的文本。

标签: android firebase firebase-storage rajawali


【解决方案1】:

Rajawali 很有可能向 Firebase 存储发出未经身份验证的请求。如果您使用默认安全规则,则该未经身份验证的请求将被拒绝。

常见的解决方案是使用所谓的下载 URL 来检索图像。下载 URL 是可公开访问但不可猜测的 URL。您可以使用来自 Firebase documentation on downloading files 的代码 sn-p 从 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
    }
});

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多