【问题标题】:Profile picture from cloud storage to database - Android从云存储到数据库的个人资料图片 - Android
【发布时间】:2018-04-16 08:40:54
【问题描述】:

我想在我的数据库中保存用户的个人资料图片以供以后使用。

我使用以下代码将其保存到我的 firebase 云存储中:

    private void uploadImage() {

    if(picture != null)
    {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();

        StorageReference ref = storageReference.child("images"+ UUID.randomUUID().toString());
        ref.putFile(picture)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        progressDialog.dismiss();

                        Toast.makeText(MainActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        progressDialog.dismiss();
                        Toast.makeText(MainActivity.this, "Failed "+e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                        double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot
                                .getTotalByteCount());
                        progressDialog.setMessage("Uploaded "+(int)progress+"%");
                    }
                });
    }
}

现在,我想将它作为一个孩子保存在我的数据库中... 我有这个代码来保存所有数据(姓名、电子邮件、电话、密码......)

mAuth.createUserWithEmailAndPassword(edtEmail.getText().toString(), edtPassword.getText().toString())
                    .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            User user = new User();
                            user.setEmail(edtEmail.getText().toString());
                            user.setPhone(edtPhone.getText().toString());
                            user.setPassword(edtPassword.getText().toString());
                            user.setName(edtName.getText().toString());
                            user.setId(mAuth.getCurrentUser().getUid());
                            user.setProfilePic(picture);

但是“user.setProfilePic(picture)”不起作用...

将用户的个人资料图片保存在我的数据库中的最佳方法是什么?

谢谢

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    这不是正确的做法。你应该做的是,

    1) 使用一些 UUID 将图像存储在自己的存储中。

    2) 将图像的引用存储在存储中。

    3)database 获取数据使用GlidePicasso 之类的库来加载图像以避免OutOfMemory 异常。

    这是一个例子

     StorageReference ref = storageReference.child("images"+ UUID.randomUUID().toString());
        ref.putFile(picture)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        progressDialog.dismiss();
                   Uri downloadUri = taskSnapshot.getMetadata().getDownloadUrl();
                   String downloadurl = mDownloadUrl.toString();
    
                    }
                })
    
               );
    

    现在

      User user = new User();
      user.setEmail(edtEmail.getText().toString());
      user.setPhone(edtPhone.getText().toString());
      user.setPassword(edtPassword.getText().toString());
      user.setName(edtName.getText().toString());
      user.setId(mAuth.getCurrentUser().getUid());
      user.setProfilePic(downloadurl);  //here picture URL
    

    最后一步只是将数据推送到DataBase

    String key = mDatabase.child("YourNodeHere").push().getKey();
    mDatabase.child("YourNodeHere").child(key).setValue(user);
    

    【讨论】:

    • 它工作了,现在我的数据库中有一个新的孩子 ex :“ profilePic : “7a5f406f-6bf2-4159-b451-33a02f666ce9”。现在我添加了它以显示它与毕加索:毕加索。 with(getBaseContext()).load(storageReference.getPath()).into(ivProfilePic); ,没有错误但我的ImageView上看不到图片,你知道为什么吗?
    • 那是因为那不是图片的完整url,我分享给大家
    • 那案子上图片的完整Url是什么?
    • @DavidOUIZEMAN 请检查​​编辑后的答案,虽然你必须根据你的代码做一些小改动,但它会清除所有的东西
    • 谢谢!我试试这个:“ downloadurl = taskSnapshot.getDownloadUrl().toString(); String key = users.child("profilePic").push().getKey(); downloadurl = MainActivity.users.child(key).toString (); ",现在我在我的数据库中获得了完整的 Url,但我无法使用 Picasso 看到它,我写了它:" Picasso.with(getBaseContext()).load(MainActivity.downloadurl).into(ivProfilePic); “你能帮帮我吗?
    【解决方案2】:

    要将个人资料图片保存在数据库中,请尝试以下操作:

             ref=db.child(mCurrentUser.getUid());
             StorageReference filepath=mStorage.child(uri.getLastPathSegment()); 
              filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
                 @Override
               public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
               String downloadurl = taskSnapshot.getDownloadUrl().toString(); 
               ref.child("image").setValue(downloadurl);
               //can save other data also
    
                }
          });
    

    首先将图片的url添加到firebase存储中,如果添加成功,您将可以检索到urlString downloadurl = taskSnapshot.getDownloadUrl().toString();并将其添加到数据库中child("image").setValue(downloadurl);

    更多信息在这里:

    https://firebase.google.com/docs/storage/android/download-files

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2016-10-24
      • 2011-06-10
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多