【问题标题】:why Unable to upload a picture on firebase storage?为什么无法在 Firebase 存储上上传图片?
【发布时间】:2021-11-21 06:56:00
【问题描述】:

这段代码有一个错误:

String download_url=task.getResult.getStorage.getDownloadUrl.toString);

当我运行程序时,我从图库中选择一张图片并发布它,然后我收到一条消息:

用户未通过身份验证,请使用 Firebase 身份验证进行身份验证,然后重试

final StorageReference newPhoto=mPhotosStrorage.child(imageUri.getLastPathSegment());
newPhoto.putFile(imageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

        if (task.isSuccessful())
        {
            final String myKey=mPhotosDatabase.push().getKey();

 //this error       String download_url=task.getResult().getDownloadUrl().toString();

            String datem=getDateTime();              

            DatabaseReference newDatabase=mPhotosDatabase.child(myKey);

            newDatabase.child("postid").setValue(myKey);
            newDatabase.child("postedby").setValue(userId);
            newDatabase.child("postedon").setValue(datem);
            newDatabase.child("postdetails").setValue(post);
            newDatabase.child("postlikes");
            newDatabase.child("postviews");
            newDatabase.child("postcomments");

            newDatabase.child("postimage").setValue(download_url).addOnCompleteListener(new OnCompleteListener<Void>() {
                @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    if (task.isSuccessful())
                    {
                        pb.setVisibility(View.GONE);
                        Pair[] pairs=new Pair[1];
                        pairs[0]=new Pair<View,String>(homeLayout,"etTransition");

                        ActivityOptions options=ActivityOptions.makeSceneTransitionAnimation(PostActivity.this,pairs);

                        startActivity(new Intent(PostActivity.this,HomeActivity.class),options.toBundle());

                    }
                }
            });
        }else {
            Toast.makeText(PostActivity.this, "Error:"+task.getException().getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
});

请帮忙解决,帮我重写代码。

【问题讨论】:

  • 这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
  • @AlexMamo String download_url=task.getResult().getDownloadUrl().toString();
  • @AlexMamo getDownloadUrl() 错误
  • 错误非常明确:“用户未通过身份验证,请使用 Firebase 身份验证进行身份验证,然后重试”所以在调用 getDownloadURL() 之前,您必须使用 Firebase 身份验证。
  • 确定下载 URL 需要调用服务器。因此,对getDownloadUrl() 的调用会返回一个Task,它会在下载URL 从服务器返回时完成。您需要调用addSuccessListener() 以等待它完成。请参阅文档here 和此answer

标签: java android firebase firebase-storage


【解决方案1】:

根据您上一条评论,问题出在以下代码行:

String download_url=task.getResult().getDownloadUrl().toString();

请注意,这不是您现在获取下载 URL 的方式。将该 Task 对象转换为 String 根本没有帮助。要解决这个问题,请使用以下代码行:

storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        String url = uri.toString();
        //Do what you need to do with the URL
    }
});

除此之外,请始终确保用户已通过身份验证,因为仅当用户未通过身份验证且规则设置为拒绝操作时才会发生该错误。

【讨论】:

  • 如果您认为我的回答对未来的 Firebase 开发人员也有帮助,也请考虑 giving a vote-up (▲)。我真的很感激。谢谢!
猜你喜欢
  • 2021-08-18
  • 2017-09-21
  • 2016-11-28
  • 2021-06-28
  • 1970-01-01
  • 2020-10-05
  • 2021-01-13
相关资源
最近更新 更多