繁体   English   中英

如何使用 Java 从 Android 中的 Firebase 存储获取图像 URL?

[英]How to get image URL from Firebase Storage in Android using Java?

我制作了一个应用程序,其中包含(姓名,年龄,描述和照片)的人员列表,但是我搜索了太多但找不到解决方案的问题。 这是AddPerson代码:

public class AddPersonextends AppCompatActivity {
    private TextInputEditText mFirstName, mLastName, mAge, mDescription;
    private String firstNameString, lastNameString, ageString, descriptionString;
    private Uri imageUri = null;
    CardView mInsertImage;
    ImageView mImageView;
    private static final int IMAGE_PICK_CODE = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_person);

        mFirstName = findViewById(R.id.first_name_input);
        mLastName = findViewById(R.id.last_name_input);
        AboutMissingSpinner = findViewById(R.id.spinner_about_missing);
        mAge = findViewById(R.id.age_input);
        mDescription = findViewById(R.id.description_input);

        mInsertImage = findViewById(R.id.insert_image);
        mImageView = findViewById(R.id.imageView);


        mInsertImage.setOnClickListener(v -> pickImageFromGallery());
    }

    private void pickImageFromGallery() {
        Intent i = new Intent();
        i.setType("image/*");
        i.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(i, IMAGE_PICK_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE) {
            assert data != null;
            imageUri = data.getData();
            mImageView.setImageURI(data.getData());
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void insertPerson() {
        firstNameString = Objects.requireNonNull(mFirstName.getText()).toString().trim();
        lastNameString = Objects.requireNonNull(mLastName.getText()).toString().trim();
        ageString = Objects.requireNonNull(mAge.getText()).toString().trim();
        descriptionString = Objects.requireNonNull(mDescription.getText()).toString().trim();

        if (TextUtils.isEmpty(lastNameString)) {
            lastNameString = "";
        }

        if (TextUtils.isEmpty(firstNameString) && TextUtils.isEmpty(lastNameString)
                && TextUtils.isEmpty(ageString) && TextUtils.isEmpty(descriptionString)) {
            return;
        }

        uploadImage();
    }

    private void uploadImage() {
        long timestamp = System.currentTimeMillis();
        String filePathAndName = "images/" + timestamp;

        StorageReference storageReference = FirebaseStorage.getInstance().getReference(filePathAndName);
        storageReference.putFile(imageUri)
                .addOnSuccessListener(taskSnapshot -> {
                    Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl();
                    while (!uriTask.isSuccessful());
                    String uploadedImageUri = "" + uriTask.getResult();
                    sendList(uploadedImageUri, timestamp);
                }).addOnFailureListener(e -> {

                });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_add_person, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_save) {
            insertPerson();
            finish();
            return true;
        } else if (item.getItemId() == android.R.id.home) {
            if (TextUtils.isEmpty(firstNameString) && TextUtils.isEmpty(lastNameString)
                    && TextUtils.isEmpty(ageString) && TextUtils.isEmpty(descriptionString)) {
            }

            showUnsavedChangesDialog();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void sendList(String uploadedImageUri, long timestamp) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("List");
        HashMap<String, Object> hashMap = new HashMap<>();

        hashMap.put("firstName", firstNameString);
        hashMap.put("lastName", lastNameString);
        hashMap.put("age", ageString);
        hashMap.put("description", descriptionString);
        hashMap.put("url", uploadedImageUri);
        hashMap.put("timestamp", timestamp);

        reference.push().setValue(hashMap);
    }
}

正如@FrankvanPuffelen 在他的评论中提到的那样,问题确实出在以下代码行中:

while (!uriTask.isSuccessful());

当你添加一个; (分号)在行尾表示 while 语句没有人。 的确,您可以创建一个主体并在其中移动相应的代码行,但它不会像 if 语句那样运行。 因此,要解决此问题,您应该使用以下代码行:

StorageReference storageReference = FirebaseStorage.getInstance().getReference(filePathAndName);
UploadTask uploadTask = storageReference.putFile(imageUri);

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()) {
            throw task.getException();
        }

        // Continue with the task to get the download URL
        return ref.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri uploadedImageUri = task.getResult().toString();
            long timestamp = System.currentTimeMillis();
            sendList(uploadedImageUri, timestamp);
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM