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
关键问题与修复说明
currentUserId变量作用域错误:
原代码在认证回调内定义了局部currentUserId,导致类成员变量始终为null,上传头像时路径拼接出现无效值引发崩溃。修复后直接将用户ID赋值给类成员变量。异步操作执行顺序错误:
finish()和loader.dismiss()原本在异步认证方法外,会提前关闭界面,导致后续数据库更新和头像上传操作中断。修复后将这两个操作移到数据库更新完成的回调中,确保所有异步任务执行完毕后再结束界面。缺少上传失败监听:
原头像上传仅监听成功事件,添加失败监听后可直接获取上传失败的具体原因,便于快速排查问题。日志信息不完整:
当前提供的Logcat未显示崩溃核心堆栈,建议过滤Error级别日志,获取完整的崩溃报错信息,进一步确认问题细节。
内容的提问来源于stack exchange,提问作者New
相关产品推荐
相关产品推荐

