[英]Android Firebase Storage problem to upload image
我在将照片添加到 Firebase 存储时遇到问题。 这是我的所有代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_settings, container, false);
firebaseAuth = FirebaseAuth.getInstance();
firebaseUser = firebaseAuth.getCurrentUser();
firebaseFirestore = FirebaseFirestore.getInstance();
firebaseStorage = FirebaseStorage.getInstance();
storageReference = firebaseStorage.getReference();
profileImage = (ImageView) view.findViewById(R.id.ivProfilePicture);
logout = (Button) view.findViewById(R.id.btLogout);
deleteAccount = (Button) view.findViewById(R.id.btDelete);
updateAccount = (Button) view.findViewById(R.id.btUpdate);
searchPicture = (Button) view.findViewById(R.id.btSelect);
addPicture = (Button) view.findViewById(R.id.btUpload);
pseudo = (TextView) view.findViewById(R.id.tvUserPseudo);
name = (EditText) view.findViewById(R.id.etUserNameModif);
surname = (EditText) view.findViewById(R.id.etUserSurnameModif);
mail = (TextView) view.findViewById(R.id.tvUserEmail);
age = (EditText) view.findViewById(R.id.etUserAgeModif);
modifyMail = (TextView) view.findViewById(R.id.tvChangeEmail);
modifyPassword = (TextView) view.findViewById(R.id.tvChangePassword);
userMail = firebaseUser.getEmail();
progressDialog = new ProgressDialog(view.getContext(), R.style.AppCompatAlertDialogStyle);
userUid = FirebaseAuth.getInstance().getCurrentUser().getUid(); // Collect user data
documentReference = firebaseFirestore.collection("Users").document(userUid);
documentReference.addSnapshotListener(getActivity(), new EventListener<DocumentSnapshot>() {// Display data in TextView
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
if (e == null) {
if (documentSnapshot.exists()) {
pseudo.setText(documentSnapshot.getString("Pseudo"));
name.setText(documentSnapshot.getString("Name"));
surname.setText(documentSnapshot.getString("Surname"));
mail.setText(userMail);
age.setText(documentSnapshot.getString("Age"));
} else {
}
}
}
});
modifyMail.setOnClickListener(new View.OnClickListener() { // Change Email
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogStyle);
builder.setTitle("Pour modifier l'adresse e-mail merci de vous reconnecter :");
final View customLayout = getLayoutInflater().inflate(R.layout.alertdialog_email, null);
builder.setView(customLayout);
builder.setPositiveButton("Valider", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
EditText mailchange = customLayout.findViewById(R.id.etMailChange);
EditText passwordchange = customLayout.findViewById(R.id.etPasswordChange);
EditText newmailchange = customLayout.findViewById(R.id.etNewMail);
String mailc = mailchange.getText().toString();
String passwordc = passwordchange.getText().toString();
String newmailc = newmailchange.getText().toString();
if (!mailc.isEmpty() && !passwordc.isEmpty() && !newmailc.isEmpty()) {
firebaseAuth.fetchSignInMethodsForEmail(newmailc) // Check if an account already exist with this E-mail
.addOnCompleteListener(task -> {
if (mailc.matches(emailPattern) && newmailc.matches(emailPattern)) {
List<String> check = task.getResult().getSignInMethods();
if (check.isEmpty()) {
result = true;
}
if (!check.isEmpty()) {
Toast.makeText(getActivity(), "Un compte existe déjà avec cet E-mail", Toast.LENGTH_SHORT).show();
dialog.dismiss();
result = false;
}
} else {
Toast.makeText(getActivity(), "Merci de rentrer une adresse E-mail valide", Toast.LENGTH_SHORT).show();
dialog.dismiss();
result = false;
}
});
} else {
Toast.makeText(getActivity(), "Veuillez remplir tous les champs", Toast.LENGTH_SHORT).show();
result = false;
}
if (result == true) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
AuthCredential credential = EmailAuthProvider
.getCredential(mailc, passwordc);
user.reauthenticate(credential)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
user.updateEmail(newmailc);
sendEmailVerification();
} else {
Toast.makeText(getActivity(), "E-mail ou mot de passe incorrect", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
builder.setNeutralButton("Annuler", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
modifyPassword.setOnClickListener(new View.OnClickListener() { // Change password
@Override
public void onClick(View view) {
String useremail = mail.getText().toString().trim();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogStyle);
builder.setTitle("Voulez-vous vraiment modifier le mot de passe ?");
builder.setPositiveButton("Oui, envoyer le mail", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
firebaseAuth.sendPasswordResetEmail(useremail).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
getActivity().finish();
Intent intent = new Intent(getActivity(), ConnectionActivity.class);
getActivity().startActivity(intent);
Toast.makeText(getActivity(), "E-mail de réinitialisation envoyé !", Toast.LENGTH_SHORT).show();
}
}
});
}
});
builder.setNeutralButton("Non, annuler", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
updateAccount.setOnClickListener(new View.OnClickListener() { // Modify information's
@Override
public void onClick(View view) {
nameModif = name.getText().toString();
surnameModif = surname.getText().toString();
ageModif = age.getText().toString();
Map<String, Object> user = new HashMap<>();
user.put("Name", nameModif);
user.put("Surname", surnameModif);
user.put("Age", ageModif);
documentReference.update(user);
Toast.makeText(getActivity(), "Informations modifiées avec succès !", Toast.LENGTH_SHORT).show();
}
});
logout.setOnClickListener(new View.OnClickListener() { // Logout
@Override
public void onClick(View view) {
firebaseAuth.signOut();
getActivity().finish();
Intent intent = new Intent(getActivity(), ConnectionActivity.class);
getActivity().startActivity(intent);
Toast.makeText(getActivity(), "Déconnexion réussie", Toast.LENGTH_SHORT).show();
}
});
searchPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startCropActivity();
}
});
addPicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addPictureFirebase();
}
});
deleteAccount.setOnClickListener(new View.OnClickListener() { // Delete an account
@Override
public void onClick(View view) {
AlertDialog.Builder dialog = new AlertDialog.Builder(view.getContext());
dialog.setTitle("Êtes-vous sur ?");
dialog.setMessage("Supprimer ce compte sera définitif et vous ne pourrez plus revenir en arrière.");
dialog.setPositiveButton("Supprimer", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
progressDialog.setMessage("Suppression du compte en cours");
progressDialog.show();
firebaseUser.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(getActivity(), "Compte supprimer avec succès", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
getActivity().finish();
Intent intent = new Intent(getActivity(), ConnectionActivity.class);
getActivity().startActivity(intent);
} else {
Toast.makeText(getActivity(), "Une erreur est survenue", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}
});
}
});
dialog.setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog alertDialog = dialog.create();
alertDialog.show();
}
});
return view;
}
private void sendEmailVerification() { // Send verification E-mail to user mail address
if (firebaseUser != null) {
firebaseUser.sendEmailVerification().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
Toast.makeText(getActivity(), "E-mail modifiée avec succès, un mail de vérification a été envoyé ", Toast.LENGTH_SHORT).show();
firebaseAuth.signOut();
getActivity().finish();
Intent intent = new Intent(getActivity(), ConnectionActivity.class);
getActivity().startActivity(intent);
} else {
Toast.makeText(getActivity(), "Le mail de vérification n'a pas pu être envoyé", Toast.LENGTH_SHORT).show();
}
});
}
}
private void startCropActivity() { // Different possibilities to choose a photo
CropImage.activity()
.start(getContext(), this);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { // Crop selected photo
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
Uri resultUri = result.getUri();
profileImage.setImageURI(resultUri);
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
private void addPictureFirebase() { // Add photo to storage
StorageReference profileImagesRef = storageReference.child("profileImages/" + userUid);
storageReference.getName().equals(profileImagesRef.getName());
if (resultUri == null) {
Toast.makeText(getActivity(), "Sélectionner d'abord une photo"+resultUri, Toast.LENGTH_SHORT).show();
} else {
storageReference.putFile(resultUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getActivity(), "Photo envoyée avec succès !", Toast.LENGTH_SHORT).show();
}
});
storageReference.putFile(resultUri).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getActivity(), "Erreur", Toast.LENGTH_SHORT).show();
}
});
}
}
现在是我们感兴趣的代码部分:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { // Crop selected photo
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
Uri resultUri = result.getUri();
profileImage.setImageURI(resultUri);
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
private void addPictureFirebase() { // Add photo to storage
StorageReference profileImagesRef = storageReference.child("profileImages/" + userUid);
storageReference.getName().equals(profileImagesRef.getName());
if (resultUri == null) {
Toast.makeText(getActivity(), "Sélectionner d'abord une photo"+resultUri, Toast.LENGTH_SHORT).show();
} else {
storageReference.putFile(resultUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getActivity(), "Photo envoyée avec succès !", Toast.LENGTH_SHORT).show();
}
});
storageReference.putFile(resultUri).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getActivity(), "Erreur", Toast.LENGTH_SHORT).show();
}
});
}
}
因此问题是在 addPictureFirebase() 中 resultUri 值总是被认为是 null。 我无法解决的问题是因为如果我在进入 addPictureFirebase() 方法之前显示此值,则不是 null。 它甚至是完全正确的,但是当我尝试在第二种方法中检索它时,它变成了 null。
我已经尝试了几种解决方案,但到目前为止没有任何效果,所以我来寻求帮助。
据我所知,您的resultUri
是onActivityResult
中的局部变量,这就是为什么它在addPictureFirebase()
中不可见的原因。 我什至不确定它对你来说是不是红色的,因为我没有看到它在其他任何地方声明。
在onCreate
上面创建全局变量
Uri resultUri;
然后在你的onActivityResult
中使用这个:
resultUri = result.getUri();
那么它应该在addPictureFirebase()
中工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.