Android:如果用户没有完成注册,他仍然可以进入 MainActivity

Posted

技术标签:

【中文标题】Android:如果用户没有完成注册,他仍然可以进入 MainActivity【英文标题】:Android: If user doesn't complete Registration he still can get to MainActivity 【发布时间】:2021-12-02 02:14:24 【问题描述】:

我的应用程序以注册活动开始,询问他们的电话号码,输入电话号码后会收到一个 otp 代码,然后进入进入创建帐户的最后阶段,即设置个人资料名称和图片。

我的问题是,如果用户在 otp 之后设置配置文件活动时关闭了应用程序, 下次他打开应用程序时,即使尚未在 firebase 上创建电话和帐户,他仍会登录。

SetProfileActivity:

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());

        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));
                    return;
                
                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);
                                                        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)
                            .addOnSuccessListener(new OnSuccessListener<Void>() 
                                @Override
                                public void onSuccess(Void aVoid) 
                                    dialog.dismiss();
                                    Intent intent = new Intent(SetupProfileActivity.this, MainActivity.class);
                                    startActivity(intent);
                                    finish();
                                
                            );
                

            
        );
    

    @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);
    

【问题讨论】:

【参考方案1】:

由于您使用firebase-realtime-database 标记,我将假设您存储其他个人资料信息的位置。

如果是这样,您将必须:

    尝试在应用启动时读取当前用户的个人资料信息。 如果信息存在,请将它们重定向到主要活动。 如果信息不存在,将其重定向到注册页面。

【讨论】:

客气话,但你知道接受答案和支持答案的概念吗? 哎呀,很好@Yunnosch! ? 以防万一有人需要复习:What should I do when someone answers my question? 非常感谢您的回答:我遇到了 firebase auth 的另一个问题 我正在使用我的真实手机创建一个帐户并让我的 otp 确保应用程序正常运行,完成测试后我从实时火力库中删除了我的真实手机号码和与之关联的帐户,但是当我尝试创建一个具有相同编号的新帐户,即使在删除它之后我也没有收到 OTP 很难说为什么是 EIY,但请确保您还从 Firebase 身份验证中删除了用户帐户。一般来说,Firebase 文档建议使用虚构数字进行测试:firebase.google.com/docs/auth/android/…

以上是关于Android:如果用户没有完成注册,他仍然可以进入 MainActivity的主要内容,如果未能解决你的问题,请参考以下文章

如果他进入后台或在不活动几分钟后如何从 android 应用程序中注销用户

Rails 4.2 / Devise - 如果禁用cookie,则向用户显示特定消息

建议paypal的定期付款方式

Android使用token维持登陆状态的方法

应用安装时的 android GCM 注册

基于Android平台的公交线路查询系统app