0

私が働いているアプリは、アプリが開かれたときにFirebaseを使ってログインするように促すプロンプトです。アプリが完全に閉じられている場合、アプリを開くとログイン画面が表示されます。しかし、私が働く会社の従業員の多くは、アプリケーションを終了しないで、単にバックグラウンドに送信します。それは問題です。なぜなら、自分のアカウントを削除しても即座にそれらを蹴るわけではないからです。彼らは一度彼らがアプリケーションを閉じると、それらをキックアウトします。前回のアクションが完了するまでのアンドロイドの遅延アクション

これを修正するために、私は本質的にページがリロードされるたびに、フォアグラウンドに来るか、別のアクティビティから家に帰るか、またはアプリケーションを再起動するかを指定して、ユーザーをバックグラウンドでログアウトさせるそれらを再ログします。その時点で、ユーザーアカウントの有効性がチェックされます。

この最終目標は、有効なログインがまだある場合は影響を受けませんが、無効なログインがある場合は、アプリが完全にシャットダウンされていなくてもロックアウトされます。

しかし、現在、有効なログインが既に入力されていても、アプリはユーザーをログイン画面に戻します。主な活動(ログイン画面)用

コード:ホーム画面用

package com.priceelectric.xriley.priceprefab; 

import android.app.Application; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.auth.AuthResult; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 

public class MainActivity extends AppCompatActivity { 

    private FirebaseAuth.AuthStateListener mAuthListener; 

    private FirebaseAuth mAuth; 

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

     final SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE); 
     final SharedPreferences.Editor mEditor = prefs.edit(); 

     mAuth = FirebaseAuth.getInstance(); 

     FirebaseAuth.getInstance().signOut(); 

     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if(user != null){ 
        Log.d("loginTag", "onAuthStateChanged:signed_in:" + user.getUid()); 

        Context context = getApplicationContext(); 

        final Intent returnHome = new Intent(); 
        returnHome.setClass(context, Home_Screen.class); 
        startActivity(returnHome); 



       } 
       else{ 
        Log.d("loginTag", "onAuthStateChanged:signed_out"); 
       } 

      } 
     }; 

     final EditText usernameTextBox = (EditText) findViewById(R.id.usernameTextBox); 
     final EditText passwordTextBox = (EditText) findViewById(R.id.passwordTextBox); 

     usernameTextBox.setText(prefs.getString("username", "")); 
     passwordTextBox.setText(prefs.getString("password", "")); 

     final Button login = (Button) findViewById(R.id.loginButton); 
     assert login != null; 

     login.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       mEditor.putString("username", usernameTextBox.getText().toString()); 
       mEditor.putString("password", passwordTextBox.getText().toString()); 
       mEditor.commit(); 

       prefs.getInt("thing", 0); 

       final String email = usernameTextBox.getText().toString(); 
       final String password = passwordTextBox.getText().toString(); 
//    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
//    final String uid = user.getUid(); 
//    final SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE); 
//    final SharedPreferences.Editor mEditor = prefs.edit(); 
       mAuth.signInWithEmailAndPassword(email, password) 
         .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() { 
          @Override 
          public void onComplete(@NonNull Task<AuthResult> task) { 

           Log.d("loginTag", "signInWithEmail:onComplete:" + task.isSuccessful()); 

           if(!task.isSuccessful()){ 
            Log.w("loginTag", "signInWithEmail:failed", task.getException()); 
           } 
          } 
         }); 

      } 
     }); 

    } 

    @Override 
    public void onStart(){ 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
    } 

    @Override 
    public void onStop(){ 
     super.onStop(); 
     if(mAuthListener != null){ 
      mAuth.removeAuthStateListener(mAuthListener); 
     } 
    } 

    @Override 
    public void onBackPressed(){ 
     Context context = getApplicationContext(); 
     CharSequence notificationText = "You need to log in."; 
     int duration = Toast.LENGTH_LONG; 

     Toast.makeText(context, notificationText, duration).show(); 
    } 

} 

コード:

package com.priceelectric.xriley.priceprefab; 

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 

public class Home_Screen extends AppCompatActivity { 

    private FirebaseAuth mAuth; 

    FirebaseUser user; 

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

     final Button paperworkButton = (Button) findViewById(R.id.paperworkButton); 

