我一直在浏览Firebase文档,以及在stackoverflow,google和YouTube上搜索以下内容:
创建允许电子邮件,密码和个人资料照片的用户注册。
我能够成功添加用户的电子邮件和密码,但我似乎无法获取其他信息(最重要的是个人资料照片)。所有教程和文档都显示了某人(已登录)用户是如何将照片上传到firebase的,而不是针对正在注册的人。有人可以在这里帮忙,我如何获得新用户上传的个人资料照片和名字/姓氏?
我正在使用FirebaseAuth添加用户。
这是我到目前为止所做的:
checkmarkImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
auth.createUserWithEmailAndPassword(emailET.getText().toString(), passwordET.getText().toString())
.addOnCompleteListener(RegisterActivity.this, new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
Toast.makeText(RegisterActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
//progressBar.setVisibility(View.GONE);
if (!task.isSuccessful()) {
Toast.makeText(RegisterActivity.this, "Authentication failed." + task.getException(),
Toast.LENGTH_SHORT).show();
} else {
startActivity(new Intent(RegisterActivity.this, HomeActivity.class));
finish();
}
}
});
}
});
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 imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch (requestCode) {
case 0:
if(requestCode == RESULT_OK) {
Log.i("RegisterActivity", "case 0");
}
break;
case 1:
if(resultCode == RESULT_OK) {
Uri selectedImage = imageReturnedIntent.getData();
Log.i("RegisterActivity", "selected image = " + selectedImage);
}
break;
}
}
}
答案 0 :(得分:0)
您需要先注册,然后以标准方式将用户图像上传到存储中。
因为根据firebase存储默认规则user != null
所以用户身份验证状态必须不为null,否则你可以将firebase规则更改为public(它不是优选的)
我希望这会对你有所帮助。
auth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(SignupActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
aDialog.show();
} else {
final String uid = task.getResult().getUser().getUid();
StorageReference filepath = mStorage.child("user_profile").child(mImageUri.getLastPathSegment());
filepath.putFile(mImageUri).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
if (progress == 100) {
hideProgressDialog();
//upload();
}
System.out.println("Upload is " + progress + "% done");
}
}).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
@Override
public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
System.out.println("Upload is paused");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
/** Get Image Download Path**/
Uri downloadUri = taskSnapshot.getDownloadUrl();
/** Converting Image Uri In String **/
if (downloadUri != null) {
imagerls = downloadUri.toString();
}
//Add user data and image URL to firebase database
}
});
}
}
});
答案 1 :(得分:0)
无论用户在firebase上注册,您都可以上传图片, 但是,当用户登录时,您需要用户参考来保存图像以再次获取它,如果用户尚未注册,则您无法获得该用户的参考。 说得通? :)
答案 2 :(得分:0)
可能有点晚了,但是对于任何来这里寻求可靠答案的人,我将向您展示我是如何实现这一目标的。
我有一个POJO类CreatedUserDetail,其中包含电子邮件和照片字段。
我还创建了一个User类:
public class User{
private String uid;
private String password;
private String email;
private String photo;
public User( String email, String photo, String password ){
this.email = email;
this.photo = photo;
this.password = password;
}
public void saveToFirebase(){
CreatedUserDetail userDetail = new CreatedUserDetail();
userDetail.setEmail( email );
userDetail.setImage( photo );
FirebaseDatabase.getInstance()
.getReference()
.child( "Users" )
.child( uid ).setValue( userDetail );
}
private void uploadProfileImage(){
final StorageReference mStorageReference = FirebaseStorage.getInstance()
.getReference()
.child( "pics" +
uid +
photo.substring( photo.lastIndexOf( "." ) ) );
UploadTask uploadTask = mStorageReference.putFile( Uri.fromFile( new File( photo ) ) );
uploadTask.continueWithTask( new Continuation< UploadTask.TaskSnapshot, Task< Uri > >(){
@Override
public Task< Uri > then( @NonNull Task< UploadTask.TaskSnapshot > task ) throws Exception{
if( !task.isSuccessful() )
throw task.getException();
return mStorageReference.getDownloadUrl();
}
} ).addOnCompleteListener( new OnCompleteListener< Uri >(){
@Override
public void onComplete( @NonNull Task< Uri > task ){
if( task.isSuccessful() ){
photo = task.getResult().toString();
FirebaseDatabase.getInstance().getReference( "Users" )
.child( uid )
.child( "image" )
.setValue( photo );
}
}
} );
}
public void RegisterUser( final OnUserRegistrationCallback onUserRegistrationCallback ){
FirebaseAuth.getInstance()
.createUserWithEmailAndPassword( email, password )
.addOnSuccessListener( new OnSuccessListener< AuthResult >(){
@Override
public void onSuccess( AuthResult authResult ){
uid = authResult.getUser().getUid();
saveToFirebase();
uploadProfileImage();
}
} )
.addOnFailureListener( new OnFailureListener(){
@Override
public void onFailure( @NonNull Exception e ){
}
} );
}
}
如您所见,它具有RegisterUser函数,该函数首先使用给定的电子邮件和密码在Firebase Authentication中创建一个用户。注册后,我将在Firebase数据库中创建一个用户,并使用电子邮件和本地照片路径。同时,它还将照片上传到Firebase Storage。最后,上传完成后,我用最近上传的照片的downloadUrl更新了Firebase数据库节点。
在活动中,我只是这样做:
mUserWithEmailAndPassword = new User( mEmailToVerify, mLocalPath, mPass );
mUserWithEmailAndPassword.RegisterUser();
仅此而已。您可以添加一个回调来显示Toast或重定向到另一个活动。