2017-10-29 11 views
-3

次のSignUpアクティビティが正常に動作しません:ユーザが確認メールを受信して​​サインインしようとすると、NullPointerException Firebase Realtime Databaseの新しいユーザエントリは作成されません。私は、デバッグ中に、generateUser()が定義されているところにブレークポイントを設定すると、新しいデータベースエントリが作成されていることに気付きました(ただし、アプリケーションは同じ方法でクラッシュします)。Firebaseデータベースのエントリは、Androidスタジオでブレークポイントが設定されている場合にのみ作成されます

解決策は何ですか?

ご協力いただければ幸いです。

更新:ここでの強調点は、NullPointerExceptionではなく、私はそれを処理できます。問題はgenerateUser()が呼び出されない理由です。

public class SignUpActivity extends AppCompatActivity { 

    private EditText inputUsername, inputEmail, inputPassword; 
    private Button btnSignIn, btnSignUp; 
    private ProgressBar progressBar; 
    private FirebaseAuth auth; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

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

     if (user != null) { 
      if (user.isEmailVerified()) { 
       startActivity(new Intent(SignUpActivity.this, MainActivity.class)); 
       finish(); 
      } 
     } 

     setContentView(R.layout.activity_sign_up); 

     btnSignIn = findViewById(R.id.sign_in_button); 
     btnSignUp = findViewById(R.id.sign_up_button); 
     inputUsername = findViewById(R.id.username); 
     inputEmail = findViewById(R.id.email); 
     inputPassword = findViewById(R.id.password); 
     progressBar = findViewById(R.id.progressBar); 

     btnSignIn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(SignUpActivity.this, SignInActivity.class)); 
      } 
     }); 

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

       final String username = inputUsername.getText().toString().trim(); 
       final String email = inputEmail.getText().toString().trim(); 
       final String password = inputPassword.getText().toString().trim(); 

       if (TextUtils.isEmpty(username)) { 
        Toast.makeText(getApplicationContext(), "Enter username!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (TextUtils.isEmpty(email)) { 
        Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (TextUtils.isEmpty(password)) { 
        Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (password.length() < 6) { 
        Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       progressBar.setVisibility(View.VISIBLE); 

       auth.createUserWithEmailAndPassword(email, password) 
         .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() { 
          @Override 
          public void onComplete(@NonNull Task<AuthResult> task) { 
           progressBar.setVisibility(View.GONE); 
           if (!task.isSuccessful()) { 
            Toast.makeText(SignUpActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); 
           } else { 
            new GenerateUserAsyncTask().execute(username, email, password, 0); 
           } 
          } 
         }); 
      } 

      class GenerateUserAsyncTask extends AsyncTask<Object, Void, Void> { 

       @Override 
       protected Void doInBackground(Object... params) { 
        String username = (String) params[0]; 
        String email = (String) params[1]; 
        String password = (String) params[2]; 
        int score = (int) params[3]; 
        generateUser(username, email, password, score); 
        return null; 
       } 

       @Override 
       protected void onPostExecute(Void result) { 
        sendVerificationEmail(); 
       }} 
     }); 

    } 

    public void sendVerificationEmail() { 
     FirebaseUser user = auth.getCurrentUser(); 

     if (user != null) { 
      user.sendEmailVerification() 
        .addOnCompleteListener(new OnCompleteListener<Void>() { 
         @Override 
         public void onComplete(@NonNull Task<Void> task) { 
          if (task.isSuccessful()) { 
           Toast.makeText(SignUpActivity.this, "Signup successful, verification email sent", Toast.LENGTH_SHORT).show(); 
           auth.signOut(); 
           startActivity(new Intent(SignUpActivity.this, SignInActivity.class)); 
           finish(); 
          } else { 
           Toast.makeText(SignUpActivity.this, "Failed to send email!", Toast.LENGTH_SHORT).show(); 
          } 
          progressBar.setVisibility(View.GONE); 
         } 
        }); 
     } 

    } 

    public void generateUser(String username, String email, String password, int score) { 
     FirebaseDatabase database = Utils.getDatabase(); 
     DatabaseReference users = database.getReference("users"); 
     User user = new User(username, email, password, score); 
     users.child(auth.getUid()).setValue(user); 
    } 
} 
+0

[NullPointerExceptionとは何ですか?また修正するにはどうすればいいですか?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) –

+0

申し訳ありませんが、リンクされたトピックで私の問題がどのように説明されているのか分かりません。 –

答えて

0

解決策が見つかりました。この問題は、Realtime Databaseのセキュリティルールによって発生します。ユーザーは、認証された場合にのみデータベースに書き込むことができます。しかし、私のコードでは、generateUser()が呼ばれたところで、ユーザーはまだ完全に認証されていません。だから、の後にの後に、ユーザーが確認メールのリンクをクリックした後に、データベースに新しいエントリを生成する必要があります。

関連する問題