     mAuth = FirebaseAuth.getInstance(); 

     final TextView versionLabel = (TextView) findViewById(R.id.versionLabel); 

     SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE); 

     FirebaseAuth.getInstance().signOut(); 

     mAuth.signInWithEmailAndPassword(prefs.getString("username", ""), prefs.getString("password", "")); 

     user = FirebaseAuth.getInstance().getCurrentUser(); 

     if(user != null){ 
      //all good 
     } 
     else{ 
      Context context = getApplicationContext(); 
      CharSequence notificationText = "You need to log in."; 
      int duration = Toast.LENGTH_LONG; 

      Toast.makeText(context, notificationText, duration).show(); 

      final Intent loginScreen = new Intent(); 
      loginScreen.setClass(this, MainActivity.class); 
      startActivity(loginScreen); 
     } 

     if(prefs.getString("yourName", "").equals("")){ 
      final Intent settingsScreen = new Intent(); 
      settingsScreen.setClass(this, Settings_Screen.class); 
      startActivity(settingsScreen); 
     } 
    } 

    public void buttonOnClick(View view){ 

     SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE); 

     switch(view.getId()){ 
      case R.id.prefabOrderButton: 
       SharedPreferences.Editor mEditor = prefs.edit(); 
       mEditor.putInt("itemNumberCounter", 0); 
       mEditor.commit(); 

       final Intent prefabScreen = new Intent(); 
       prefabScreen.setClass(this, Prefab_Order.class); 
       startActivity(prefabScreen); 
       break; 
      case R.id.safetyFormButton: 
       final Intent safetyReportScreen = new Intent(); 
       safetyReportScreen.setClass(this, Safety_Report.class); 
       startActivity(safetyReportScreen); 
       break; 
      case R.id.resiPanelButton: 
       final Intent resiPanelScreen = new Intent(); 
       resiPanelScreen.setClass(this, Resi_Panel_Builder.class); 
       startActivity(resiPanelScreen); 
       break; 
      case R.id.onlineResourcesButton: 
       final Intent onlineResourcesScreen = new Intent(); 
       onlineResourcesScreen.setClass(this, Online_Resources.class); 
       startActivity(onlineResourcesScreen); 
       break; 
      case R.id.settingsButton: 
       final Intent settingsScreen = new Intent(); 
       settingsScreen.setClass(this, Settings_Screen.class); 
       startActivity(settingsScreen); 
       break; 
      case R.id.paperworkButton: 
       final Intent paperworkScreen = new Intent(); 
       paperworkScreen.setClass(this, Paperwork_Orders.class); 
       startActivity(paperworkScreen); 
       break; 
     } 
    } 

    @Override 
    public void onBackPressed(){ 
     //do nothing 
    } 
} 

提案をいただければ幸いです。

答えて

0

MainActivityにあるものと同様のsignInWithEmailAndPassword()に完了リスナーを追加すると、Home_Screenのアクティビティでは、より良い結果が得られるはずです。既存のコードで

mAuth.signInWithEmailAndPassword(prefs.getString("username", ""), prefs.getString("password", "")); 

    user = FirebaseAuth.getInstance().getCurrentUser(); 

    if(user != null){ 
     //all good 
    } 

あなたがサインインする前に、現在のユーザーを要求しているが完了しているので、userはnullです。

完了リスナーを追加してトーストを生成するコードを移動し、task.isSuccessful()がfalseのときに実行してMainActivityを起動します。

また、ログアウト/サインインを使用してユーザーアカウントが有効かどうかをテストする代わりに、FirebaseUser.reload()を試してみることもできます。現在のユーザーアカウントが無効になっているか、または削除されている場合、ドキュメントは失敗結果を返すことを示しています。

reload()のステータスを取得するために完了リスナーを使用します。

user.reload().addOnCompleteListener(new OnCompleteListener<Void>() { 
    @Override 
    public void onComplete(@NonNull Task<Void> task) { 
     if (task.isSuccessful()) { 
      // account is still valid 
     } else { 
      // account is no longer valid 
     } 
    } 
}); 
+0

私はリロード()コマンドと状態変化のリスナーを追加しますが、リロードは()リスナーをトリガしていないようです。 – Xander

+0

私の答えは 'reload()'の使い方を示すように更新されました。 –

関連する問題