【问题标题】:Users are not getting stored in Firebase database while images are stored in Firebase storage图像存储在 Firebase 存储中时,用户未存储在 Firebase 数据库中
【发布时间】:2021-03-13 00:02:51
【问题描述】:

我在 Android Studio 中使用 Firebase 身份验证处理一个项目。当用户的图像存储在 Firebase 存储中时,我无法将用户存储在 Firebase 数据库中。因此,它不会进入下一个活动并卡住。

ActivitySetupProfileBinding binding;
FirebaseAuth auth;
FirebaseDatabase database;
FirebaseStorage storage;
Uri selectedImage;
ProgressDialog dialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivitySetupProfileBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    dialog = new ProgressDialog(this);
    dialog.setMessage("Updating Profile..");
    dialog.setCancelable(false);

    database = FirebaseDatabase.getInstance();
    storage = FirebaseStorage.getInstance();
    auth = FirebaseAuth.getInstance();

    getSupportActionBar().hide();

    binding.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent  intent = new Intent();
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(intent, 45);


        }
    });

    binding.continueBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String name = binding.nameBox.getText().toString();

            if(name.isEmpty()) {
                binding.nameBox.setError("Name cannot be empty..");
                return;
            }

            dialog.show();
            if(selectedImage !=null) {
                StorageReference reference = storage.getReference().child("Profiles").child(auth.getUid());
                reference.putFile(selectedImage).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                        if(task.isSuccessful()) {
                            reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    String imageUrl = uri.toString();

                                    String uid = auth.getUid();
                                    String phone = auth.getCurrentUser().getPhoneNumber();
                                    String name = binding.nameBox.getText().toString();

                                    User user = new User(uid, name, phone, imageUrl);

                                    database.getReference()
                                            .child("users")
                                            .child(uid)
                                            .setValue(user)
                                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                @Override
                                                public void onSuccess(Void aVoid) {
                                                    dialog.dismiss();
                                                    Intent intent = new Intent (SetupProfileActivity.this, MainActivity.class);
                                                    startActivity(intent);
                                                    finish();

                                                }
                                            });


                                }
                            });
                        }

                    }
                });
            } else {
                String uid = auth.getUid();
                String phone = auth.getCurrentUser().getPhoneNumber();

                User user = new User(uid, name, phone, "No Image");

                database.getReference()
                        .child("users")
                        .child(uid)
                        .setValue(user)
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                dialog.dismiss();
                                Intent intent = new Intent (SetupProfileActivity.this, MainActivity.class);
                                startActivity(intent);
                                finish();

                            }
                        });
            }

        }
    });

}

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

    if(data != null) {
        if(data.getData() != null) {
            binding.imageView.setImageURI(data.getData());
            selectedImage = data.getData();

        }

    }

}

【问题讨论】:

  • 这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
  • 嗨,Alex,一旦我执行了这段代码,它就会卡在当前的活动中,并且不会移动到下一个活动。它应该将用户的信息存储在 Firebase 中,但它没有发生。我期待用户存储在火力基地中,我可以进行下一个活动。谢谢!
  • 你有没有试过实现onFailure,看看有没有问题?
  • 我会这样做并让你知道。

标签: android firebase-realtime-database


【解决方案1】:

检查 Firebase 控制台中的规则以访问存储。 默认情况下,所有经过身份验证的用户都可以读取和写入存储。 存储的默认规则是:

    rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

在上传图片之前,您应该先登录 firebase。

为了测试你可以换行

allow read, write: if request.auth != null;

allow read write;

【讨论】:

  • 谢谢SH,我试过允许读,写;还是一样。
【解决方案2】:

问题已解决。实际上,在 Firebase 数据库中,我将位置更改为欧洲,而不是默认位置(美国)。通过将位置更改回美国解决了问题。谢谢!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2020-10-23
    • 2021-07-18
    • 2020-02-21
    • 2021-07-12
    • 2017-12-04
    相关资源
    最近更新 更多