Android:用户不完成账号创建仍然可以登录



我的应用程序新用户可以用手机授权注册,只有没有电子邮件,现在应用程序有3个活动为reg新用户第一个输入电话号码,第二个是OTP输入发送的代码,然后被发送到3个活动,用户可以上传个人资料图像和名称,最后一个活动的问题是,如果用户在没有上传个人资料图像或设置名称的情况下关闭了应用程序,这意味着firebase根本没有注册他,他仍然可以作为普通用户访问应用程序。

OTP acitivty:

public class OTPActivity extends AppCompatActivity {
ActivityOTPBinding binding;
FirebaseAuth auth;
String verificationId;
ProgressDialog dialog;
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
private PhoneAuthProvider.ForceResendingToken mResendToken;
private static final String TAG = "PhoneAuthActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityOTPBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

auth = FirebaseAuth.getInstance();
dialog = new ProgressDialog(this);
dialog.setMessage("Checking...");
// force prevent canceling the check
dialog.setCancelable(false);
dialog.show();
String phoneNumber =  getIntent().getStringExtra("phoneNumber");
binding.phoneLbl.setText(phoneNumber);
binding.changePhone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
.setPhoneNumber(phoneNumber)
.setTimeout(60L, TimeUnit.SECONDS)
.setActivity(OTPActivity.this)
.setCallbacks(mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
dialog.dismiss();
Toast.makeText(OTPActivity.this, "Verification Failed, Check Phone Number.", Toast.LENGTH_SHORT).show();
Log.w(TAG, "onVerificationFailed", e);
}
@Override
public void onCodeSent(@NonNull String verifyId, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(verifyId, forceResendingToken);
dialog.dismiss();
verificationId = verifyId;
mResendToken = forceResendingToken;
InputMethodManager imm = (InputMethodManager)   getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
binding.otpView.requestFocus();
Log.d(TAG, "onCodeSent:" + verifyId);
}
}).build();
PhoneAuthProvider.verifyPhoneNumber(options);
binding.otpView.setOtpCompletionListener(new OnOtpCompletionListener() {
@Override
public void onOtpCompleted(String otp) {
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, otp);
auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
Intent intent = new Intent(OTPActivity.this, SetupProfileActivity.class);
startActivity(intent);
finishAffinity();
} else {
Toast.makeText(OTPActivity.this, "Verification Failed, Please Try Again.", Toast.LENGTH_LONG).show();
}
}
});
}
});
binding.resendOTP.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(OTPActivity.this, getString(R.string.code_is_being_resent), Toast.LENGTH_SHORT).show();
resendVerificationCode(phoneNumber, mResendToken);
}
});
}
// [START resend_verification]
private void resendVerificationCode(String phoneNumber,
PhoneAuthProvider.ForceResendingToken token) {
PhoneAuthOptions options =
PhoneAuthOptions.newBuilder(auth)
.setPhoneNumber(phoneNumber)       // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(this)                 // Activity (for callback binding)
.setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
.setForceResendingToken(token)     // ForceResendingToken from callbacks
.build();
PhoneAuthProvider.verifyPhoneNumber(options);
}
// [END resend_verification]
}

设置简介:

public class SetupProfileActivity extends AppCompatActivity {
ActivitySetupProfileBinding binding;
FirebaseAuth auth;
FirebaseDatabase database;
FirebaseStorage storage;
Uri selectedImage;
ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivitySetupProfileBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
database = FirebaseDatabase.getInstance();
storage = FirebaseStorage.getInstance();
auth = FirebaseAuth.getInstance();
dialog = new ProgressDialog(this);
dialog.setMessage("Uploading Profile Setting...");
dialog.setCancelable(false);
binding.profileImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 45);
}
});
binding.finishBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = binding.nameBox.getText().toString();
if (name.isEmpty()) {
binding.nameBox.setError(getString(R.string.cant_be_empty));
}
dialog.show();
if (selectedImage !=null){
StorageReference reference = storage.getReference().child("Profiles").child(auth.getUid());
reference.putFile(selectedImage).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if (task.isSuccessful()) {
reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String imageUrl = uri.toString();
String uid = auth.getUid();
String phone = auth.getCurrentUser().getPhoneNumber();
String name = binding.nameBox.getText().toString().trim();
User user = new User(uid, name, phone, imageUrl);
database.getReference()
.child("Users")
.child(phone)
.setValue(user)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
dialog.dismiss();
Intent intent = new Intent(SetupProfileActivity.this, MainActivity.class);
SharedPreferences preferences = getSharedPreferences("DisplayUserInfo", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("DisplayName", name);
editor.putString("DisplayProfileImage", imageUrl);
editor.apply();
startActivity(intent);
finish();
}
});
}
});
}
}
});
} else {
String uid = auth.getUid();
String phone = auth.getCurrentUser().getPhoneNumber();
User user = new User(uid, name, phone, "No Image");
database.getReference()
.child("Users")
.child(phone)
.setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
dialog.dismiss();
Intent intent = new Intent(SetupProfileActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(SetupProfileActivity.this, "Failed To Reg Account", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data !=null){
if (data.getData() !=null){
binding.profileImageView.setImageURI(data.getData());
selectedImage = data.getData();
}
}
}
// check if want to exit
boolean doubleBackToExitPressedOnce = false;
@Override
public void onBackPressed() {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, getString(R.string.click_again_to_Exit), Toast.LENGTH_SHORT).show();
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
}

用于自动登录的代码:

//AutoLogin
if (auth.getCurrentUser() !=null){
Intent intent = new Intent(PhoneLoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}

处理这种情况的简单方法是保留一个布尔变量,如"isProfileComplete"在用户配置文件上。一旦在安装配置文件上收到用户提供的所有必需信息,就将此设置为true。在你的启动器活动中检查这个值,如果它为false,那么将用户重定向到你的登陆页面的设置配置文件页面。

编辑

你需要在你的自动登录代码部分做一些小的改变

if (auth.getCurrentUser() !=null){
Intent intent; 
if(isProfileComplete())
intent = new Intent(PhoneLoginActivity.this, MainActivity.class);
else
intent = new Intent(PhoneLoginActivity.this, SetupProfileActivity.class);
startActivity(intent);
finish();
}
private boolean isProfileComplete(){
//get User object for the logged in user using SharedPreferences or FirebaseDB
return user.isProfileComplete
}

最新更新