私はかなりの時間ソリューションを検索しようとしていましたが、無駄です。私は明らかにFirebaseの専門家ではなく、コード作成方法を学んでいます。Firebase Realtime Databaseのlong値は、0以外の場合でも常に0を返します。
私は現在、Firebaseが提供する電子メール検証システムの上に、手動で自分で行う必要がある認証の別の層があるログインシステムを作成しています。したがって、これを達成するために、私は自分のプロジェクトにFirebase Realtime Databaseを導入しました。次に、データベース内のJSONファイルのスニペットを示します。
{
"users" : {
"abfkbnqeiurbnafjbnaojn" : {
"app_authorized" : 1,
"email" : "[email protected]",
"full_name" : "Test Sample",
"user_id" : "abfkbnqeiurbnafjbnaojn"
}
}
}
あなたはJSONファイルから見ることができるように、app_authorizedキーと値のペアは、ユーザーがサインインできるかどうかを支配するが(0が1ユーザーが署名する資格があることを意味している間、ユーザーは対象外であることを意味し-に)。私はFirebaseのサインインからユーザーのUIDを使用して、すべてのキーと値のペアについて、親の電子メールとパスワードシステムを使用しています。 app_authorizedの値の型が長いことも知っています。
私のSignInActivityで使用したコードは次のとおりです。
long isAppAuthorized;
//some codes here
private void init() {
btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: attempting to log in");
String email = emailEditText.getText().toString();
String password = passwordEditText.getText().toString();
//validates respective EditTexts
if (TextUtils.isEmpty(email)) {
emailEditText.setError("Please fill in your e-mail address!");
}
else if (TextUtils.isEmpty(password)) {
passwordEditText.setError("Please fill in your password!");
} else {
progressDialog.show();
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(SignInActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful());
FirebaseUser user = mAuth.getCurrentUser();
firebaseDatabase = FirebaseDatabase.getInstance();
userID = user.getUid();
final DatabaseReference myRef = firebaseDatabase.getReference("users/" + userID + "/app_authorized");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//gets value of isAppAuthorized
isAppAuthorized = dataSnapshot.getValue(long.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithEmail:failed", task.getException());
Toast.makeText(SignInActivity.this, R.string.auth_failed,
Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
} else {
try {
//this is the part where I check for both isEmailVerified and isAppAuthorized
if(user.isEmailVerified() && isAppAuthorized == 1) {
Log.d(TAG, "onComplete: success. e-mail is verified " + user.isEmailVerified() + " userIsAuthorized: " + isAppAuthorized);
Intent intent = new Intent(SignInActivity.this, HomeActivity.class);
startActivity(intent);
} else {
Log.d(TAG, "onComplete: failed: isEmailVerified: " + user.isEmailVerified() + " userIsAuthorized: " + isAppAuthorized);
progressDialog.dismiss();
mAuth.signOut();
Intent intent = new Intent(SignInActivity.this, MainActivity.class);
startActivity(intent);
}
} catch(NullPointerException e) {
Log.e(TAG, "onComplete: NullPointerException: " + e.getMessage());
}
}
// ...
}
});
}
}
});
}
私が遭遇した問題は、長いisAppAuthorizedは関係なく、常に私は無用の承認の私の第二の層をレンダリング、このように、データベースに入れてどのような値の0を返すということです。
私は多くのことを試しても問題の原因を理解することができないので、誰かが私を助けてくれることを願っています。
'isAppAuthorized = dataSnapshot.getValue(Long.class)を試してみてください;' – Tarun
これは私が資本Lでロングに変数宣言とlong.classの両方を変更した後、(それが戻って働いていましたしかし、NullExceptionエラー)。長いのではなくロングを使わなければならない理由はありますか? – applejuice
longはオブジェクトへの参照で、longはプリミティブです。 – Tarun