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);
我正在尝试使用 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(
我特别尝试的是让 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);