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

Android Studio中Firebase注册头像上传功能崩溃修复求助

Android注册功能头像上传导致应用崩溃问题修复求助

我正在开发Android应用的注册功能,要求用户注册时上传个人头像。但加入头像上传代码后应用持续崩溃,既无法上传用户详情也无法上传头像;移除头像代码后功能正常。推测问题出在头像上传逻辑,附上代码及Logcat日志,请求协助修复。

完整代码

public class SelectRegistrationActivity extends AppCompatActivity {

private TextView back;
private TextView fullName,email,phone,password,regButton,gender,age;
String flag="False";
private CircleImageView dp;
private Uri filePath;

// request code
private final int PICK_IMAGE_REQUEST = 22;
FirebaseAuth mAuth;
DatabaseReference userDatabaseRef;
ProgressDialog loader;
FirebaseDatabase database= FirebaseDatabase.getInstance();
String currentUserId;
FirebaseStorage storage;
StorageReference storageReference;

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

    back = findViewById(R.id.back);
    fullName = findViewById(R.id.fullName);
    email = findViewById(R.id.email);
    phone = findViewById(R.id.phone);
    password = findViewById(R.id.password);
    regButton = findViewById(R.id.regButton);
    gender = findViewById(R.id.gender);
    age = findViewById(R.id.age);
    dp = findViewById(R.id.dp);

    loader = new ProgressDialog(this);
    mAuth = FirebaseAuth.getInstance();

    storage = FirebaseStorage.getInstance();
    storageReference = storage.getReference();

    FirebaseUser user = mAuth.getInstance().getCurrentUser();
    userDatabaseRef = database.getReference().child("All Users");

    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(SelectRegistrationActivity.this, AccountSelectionActivity.class);
            startActivity(intent);
        }
    });

    dp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            flag="True";
            SelectImage();
        }
    });

    regButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            final String Email = email.getText().toString().trim();
            final String Password = password.getText().toString().trim();
            final String FullName = fullName.getText().toString().trim();
            final String Phone = phone.getText().toString().trim();
            final String Gender = gender.getText().toString().trim();
            final String Age = age.getText().toString().trim();

            if (TextUtils.isEmpty(Email)) {
                email.setError("Email is required!");
                return;
            }

            if (TextUtils.isEmpty(Password)) {
                password.setError("Password is required!");
                return;
            }

            if (TextUtils.isEmpty(FullName)) {
                fullName.setError("Name is required!");
                return;
            }

            if (TextUtils.isEmpty(Phone)) {
                phone.setError("Phone number is required!");
                return;
            }

            if (TextUtils.isEmpty(Gender)) {
                gender.setError("Gender is required!");
                return;
            }

            if (TextUtils.isEmpty(Age)) {
                age.setError("Age is required!");
                return;
            }

            if (flag.equals("False")) {
                Toast.makeText(SelectRegistrationActivity.this, "Upload profile picture!", Toast.LENGTH_SHORT).show();
                return;
            }
            else {
                loader.setMessage("Registration in process....");
                loader.setCanceledOnTouchOutside(false);
                loader.show();

                mAuth.createUserWithEmailAndPassword(Email, Password)
                        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                if (!task.isSuccessful()) {
                                    String error = task.getException().toString();
                                    Toast.makeText(SelectRegistrationActivity.this,
                                            "Error occurred:" + error, Toast.LENGTH_SHORT).show();
                                    loader.dismiss();
                                } else {
                                    currentUserId = mAuth.getCurrentUser().getUid();
                                    userDatabaseRef = database.getReference().child("All Users").child(currentUserId);
                                    HashMap userInfo = new HashMap();
                                    userInfo.put("Name", FullName);
                                    userInfo.put("Email", Email);
                                    userInfo.put("Age", Age);
                                    userInfo.put("Gender", Gender);
                                    userInfo.put("Phone", Phone);
                                    userInfo.put("Password", Password);
                                    userInfo.put("Type", "Patient");

                                    uploadImage();

                                    userDatabaseRef.updateChildren(userInfo).addOnCompleteListener(new OnCompleteListener() {
                                        @Override
                                        public void onComplete(@NonNull Task task) {
                                            if (task.isSuccessful()) {
                                                Toast.makeText(SelectRegistrationActivity.this, "Details set Successful", Toast.LENGTH_SHORT).show();
                                            } else {
                                                Toast.makeText(SelectRegistrationActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show();
                                            }
                                            finish();
                                            loader.dismiss();
                                        }
                                    });
                                }
                            }
                        });
            }
        }
    });
}

private void SelectImage() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Image from here..."), PICK_IMAGE_REQUEST);
}

@Override
protected 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(getContentResolver(), filePath);
            dp.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void uploadImage() {
    if (filePath != null) {
        StorageReference ref = storageReference.child("Patient/"+currentUserId);
        ref.putFile(filePath)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        Toast.makeText(SelectRegistrationActivity.this, "Image Uploaded!!", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(SelectRegistrationActivity.this, "Upload failed: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
    }
}
}

Logcat日志

2022-08-24 18:07:09.903 12588-12588/? E/.example.hisss: Unknown bits set in runtime_flags: 0x800000
2022-08-24 18:07:11.013 12588-12651/com.example.hissss E/LB: fail to open file: No such file or directory

关键问题与修复说明

  1. currentUserId变量作用域错误:
    原代码在认证回调内定义了局部currentUserId,导致类成员变量始终为null,上传头像时路径拼接出现无效值引发崩溃。修复后直接将用户ID赋值给类成员变量。

  2. 异步操作执行顺序错误:
    finish()和loader.dismiss()原本在异步认证方法外,会提前关闭界面,导致后续数据库更新和头像上传操作中断。修复后将这两个操作移到数据库更新完成的回调中,确保所有异步任务执行完毕后再结束界面。

  3. 缺少上传失败监听:
    原头像上传仅监听成功事件,添加失败监听后可直接获取上传失败的具体原因,便于快速排查问题。

  4. 日志信息不完整:
    当前提供的Logcat未显示崩溃核心堆栈,建议过滤Error级别日志,获取完整的崩溃报错信息,进一步确认问题细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:15:33