如何使条款和条件仅在我首次登录 Google 时显示?

Posted

技术标签:

【中文标题】如何使条款和条件仅在我首次登录 Google 时显示?【英文标题】:How do I make the terms and conditions appear only when I log in to Google for the first time? 【发布时间】:2021-12-31 12:02:04 【问题描述】:

我想在用户使用我的应用时添加条款和条件。 但我只需要出示一次条款和条件。

我正在使用 Firebase 谷歌登录。但是当我显示条款和条件以及代码如何记住用户接受条款和条件并且只显示一次时,我遇到了问题。

这是一个谷歌登录代码。

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

    //새로운 코드다 마

    signInButton = findViewById(R.id.signInButton);

    GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    googleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this,this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
            .build();

    auth = FirebaseAuth.getInstance(); //파이어 베이스 인증 객체 초기화
    signInButton.setOnClickListener(new View.OnClickListener()  // 구글 로그인 버튼을 클릭했을때 이곳을 수행
        @Override
        public void onClick(View view) 
            Intent intent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
            startActivityForResult(intent,REQ_SIGN_GOOGLE);




        
    );




@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)  // 구글 로그인 인증을 요청했을때 결과 값을 되돌려 받는 곳
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQ_SIGN_GOOGLE) 
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if(result.isSuccess() == true)  // true 생략 가능, 인증 결과가 성공적이면
            GoogleSignInAccount account = result.getSignInAccount(); //account 라는 데이터는 구글 로그인 정보를 담고 있습니다. - 닉네임,프로필사진uri,이메일 주소등
            resultLogin(account); // 로그인 결과 값 출력 수행하라는 메서드
        
    


private void resultLogin(GoogleSignInAccount account) 

    AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    auth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) 
            if(task.isSuccessful())  //로그인이 성공했으면

                Intent intent = new Intent(getApplicationContext(),Home.class);
                startActivity(intent);

            
            else
                Toast.makeText(LoginActivity.this,"로그인 실패",Toast.LENGTH_SHORT).show();

            
        
    );


@Override
public void onBackPressed() 
    long curTime=System.currentTimeMillis();
    long gapTime=curTime-backBtnTime;

    if(0<=gapTime && 2000>= gapTime)
        moveTaskToBack(true);
        finishAndRemoveTask();
        android.os.Process.killProcess(android.os.Process.myPid());

    
    else 
        backBtnTime = curTime;
        Toast.makeText(this,"뒤로 버튼을 한 번 더 누르면 종료됩니다.",Toast.LENGTH_SHORT).show();
    



@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 


这是我要显示的代码(条款和条件)

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_terms);
    CheckBox checkBox=findViewById(R.id.checkbox);
    CheckBox checkBox2=findViewById(R.id.checkbox2);
    CheckBox checkBox3=findViewById(R.id.checkbox3);
    checkBox.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            if(checkBox.isChecked())
                checkBox2.setChecked(true);
                checkBox3.setChecked(true);

            else 
                checkBox2.setChecked(false);
                checkBox3.setChecked(false);

            
        
    );

    checkBox2.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
           
            if(checkBox.isChecked())
                checkBox.setChecked(false);
                
            else if(checkBox2.isChecked()&&checkBox3.isChecked())
                checkBox.setChecked(true);
            
        
    );

    checkBox3.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            if(checkBox.isChecked())
                checkBox.setChecked(false);
            else if(checkBox2.isChecked()&&checkBox3.isChecked())
                checkBox.setChecked(true);
            
        
    );


    Button btn_agr = findViewById(R.id.btn_agr1);
    btn_agr.setText(R.string.app_name);
    btn_agr.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            AlertDialog.Builder builder = new AlertDialog.Builder(TermsActivity.this);
           
            builder.setTitle("서비스 이용약관 ");
            
            builder.setMessage(R.string.app_name); 
           
            builder.setNegativeButton("닫기",
                    new DialogInterface.OnClickListener() 
                        public void onClick(DialogInterface dialog, int which) 
                            System.out.println(TAG + "이용약관 닫기");
                        
                    );
           
            builder.show();
        
    );


    Button btn_agr2 = findViewById(R.id.btn_agr2);
    btn_agr2.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            AlertDialog.Builder builder = new AlertDialog.Builder(TermsActivity.this);
           
            builder.setTitle("위치 정보 이용 약관 ");
            
            builder.setMessage(R.string.app_name); 
            builder.setNegativeButton("닫기",
                    new DialogInterface.OnClickListener() 
                        public void onClick(DialogInterface dialog, int which) 
                            System.out.println(TAG + "이용약관 닫기");
                        
                    );
    
            builder.show();
        
    );

    Button btn_complete = findViewById(R.id.button_complete);
    btn_complete.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 


        
    );



当用户接受条款和条件但当用户重新打开应用程序时,我尝试了我的自我传输变量,用户必须再次打开它 也许有一种方法可以将某些变量传输到 firebase 并在用户单击登录按钮时进行确认??

【问题讨论】:

【参考方案1】:

有没有办法将某些变量传输到firebase并在用户单击登录按钮时确认?

最简单的解决方案是在 Task 对象上调用 AuthResult#getAdditionalUserInfo() 方法,因为它返回 AdditionalUserInfo 类型的对象。在这个类中,你可以找到一个非常有用的方法,叫做isNewUser(),它可以帮助你检查用户是否是第一次登录。在代码中应该是这样的:

AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
auth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) 
        if(task.isSuccessful())  //로그인이 성공했으면

            boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
            if (isNewUser) 
                //Display Terms & Conditions
            

            Intent intent = new Intent(getApplicationContext(),Home.class);
            startActivity(intent);

        
        else
            Toast.makeText(LoginActivity.this,"로그인 실패",Toast.LENGTH_SHORT).show();

        
    
);

【讨论】:

谢谢!!!!!!

以上是关于如何使条款和条件仅在我首次登录 Google 时显示?的主要内容,如果未能解决你的问题,请参考以下文章

keycloak-connect nodejs / meteor - 仅在首次登录时拒绝访问且仅在 prod

AWS Amplify/Cognito - 一种仅在用户首次登录时设置 TOTP MFA 的方法

如何仅在初始启动时显示屏幕

如何使 jqgrid 仅在我们搜索时有效(显示数据)?

首次登录时创建教程

首次登录/导航后,Angular 6 样式无法正确加载