Firebase - 将图片与用户相关联?

Firebase - Associating Pictures to Users?

我正在尝试使用 Firebase 将上传的照片关联到用户,以便可以在他们的个人资料中看到这些照片。目前它正在将它们上传到存储,但它似乎不一定与用户 ID 相关联。他们不应该显示在 "Database" 部分吗?

我浏览了 https://firebase.google.com/docs/storage/android/upload-files as well as https://firebase.google.com/docs/storage/android/download-files and some Whosebug articles() 和 youtube 视频

我特别尝试的是让 getCurentUser() 将其设置为一个 String 并将其附加到图像名称,以便我以后可以找到它,但我假设必须有一个更简单的内置 -在路上?

我登录然后转到此 RegisterPhotoActivity:

public class RegisterPhotoActivity extends Activity {

    Button uploadProfilePhoto;
    ImageView checkmarkImage, backArrowImage;

    private FirebaseAuth auth;
    private static FirebaseUser currentUser;
    String currentUserString;

    private static final int SELECTED_PICTURE = 1;

    FirebaseStorage storage;
    StorageReference storageReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registerphoto);

        uploadProfilePhoto = (Button) findViewById(R.id.uploadPhotoBTN);
        checkmarkImage = (ImageView) findViewById(R.id.checkmarkImage);

        backArrowImage = (ImageView) findViewById(R.id.leftArrow);
        backArrowImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(RegisterPhotoActivity.this, RegisterActivity.class);
                startActivity(intent);
            }
        });

        auth = FirebaseAuth.getInstance();

        currentUser =
                auth.getCurrentUser();
        currentUserString = currentUser.toString();
        Log.i("CurrentUserString", currentUserString);

        storage = FirebaseStorage.getInstance();
        //storageReference = storage.getReferenceFromUrl("gs://timeclock-fc.appspot.com").child("20170702_174811.jpeg"); 
        //storageReference = storage.getReferenceFromUrl("gs://timeclock-fc.appspot.com").child(currentUserString); 
        storageReference = storage.getReferenceFromUrl("gs://timeclock-fc.appspot.com/images").child(currentUserString); 



        checkmarkImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(RegisterPhotoActivity.this, RegisterBusinessActivity.class);
                startActivity(intent);
            }
        });

        uploadProfilePhoto.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                handleChooseImage(view);
            }
        });

    }

    //END OF onCreate

    //Separate methods

    //Actually opens the CameraRoll
        public void handleChooseImage(View v) {
            Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, SELECTED_PICTURE);  //then goes to onActivityResult
        }
        public void handleInsertData(View v) {

        }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 0:
                if(requestCode == RESULT_OK) {
                    Log.i("RegisterActivity", "case 0");
                }
                break;
            case 1:
                if(resultCode == RESULT_OK && data != null) {

                    Uri selectedImage = data.getData();
                    Log.i("RegisterActivity", "selected image = " + selectedImage);
                    Bitmap imageBitmap = null;
                    try {
                        imageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    encodeBitmapAndSaveToFirebase(imageBitmap);
                }
                break;
        }
    }

    public void encodeBitmapAndSaveToFirebase(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);  //was PNG
        byte[] data = baos.toByteArray();

        UploadTask uploadTask = storageReference.putBytes(data);
        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Toast.makeText(RegisterPhotoActivity.this, "reached onSuccess:", Toast.LENGTH_SHORT).show();

            }
        });
    }
}

这是我的存储规则:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
    match /images {
         // Only an individual user can write to "their" images
      match /{userId}/{imageId} {
        allow write: if request.auth.uid == userId;
      }
    }

  }

}

我的存储:

我希望它显示的 Firebase 节点:

当照片上传到存储时,您的数据库中不会自动发生任何事情。一种选择是向 OnSuccessListener 中的 onSuccess 添加一些代码,以获取照片的下载 url,然后将其写入相关员工用户 ID 下的数据库。代码可能类似于:

 Uri downloadUrl = taskSnapshot.getDownloadUrl();       
 Map<String, Object> map = new HashMap<>(); 
 map.put("photoDownloadUrl", downloadUrl.toString());
 userRef.updateChildren(map);