C# 将Url存储到Firebase-Xamarin中

C# 将Url存储到Firebase-Xamarin中,c#,android,xamarin,xamarin.android,C#,Android,Xamarin,Xamarin.android,我可以将图像存储到数据库中。在我的图像表中,我需要url本身,但当我保存图像时,我会得到这种url(我不知道它是否是url),看起来像“md59ff87d3098d3e76b10bcffd04c249f”。Image@429ed2f8“但是我想要像firebase.com/pet.jpg这样的东西,这样我就可以把它调回我的imageview。问题似乎出在我的OnSuccess()中。请问我该怎么做 protected override void OnActivityResult(int requ

我可以将图像存储到数据库中。在我的图像表中,我需要url本身,但当我保存图像时,我会得到这种url(我不知道它是否是url),看起来像“md59ff87d3098d3e76b10bcffd04c249f”。Image@429ed2f8“但是我想要像
firebase.com/pet.jpg这样的东西,这样我就可以把它调回我的imageview。问题似乎出在我的
OnSuccess()
中。请问我该怎么做

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if (requestCode == PICK_IMAGE_REQUEST && resultCode == Result.Ok && data != null && data.Data != null)
            {

                uri = data.Data;

                try
                {

                    Bitmap bitmap = MediaStore.Images.Media.GetBitmap(ContentResolver, uri);
                    imageViewDrop.SetImageBitmap(bitmap);

                }
                catch (FileNotFoundException e)
                {

                    e.StackTrace.ToString();
                }

                catch (IOException e)
                {
                    e.StackTrace.ToString();
                }

                if (uri != null)
                {
                    pd = new ProgressDialog(this);
                    pd.SetTitle("Uploading Profile Picture");
                    pd.Show();

                    StorageReference image = storageRef.Child(FB_STORAGE_PATH +System.DateTime.Today + "." + GetImageExt(uri));


                    image.PutFile(uri).AddOnSuccessListener(this).AddOnFailureListener(this);

                    image.PutFile(uri).AddOnProgressListener(this);




               }

            }
        }

        public string GetImageExt(Android.Net.Uri uri)
        {

            ContentResolver contentresolver = ContentResolver;
            MimeTypeMap mime = MimeTypeMap.Singleton;
            return mime.GetExtensionFromMimeType(contentresolver.GetType(uri));


        }

        public void OnSuccess(Java.Lang.Object result)
        {
            pd.Dismiss();

            Toast.MakeText(this, "Image Uploaded Successfully", ToastLength.Short).Show();

            ImageUpload uploads = new ImageUpload(uri.ToString());

            string uploadId = mDatabaseImage.Push().Key;
            mDatabaseImage.Child(user.Uid).Child(phId).Child(uploadId).SetValue(uploads.ToString());



        }
更新

  protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);



            if (requestCode == PICK_IMAGE_REQUEST && resultCode == Result.Ok && data != null && data.Data != null)
            {
                uri = data.Data;

                for (int i = 0; i < 5; i++){

                    pd = new ProgressDialog(this);
                    pd.SetTitle("Uploading Profile Picture");
                    pd.Show();
                    StorageReference oneRef = storageRef.Child("one " + i + "png.");
                    Bitmap bitmap = MediaStore.Images.Media.GetBitmap(ContentResolver, uri);
                    MemoryStream stream = new MemoryStream();
                    bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
                    byte[] myData = stream.ToArray();

                    uploadTask = oneRef.PutBytes(myData);
                    uploadTask.AddOnSuccessListener(this);
                    uploadTask.AddOnFailureListener(this);
                }
        }

        public string GetImageExt(Android.Net.Uri uri)
        {

            ContentResolver contentresolver = ContentResolver;
            MimeTypeMap mime = MimeTypeMap.Singleton;
            return mime.GetExtensionFromMimeType(contentresolver.GetType(uri));


        }

        public void OnSuccess(Java.Lang.Object result)
        {
             pd.Dismiss();
            string uploadId = mDatabaseImage.Push().Key;
            var snapshot = result as SnapshotBase;
            var url = snapshot.Storage.Path;
            mDatabaseImage.Child(count.ToString()).Child(user.Uid).Child(phId).Child(uploadId).SetValue(new PeaceHeroImage(url).ToMap());

            Toast.MakeText(this, "Image Uploaded Successfully", ToastLength.Short).Show();





        }

        public void OnFailure(Java.Lang.Exception e)
        {
            pd.Dismiss();

            Toast.MakeText(this, e.Message, ToastLength.Short).Show();

        }
