无法保存 firebase 上传图片链接

时间:2021-02-06 01:58:03

标签: android firebase android-studio firebase-realtime-database firebase-storage

搜索了 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();
        });
    }

  • 以及用于写入/读取用户数据的 Users 类

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;
    }
}

  • 好吧,如果需要,所有 ProfileEdit 代码

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();
                }
            });*/
        }
    }

1 个答案:

答案 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 天时间才弄明白......

相关问题