搜索了 2-3 天并尝试了不同的解决方案后,我不知道问题出在哪里。图片已加载,一切正常,但实时它不想以任何方式保存,我已经很困惑在哪里使用 getDownloadUrl 形成,因为对 ref 的调用和对 task/uploadtask 的调用都必须返回正确的值。我什至已经删除了 UploadImage 中的所有进度阅读器代码,现在有来自 firebase 文档的代码。
private void uploadImage() {
StorageReference storage = FirebaseStorage.getInstance().getReference("Users/" + user.getUid());
StorageReference fileRef = storage.child("ava" + UUID.randomUUID().toString());
UploadTask uploadTask = fileRef.putFile(filePath);
Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
Toast.makeText(ProfileEdit.this, "err1 = " + newphotoUri.toString(), Toast.LENGTH_SHORT).show();
throw task.getException();
}
Toast.makeText(ProfileEdit.this, "253 = " + newphotoUri.toString(), Toast.LENGTH_SHORT).show();
// Continue with the task to get the download URL
return fileRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
newphotoUri = task.getResult();
Toast.makeText(ProfileEdit.this, "uri = " + newphotoUri.toString(), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(ProfileEdit.this, "err2 = " + newphotoUri.toString(), Toast.LENGTH_SHORT).show();
// Handle failures
// ...
}
}
});
/* if (filePath != null) {
UploadTask uploadTask = fileRef.putFile(filePath);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//ошибка загрузки
}
});
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
//успешная загрузка
// taskSnapshot.getMetadata() contains file metadata such as size, content-type,
// and download URL.
newphotoUri = taskSnapshot.getUploadSessionUri();
}
});*/
}
accept.setOnClickListener(v -> {
uploadImage();
String uid = user.getUid();
String username = fN.getText().toString() + " " +
sN.getText().toString() + " " + lN.getText().toString();
String pNumber = phone.getText().toString();
String position = pos.getText().toString();
String category = categ.getText().toString();
String dateBirth = dBirth.getText().toString();
String weight = wei.getText().toString();
String growth = grow.getText().toString();
String level = lvl.getText().toString();
String preferredSport = prefS.getSelectedItem().toString();
String photoUri = newphotoUri != null ? newphotoUri.toString() : null;
Users newUser = new Users(uid, username, pNumber, position,
category, dateBirth, weight, growth, level, preferredSport, photoUri);
isRef.child("Users").child("info").child(uid).setValue(newUser)
.addOnSuccessListener(aVoid ->
{
Toast.makeText(ProfileEdit.this, "Профиль обновлен", Toast.LENGTH_SHORT).show();
ProfileEdit.this.finish();
/*UserProfileChangeRequest changeRequest = new UserProfileChangeRequest.Builder()
.setDisplayName(firstName + secName)
.build();
user.updateProfile(changeRequest)
.addOnCompleteListener(task -> {
}).addOnFailureListener(e ->
Toast.makeText(ProfileEdit.this, "ERRORRESESE ." + e.getMessage(), Toast.LENGTH_LONG).show());*/
})
.addOnFailureListener(e ->
{
Toast.makeText(ProfileEdit.this, "ERROR/" + e.getMessage(), Toast.LENGTH_LONG).show();
});
});
bclose.setOnClickListener(v -> {
this.finish();
});
}
import android.net.Uri;
public class Users {
public String uid, username, pNumber, position, category, dateBirth, weight, growth, level, preferredSport;
public String photoUri;
public Users() {
}
public Users(String uid, String username, String pNumber, String position, String category,
String dateBirth, String weight, String growth, String level, String preferredSport, String photoUri) {
this.uid = uid;
this.username = username;
this.pNumber = pNumber;
this.position = position;
this.category = category;
this.dateBirth = dateBirth;
this.weight = weight;
this.growth = growth;
this.level = level;
this.preferredSport = preferredSport;
this.photoUri = photoUri;
}
}
package
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.format.DateUtils;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.Continuation;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.UserInfo;
import com.google.firebase.auth.UserProfileChangeRequest;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.BuildConfig;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;
import .Consts.Constant;
import .Consts.PhotoUri;
import .Consts.Users;
import .HomeNav;
import .R;
import .SignIn;
public class ProfileEdit extends AppCompatActivity {
private EditText fN, sN, lN, pos, categ, lvl, dBirth, phone, wei, grow;
private Button accept, bclose;
private Spinner prefS;
private final FirebaseAuth mAuth = FirebaseAuth.getInstance();
private FirebaseUser user;
private final FirebaseDatabase isDB = FirebaseDatabase.getInstance();
private final DatabaseReference isRef = isDB.getReference();
private final Calendar dateAndTime = Calendar.getInstance();
private ImageView profileImg;
private final int PICK_IMAGE_REQUEST = 71;
private FirebaseStorage storage;
private StorageReference storageReference;
private Uri filePath, newphotoUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile_edit);
setTitle("Редактировать");
assert getSupportActionBar() != null; //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
user = mAuth.getCurrentUser();
if (user == null) {
finish();
}
GetAndSetUserInfo();
init();
dBirth.setOnKeyListener(null);
dBirth.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
setDate();
}
}
});
profileImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ProfileEdit.this, "PhotoUri", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}
});
accept.setOnClickListener(v -> {
uploadImage();
String uid = user.getUid();
String username = fN.getText().toString() + " " +
sN.getText().toString() + " " + lN.getText().toString();
String pNumber = phone.getText().toString();
String position = pos.getText().toString();
String category = categ.getText().toString();
String dateBirth = dBirth.getText().toString();
String weight = wei.getText().toString();
String growth = grow.getText().toString();
String level = lvl.getText().toString();
String preferredSport = prefS.getSelectedItem().toString();
String photoUri = newphotoUri != null ? newphotoUri.toString() : null;
Users newUser = new Users(uid, username, pNumber, position,
category, dateBirth, weight, growth, level, preferredSport, photoUri);
isRef.child("Users").child("info").child(uid).setValue(newUser)
.addOnSuccessListener(aVoid ->
{
Toast.makeText(ProfileEdit.this, "Профиль обновлен", Toast.LENGTH_SHORT).show();
ProfileEdit.this.finish();
/*UserProfileChangeRequest changeRequest = new UserProfileChangeRequest.Builder()
.setDisplayName(firstName + secName)
.build();
user.updateProfile(changeRequest)
.addOnCompleteListener(task -> {
}).addOnFailureListener(e ->
Toast.makeText(ProfileEdit.this, "ERRORRESESE ." + e.getMessage(), Toast.LENGTH_LONG).show());*/
})
.addOnFailureListener(e ->
{
Toast.makeText(ProfileEdit.this, "ERROR/" + e.getMessage(), Toast.LENGTH_LONG).show();
});
});
bclose.setOnClickListener(v -> {
this.finish();
});
}
@Override
public boolean onSupportNavigateUp() {
finish();
return true;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
&& data != null && data.getData() != null) {
filePath = data.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), filePath);
profileImg.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void init() {
bclose = findViewById(R.id.bCancel);
accept = findViewById(R.id.bAccept);
fN = findViewById(R.id.eFName);
sN = findViewById(R.id.eSName);
lN = findViewById(R.id.eLName);
pos = findViewById(R.id.ePos);
categ = findViewById(R.id.eCategory);
lvl = findViewById(R.id.eLvl);
dBirth = findViewById(R.id.eDBirth);
phone = findViewById(R.id.ePhoneN);
wei = findViewById(R.id.eWeight);
grow = findViewById(R.id.eGrowth);
prefS = findViewById(R.id.sPrefSprt);
profileImg = findViewById(R.id.profileImgEdit);
}
public void GetAndSetUserInfo() {
isRef.child("Users").child("info").child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Users users = snapshot.getValue(Users.class);
if (users != null) {
fN.setText(users.username);
pos.setText(users.position);
categ.setText(users.category);
lvl.setText(users.level);
dBirth.setText(users.dateBirth);
phone.setText(users.pNumber);
wei.setText(users.weight);
grow.setText(users.growth);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
public void setDate() {
new DatePickerDialog(ProfileEdit.this, d,
dateAndTime.get(Calendar.YEAR),
dateAndTime.get(Calendar.MONTH),
dateAndTime.get(Calendar.DAY_OF_MONTH))
.show();
}
DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
dateAndTime.set(Calendar.YEAR, year);
dateAndTime.set(Calendar.MONTH, monthOfYear);
dateAndTime.set(Calendar.DAY_OF_MONTH, dayOfMonth);
setInitialDateTime();
}
};
private void setInitialDateTime() {
dBirth.setText(DateUtils.formatDateTime(ProfileEdit.this,
dateAndTime.getTimeInMillis(),
DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
private void uploadImage() {
StorageReference storage = FirebaseStorage.getInstance().getReference("Users/" + user.getUid());
StorageReference fileRef = storage.child("ava" + UUID.randomUUID().toString());
UploadTask uploadTask = fileRef.putFile(filePath);
Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
Toast.makeText(ProfileEdit.this, "err1 = " + newphotoUri.toString(), Toast.LENGTH_SHORT).show();
throw task.getException();
}
Toast.makeText(ProfileEdit.this, "253 = " + newphotoUri.toString(), Toast.LENGTH_SHORT).show();
// Continue with the task to get the download URL
return fileRef.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
newphotoUri = task.getResult();
Toast.makeText(ProfileEdit.this, "uri = " + newphotoUri.toString(), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(ProfileEdit.this, "err2 = " + newphotoUri.toString(), Toast.LENGTH_SHORT).show();
// Handle failures
// ...
}
}
});
/* if (filePath != null) {
UploadTask uploadTask = fileRef.putFile(filePath);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//ошибка загрузки
}
});
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
//успешная загрузка
// taskSnapshot.getMetadata() contains file metadata such as size, content-type,
// and download URL.
newphotoUri = taskSnapshot.getUploadSessionUri();
}
});*/
}
}
答案 0 :(得分:0)
感谢您的提示。 决定如下。我想通过点击用户信息中的一个按钮来保存uri,但是这导致了一个错误,因为用户总是放不了图片,有时uri返回null,因为文件没有时间加载,链接是没有及时形成。然后我想起点击一个按钮就已经调用了加载图片,我只是在照片上传块中写下了指向图片的链接。嗯,总之,这里,甚至收紧
uploadTask.continueWithTask(...).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult(); //isRef it`s FirebaseReference
isRef.child("Users").child(userID).child("photoAva").setValue("url", downloadUri.toString());
Toast.makeText(ProfileEdit.this, "Updated", Toast.LENGTH_SHORT).show();
} else {
//Toast.makeText(mContext, "Failed", Toast.LENGTH_SHORT).show();
// Handle failures
// ...
}
}
});
omg,我花了 3 天时间才弄明白......