activityresult上的受保护覆盖无效(int-requestCode,[GeneratedEnum]结果代码,意图数据)
{
base.OnActivityResult(请求代码、结果代码、数据);
if(requestCode==PICK\u IMAGE\u REQUEST&&resultCode==Result.Ok&&data!=null&&data.data!=null)
{
uri=data.data;
对于(int i=0;i<5;i++){
pd=新进度对话框(本);
pd.SetTitle(“上传个人资料图片”);
pd.Show();
StorageReference oneRef=storageRef.Child(“一”+i+“png”);
位图Bitmap=MediaStore.Images.Media.GetBitmap(ContentResolver,uri);
MemoryStream stream=新的MemoryStream();
Compress(bitmap.CompressFormat.Png,100,流);
字节[]myData=stream.ToArray();
uploadTask=oneRef.PutBytes(myData);
uploadTask.AddOnSuccessListener(此);
uploadTask.AddOnFailureListener(此);
}
}
公共字符串GetImageExt(Android.Net.Uri)
{
ContentResolver ContentResolver=ContentResolver;
MimeTypeMap mime=MimeTypeMap.Singleton;
返回mime.GetExtensionFromMimeType(contentresolver.GetType(uri));
}
成功时的公共void(Java.Lang.Object结果)
{
pd.解散();
字符串uploadId=mDatabaseImage.Push().Key;
var snapshot=作为SnapshotBase的结果;
var url=snapshot.Storage.Path;
mDatabaseImage.Child(count.ToString()).Child(user.Uid).Child(phId).Child(uploadId).SetValue(new-peaceHeromage(url.ToMap());
Toast.MakeText(此“图像已成功上载”,ToastLength.Short).Show();
}
public void OnFailure(Java.Lang.e异常)
{
pd.解散();
Toast.MakeText(这个,例如Message,ToastLength.Short).Show();
}
但是我想要像firebase.com/pet.jpg这样的东西,这样我就可以在imageview中调用它

从您的代码中,我认为您正在将图像上载到
Firebase存储
,然后您可以将此图像的路径保存到
Firebase数据库
,例如:

public class MyActivity : Activity, IOnSuccessListener, IOnFailureListener, IValueEventListener
{
    private DatabaseReference dbRef;
    private StorageReference imagesRef;
    private int count;

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

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

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

        FirebaseDatabase database = FirebaseDatabase.Instance;
        dbRef = database.GetReference("mygallery");

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

        Button btn = FindViewById<Button>(Resource.Id.createdb);
        btn.Click += Btn_Click;
    }

    private void Btn_Click(object sender, EventArgs e)
    {
        //upload to firebase storage
        for (int i = 0; i < 5; i++)
        {
            StorageReference oneRef = imagesRef.Child("one" + i + ".png");
            Bitmap bitmap = BitmapFactory.DecodeResource(this.Resources, Resource.Drawable.one);
            MemoryStream stream = new MemoryStream();
            bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
            byte[] data = stream.ToArray();

            UploadTask uploadtask = oneRef.PutBytes(data);
            uploadtask.AddOnSuccessListener(this);
            uploadtask.AddOnFailureListener(this);
        }
    }

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

    public void OnSuccess(Java.Lang.Object result)
    {
        Log.WriteLine(LogPriority.Debug, "storage", "success!");
        Toast.MakeText(this, "Success", ToastLength.Short);

        //retrieve url and name of uploaded image and insert to database
        var snapshot = result as SnapshotBase;
        var name = snapshot.Storage.Name;
        var uri = snapshot.Storage.Path;
        dbRef.Child(count.ToString()).Child("name").SetValue(name);
        dbRef.Child(count.ToString()).Child("imageurl").SetValue(uri);
        count++;
    }

    public void OnCancelled(DatabaseError error)
    {
        Log.WriteLine(LogPriority.Debug, "database", "Cancelled:" + error.ToString());
        Toast.MakeText(Application.Context, "Failed", ToastLength.Short);
    }

    public void OnDataChange(DataSnapshot snapshot)
    {
        Toast.MakeText(Application.Context, "Success", ToastLength.Short);
    }
}
公共类MyActivity:Activity、IOnSuccessListener、IOnFailureListener、IValueEventListener
{
私有数据库引用dbRef;
私有存储参考图像SREF;
私人整数计数;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
//在此处创建应用程序
SetContentView(Resource.Layout.layout2);
FirebaseAuth mAuth=FirebaseAuth.Instance;
FirebaseUser=mAuth.CurrentUser;
if(user==null)
{
var result=mAuth.signinanoymously();
}
FirebaseDatabase=FirebaseDatabase.Instance;
dbRef=database.GetReference(“mygallery”);
FirebaseStorage=FirebaseStorage.Instance;
//创建子引用
StorageReference storageRef=storage.Reference;
imagesRef=storageRef.Child(“图像”);
按钮btn=findviewbyd(Resource.Id.createdb);
点击+=btn\U点击;
}
私有无效Btn_单击(对象发送者,事件参数e)
{
//上载到firebase存储
对于(int i=0;i<5;i++)
{
StorageReference oneRef=imagesRef.Child(“一个“+i+”.png”);
位图位图=BitmapFactory.DecodeResource(this.Resources,Resource.Drawable.one);
MemoryStream stream=新的MemoryStream();
Compress(bitmap.CompressFormat.Png,100,流);
字节[]数据=stream.ToArray();
UploadTask UploadTask=oneRef.PutBytes(数据);
uploadtask.AddOnSuccessListener(此);
uploadtask.AddOnFailureListener(此);
}
}
public void OnFailure(Java.Lang.e异常)
{
Log.WriteLine(LogPriority.Debug,“存储”,“失败:+e.ToString());
Toast.MakeText(Application.Context,“Failed”,ToastLength.Short);
}
成功时的公共void(Java.Lang.Object结果)
{
Log.WriteLine(LogPriority.Debug,“存储”,“成功!”);
Toast.MakeText(这个“Success”,ToastLength.Short);
//检索上传图像的url和名称并插入数据库
var snapshot=作为SnapshotBase的结果;
var name=snapshot.Storage.name;
var uri=snapshot.Storage.Path;
dbRef.Child(count.ToString()).Child(“名称”).SetValue(名称);
dbRef.Child(count.ToString()).Child(“imageurl”).SetValue(uri);
计数++;
}
已取消的公共无效(DatabaseError错误)
{
Log.WriteLine(LogPriority.Debug,“数据库”,“取消:”+error.ToString());
Toast.MakeText(Application.Context,“Failed”,ToastLength.Short);
}
公共无效OnDataChange(数据快照快照)
{
Toast.MakeText(Application.Context,“Success”,ToastLength.Short);
}
}
以下是我的firebase存储和数据库的屏幕截图:


您必须将结果强制转换为UploadTask,以便获得这样的下载URL

public void OnSuccess(Java.Lang.Object result)
        {
             pd.Dismiss();
            string uploadId = mDatabaseImage.Push().Key;
            var snapshot = result as SnapshotBase;
            string url = ((UploadTask.TaskSnapshot)result).DownloadUrl.ToString();
            mDatabaseImage.Child(count.ToString()).Child(user.Uid).Child(phId).Child(uploadId).SetValue(new PeaceHeroImage(url).ToMap());

            Toast.MakeText(this, "Image Uploaded Successfully", ToastLength.Short).Show();

        }

我需要的是下载url本身,而不是路径..下载url是为了在我上传图片时向ImageView和您的代码发出请求