Android:如何从Firebase存储下载文件?

Android:如何从Firebase存储下载文件?,android,firebase,xamarin.android,firebase-storage,Android,Firebase,Xamarin.android,Firebase Storage,我上传图像到Firebase存储的代码(Xamarin.Android)是 Android.Net.Uri filePath = data.Data; StorageReference childRef = storageRef.Child("images/").Child(key); Bitmap bitmap = Android.Net.MediaStore.Images.Media.GetBitmap(this.ContentResolver, filePath); MemoryStrea

我上传图像到Firebase存储的代码(Xamarin.Android)是

Android.Net.Uri filePath = data.Data;
StorageReference childRef = storageRef.Child("images/").Child(key);
Bitmap bitmap = Android.Net.MediaStore.Images.Media.GetBitmap(this.ContentResolver, filePath);
MemoryStream stream = new MemoryStream();
bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
byte[] bitmapData = stream.toArray();
UploadTask uploadTask = childRef.PutBytes(bitmapData);
而且它有效!但当我想下载文件时,它不起作用。。。代码如下:

StorageReference childRef = storageRef.Child("images/").Child(childKey);
Android.Net.Uri uri = Android.Net.Uri.Parse(childRef.ToString());
imageView.setImageURI(uri);

有人知道为什么吗?我必须使用childRef.DownloadURL吗?但是如何(它返回一个Android.Gms.Tasks.Task)?谢谢大家!

基于您的代码
imageView.setImageURI(uri),我想你想

然后您可以这样编写示例代码:

public class Activity1 : Activity, IOnSuccessListener, IOnFailureListener
{
    private FirebaseStorage storage;
    private ImageView imageview;
    private Task downloadtask;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your application here
        SetContentView(Resource.Layout.layout1);

        //auth
        FirebaseAuth mAuth = FirebaseAuth.Instance;
        FirebaseUser user = mAuth.CurrentUser;
        if (user == null)
        {
            var result = mAuth.SignInAnonymously();
        }

        storage = FirebaseStorage.Instance;
        //create child reference
        StorageReference storageRef = storage.Reference;
        StorageReference imagesRef = storageRef.Child("images");

        imageview = FindViewById<ImageView>(Resource.Id.imageview);    

        Button downloadimage = FindViewById<Button>(Resource.Id.downloadimage);
        downloadimage.Click += (sender, e) =>
        {
            //download image
            StorageReference testRef = imagesRef.Child("test.jpg");

            downloadtask = testRef.GetBytes(1200 * 800);
            downloadtask.AddOnSuccessListener(this);
            downloadtask.AddOnFailureListener(this);
        };
    }

    public void OnFailure(Java.Lang.Exception e)
    {
        Log.WriteLine(LogPriority.Debug, "storage", "Failed:" + e.ToString());
    }

    public void OnSuccess(Java.Lang.Object result)
    {
        Log.WriteLine(LogPriority.Debug, "storage", "success!");
        if (downloadtask != null)
        {
            var data = downloadtask.Result.ToArray<byte>();
            Bitmap bitmap = BitmapFactory.DecodeByteArray(data, 0, data.Length);
            imageview.SetImageBitmap(bitmap);
            downloadtask = null;
        }
    }
}
公共类活动1:活动、IOnSuccessListener、IOnFailureListener
{
私有火基存储;
私人影像视图;
私有任务下载任务;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//在此处创建应用程序
SetContentView(Resource.Layout.layout1);
//认证
FirebaseAuth mAuth=FirebaseAuth.Instance;
FirebaseUser=mAuth.CurrentUser;
if(user==null)
{
var result=mAuth.signinanoymously();
}
存储=FirebaseStorage.Instance;
//创建子引用
StorageReference storageRef=storage.Reference;
StorageReference imagesRef=storageRef.Child(“图像”);
imageview=findviewbyd(Resource.Id.imageview);
Button downloadimage=FindViewById(Resource.Id.downloadimage);
下载图像。单击+=(发件人,e)=>
{
//下载图像
StorageReference testRef=imagesRef.Child(“test.jpg”);
downloadtask=testRef.GetBytes(1200*800);
downloadtask.AddOnSuccessListener(此);
downloadtask.AddOnFailureListener(此);
};
}
public void OnFailure(Java.Lang.e异常)
{
Log.WriteLine(LogPriority.Debug,“存储”,“失败:+e.ToString());
}
成功时的公共void(Java.Lang.Object结果)
{
Log.WriteLine(LogPriority.Debug,“存储”,“成功!”);
if(downloadtask!=null)
{
var data=downloadtask.Result.ToArray();
位图位图=位图工厂.DecodeByteArray(数据,0,数据.Length);
设置图像位图(位图);
downloadtask=null;
}
}
}
我必须使用childRef.DownloadURL吗


因此,没有“必须”,即解决
Android.Gms.Tasks.Task
问题的结果,您可以实现
IOnSuccessListener
接口,并在
OnSuccess
事件中处理任务结果

我必须从文件引用(StorageReference)中删除文件扩展名(.png),才能使其正常工作。你的回答很有帮助,谢谢!