【问题标题】:How can I go about uploading and receiving a users profile picture?如何上传和接收用户个人资料图片?
【发布时间】:2018-08-17 17:20:10
【问题描述】:

到目前为止,在我的社交媒体应用中,用户的名字、姓氏、电子邮件、性别等数据都可以保存在 firebase 数据库中,并在需要时进行检索。到今天为止,我在第一次创建个人资料时得到了一张有效的个人资料图片,您可以点击空白的个人资料图片图标,它会加载您的图库,用用户选择的任何图片替换它。

虽然这很整洁,但我需要能够以某种方式在我的 firebase 数据库的用户节点下上传这张图片。在转换位图数据时我很迷茫,在阅读了一些文档后,我仍然感到困惑。下面是我使用本地保存的照片替换它作为个人资料图片的代码,以显示我到目前为止所拥有的内容。

@Override
public void onClick(View view)
{
    if (view == profilePicture)
    {
        //Toast.makeText(this, "We made it to the onClick for image!", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, 0);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK)
    {
        Uri targetUri = data.getData();
        Bitmap bitmap;
        try
        {
            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
            profilePicture.setImageBitmap(bitmap);
        }

        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

onClick 方法在用户点击配置文件图标后运行。现在我将向您展示我目前正在使用的数据库,这是 Firebase 实时数据库,而不是 Firebase 存储。虽然 firebase 存储可能更合适,但我似乎不知道如何判断谁的照片是谁,因为它不会使用与它们关联的用户 ID 上传它们。

Database Picture Here

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-storage user-profile


    【解决方案1】:

    对于像您这样的简单问题,比上传位图更好的解决方案是 Firebase 存储,类似于数据库,但您可以轻松上传图像等文件。

    以下是我目前在应用中使用的方法:

    private void chooseImage() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
    }
    
    private void uploadImage() {
    
        if(filePath != null)
        {
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("Uploading...");
            progressDialog.show();
    
            StorageReference ref = storageReference.child("images/"+userID);
            ref.putFile(filePath)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            progressDialog.dismiss();
                            toastMessage("Uploaded");
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            progressDialog.dismiss();
                            toastMessage("Failed"+e.getMessage());
                        }
                    })
                    .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+"%");
                        }
                    });
        }
    }
    

    【讨论】:

    • 这对我有很大帮助,非常感谢!而且我注意到您将其放在图像 node.userId 下,因此在接收此数据时,您只需指向同一个目录。我唯一的问题是在 chooseImage() 方法中,您将类型设置为“image/*”,这究竟是如何工作的。此外,该方法如何知道触发上传图像或者发生在我看不到的地方。我知道 startActivityForResult 比 startActivity 有更多的实用性,但它让我对它的工作原理感到困惑。再次感谢您所做的一切!
    • chooseImage 方法创建了一个类型为“image”(即画廊本身)的新意图(有点像屏幕),并将结果作为选择的图像提供,因此它基本上打开了画廊。例如,您可以在按钮或 imageView 单击侦听器上调用它,然后执行相同操作将图像上传到 firebase,也许是另一个按钮。本指南非常适合您搜索的内容:code.tutsplus.com/tutorials/… 祝您好运。
    猜你喜欢
    • 2017-05-04
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2020-01-10
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多