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
相关产品推荐
相关产品推荐

