I am creating mobile app using Firebase Realtime Database and getting the following error after several requests:
08-26 19:59:46.406 2252-2307/com.google.android.gms I/AuthChimeraService: Error description received from server: {
"error": {
"errors": [
"domain": "global",
"reason": "invalid",
"message": "TOO_MANY_ATTEMPTS_TRY_LATER"
"code": 400,
"message": "TOO_MANY_ATTEMPTS_TRY_LATER"
public class FirebaseRDBConnection implements FRDBConnectionStateListener{
private static FirebaseRDBConnection sInstance;
FirebaseAuth mAuth;
FirebaseDatabase mDatabase;
private FirebaseRDBConnection(){
mDatabase = FirebaseDatabase.getInstance();
}
public static FirebaseRDBConnection getInstance(){
if(sInstance == null)
sInstance = new FirebaseRDBConnection();
return sInstance;
}
boolean mIsConnected;
private void setConnectionState(boolean isConnected){
if(isConnected == mIsConnected) return;
mIsConnected = isConnected;
if(mIsConnected)
onConnected();
else
onUnreachable();
}
public void signIn(){
if(mAuth == null) mAuth = FirebaseAuth.getInstance();
if(mAuth.getCurrentUser() == null){
mAuth.signInAnonymously().addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(mAuth.getCurrentUser() != null)
setConnectionState(true);
else
setConnectionState(false);
}
});
}
}
public void signOut(){
if(mAuth != null && mAuth.getCurrentUser() != null){
mAuth.signOut();
setConnectionState(false);
}
}
public boolean isConnected(){
return mIsConnected;
}
RequestOnSignIn mRequestOnSignIn;
public void requestData(String path, String startAt, String endAt, FRDBOrdering orderBy, String equalTo){
if (mIsConnected){
onRequesting(path, startAt, endAt, orderBy, equalTo);
}
else{
mRequestOnSignIn = new RequestOnSignIn(path, startAt, endAt, orderBy, equalTo);
mAuth.signInAnonymously().addOnCompleteListener(mRequestOnSignIn);
}
}
class RequestOnSignIn implements OnCompleteListener{
String mPath, mStartAt, mEndAt, mEqualTo;
FRDBOrdering mOrdering;
public RequestOnSignIn(String path, String startAt, String endAt, FRDBOrdering orderBy, String equalTo) {
mPath = path;
mStartAt = startAt;
mEndAt = endAt;
mOrdering = orderBy;
mEqualTo = equalTo;
}
@Override
public void onComplete(@NonNull Task task) {
if(mAuth.getCurrentUser() != null){
setConnectionState(true);
onRequesting(mPath, mStartAt, mEndAt, mOrdering, mEqualTo);
}
else{
setConnectionState(false);
}
}
}
@Override
public void onRequesting(
String path,
String startAtStr,
String endAtStr,
FRDBOrdering orderBy,
String equalToStr
) {
ValueEventListener valueEventListener = new RoutedValueEventListener(path);
if(!mRequestsMap.containsKey(path))
mRequestsMap.put(path, new ArrayList<ValueEventListener>());
mRequestsMap.get(path).add(valueEventListener);
Query q = mDatabase.getReference().child(path);
switch (orderBy){
case Key:
q = q.orderByKey();
break;
case Value:
q = q.orderByValue();
break;
}
if(startAtStr != null) q = q.startAt(startAtStr);
if(endAtStr != null) q = q.endAt(endAtStr);
if(equalToStr != null) q = q.equalTo(equalToStr);
q.addListenerForSingleValueEvent(valueEventListener);
if(mIsWaitingForReplies) return;
for(FRDBConnectionStateListener listener:mStateListeners)
listener.onRequesting(path, startAtStr, endAtStr, orderBy, equalToStr);
mIsWaitingForReplies = true;
}
// ....
}
I may guess that the issue caused by multiple authentication calls. But I suppose that the call of FirebaseAuth.getInstance()
returns the same instance each time in accordance to the Singleton pattern. My class is a singleton as well and its
lifecycle matches to app's.
Therefore I can't find any reason for this error.
Thanks for any help!