You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台使用Java如何从Firebase Storage获取图片URL

人员名录App AddPerson页面代码修复说明

现有代码存在的问题

  • 基础语法错误:类定义处AddPersonextends缺少空格,未声明AboutMissingSpinner变量,直接编译无法通过
  • 空指针风险:未校验用户是否选择图片,imageUri为空时调用上传方法会直接崩溃
  • 主线程阻塞风险:获取图片下载地址时使用死循环等待任务完成,占用主线程资源容易触发ANR
  • 保存逻辑时序错误:点击保存后直接关闭页面,未等待上传、入库操作完成,大概率出现数据丢失
  • 异常处理缺失:图片上传失败、数据库写入失败没有任何提示和降级逻辑
  • 未保存变更判断逻辑错误:home键点击判断的if分支为空,无论用户是否有输入都会触发未保存弹窗

修复后的完整代码

public class AddPerson extends AppCompatActivity {
    private TextInputEditText mFirstName, mLastName, mAge, mDescription;
    // 补全缺失的Spinner变量声明,可根据实际需求修改类型
    private Spinner AboutMissingSpinner;
    private String firstNameString, lastNameString, ageString, descriptionString;
    private Uri imageUri = null;
    CardView mInsertImage;
    ImageView mImageView;
    private static final int IMAGE_PICK_CODE = 1000;
    // 新增加载提示避免用户重复点击
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_person);
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("保存中,请稍候...");
        progressDialog.setCancelable(false);

        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) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE && data != null) {
            imageUri = data.getData();
            mImageView.setImageURI(imageUri);
        }
    }

    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(firstNameString)) {
            mFirstName.setError("请输入姓名");
            return;
        }
        if (TextUtils.isEmpty(ageString)) {
            mAge.setError("请输入年龄");
            return;
        }
        // 不需要强制选照片可以删除该判断
        if (imageUri == null) {
            Toast.makeText(this, "请选择人员照片", Toast.LENGTH_SHORT).show();
            return;
        }
        progressDialog.show();
        uploadImage();
    }

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

        StorageReference storageReference = FirebaseStorage.getInstance().getReference(filePathAndName);
        storageReference.putFile(imageUri)
                .addOnSuccessListener(taskSnapshot -> {
                    // 替换死循环,用异步回调获取下载地址
                    taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(uriTask -> {
                        if (uriTask.isSuccessful()) {
                            String uploadedImageUri = "" + uriTask.getResult();
                            sendList(uploadedImageUri, timestamp);
                        } else {
                            progressDialog.dismiss();
                            Toast.makeText(AddPerson.this, "获取图片地址失败:" + uriTask.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    });
                }).addOnFailureListener(e -> {
                    progressDialog.dismiss();
                    Toast.makeText(AddPerson.this, "图片上传失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                });
    }

    @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) {
            // 修复未保存判断逻辑
            boolean hasInput = !TextUtils.isEmpty(firstNameString) || !TextUtils.isEmpty(lastNameString)
                    || !TextUtils.isEmpty(ageString) || !TextUtils.isEmpty(descriptionString) || imageUri != null;
            if (hasInput) {
                showUnsavedChangesDialog();
            } else {
                finish();
            }
            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).addOnCompleteListener(task -> {
            progressDialog.dismiss();
            if (task.isSuccessful()) {
                Toast.makeText(AddPerson.this, "保存成功", Toast.LENGTH_SHORT).show();
                finish();
            } else {
                Toast.makeText(AddPerson.this, "保存失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    // 原有未保存变更弹窗逻辑保持不变即可
    private void showUnsavedChangesDialog() {
        // 原有弹窗实现逻辑
    }
}

内容的提问来源于stack exchange,提问作者user17093321

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:54:04