android-onPostInitComplete每次调用getRemoteService只能调用一次
我正在构建一个android应用程序,它使用firebase身份验证来登录用户。起初,一切正常,直到几天前,我更新了Android SDK并在我的设备上运行应用程序后尝试登录 先谢谢你 这是我的密码:android-onPostInitComplete每次调用getRemoteService只能调用一次,android,firebase,firebase-authentication,Android,Firebase,Firebase Authentication,我正在构建一个android应用程序,它使用firebase身份验证来登录用户。起初,一切正常,直到几天前,我更新了Android SDK并在我的设备上运行应用程序后尝试登录 先谢谢你 这是我的密码: import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import an
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.client.Firebase;
import com.firebase.client.Query;
import com.firebase.client.annotations.NotNull;
import com.firebase.simplelogin.FirebaseSimpleLoginError;
import com.firebase.simplelogin.FirebaseSimpleLoginUser;
import com.firebase.simplelogin.SimpleLogin;
import com.firebase.simplelogin.SimpleLoginAuthenticatedHandler;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInApi;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.ResultCallbacks;
import com.google.android.gms.common.api.Status;
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.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import android.Manifest;
public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
RelativeLayout loginBtn;
private static final String TAG = "LoginActivity";
TextView tv;
private static final int REQUEST_CODE = 9001;
protected EditText loginEmail, loginPassw;
FirebaseAuth mFirebaseAuth;
Firebase ref;
private static final int SIGN_IN = 9001;
DatabaseReference mDatabase;
public static String userName = "";
private Button signupBtn;
ProgressDialog pDialog;
public static GoogleApiClient googleClient;
//This will be places above the oncreate method
@Override
public void onRequestPermissionsResult(int requestCode, String[] permision, int[] grantRequest){
if(requestCode == REQUEST_CODE){
if(grantRequest[0] == PackageManager.PERMISSION_GRANTED){
ref = new Firebase(Constants.FIREBASE_URI);
mFirebaseAuth = FirebaseAuth.getInstance();
}else{
Toast.makeText(getApplicationContext(), "PERMISSION IS NOT GRANTED...", Toast.LENGTH_LONG).show();
}
}
else{
super.onRequestPermissionsResult(requestCode, permision, grantRequest);
}
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.login_page);
Firebase.setAndroidContext(this);
FirebaseDatabase database = FirebaseDatabase.getInstance();
mDatabase = database.getReference(Constants.USERS);
if(Build.VERSION.SDK_INT >= 23){
if(checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED){
//Do the needful
ref = new Firebase(Constants.FIREBASE_URI);
mFirebaseAuth = FirebaseAuth.getInstance();
}
else{
//Permission not granted
Toast.makeText(getApplicationContext(), "Permission is not granted", Toast.LENGTH_LONG).show();
requestPermissions(new String[]{Manifest.permission.INTERNET}, REQUEST_CODE);
}
}else {
ref = new Firebase(Constants.FIREBASE_URI);
mFirebaseAuth = FirebaseAuth.getInstance();
}
loginEmail = (EditText)findViewById(R.id.log_user);
loginPassw = (EditText)findViewById(R.id.log_passw);
loginBtn = (RelativeLayout)findViewById(R.id.logit);
SimpleLogin authClient = new SimpleLogin(ref, getApplicationContext());
SignInButton b = (SignInButton)findViewById(R.id.googlebtn);
signupBtn = (Button)findViewById(R.id.signup);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
googleClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
//This snippet will be placed in between oncreate method
tv = (TextView)findViewById(R.id.idtext);
signupBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
signUp();
}
});
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn();
}
});
loginBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
TextView btnText = (TextView)findViewById(R.id.btnText);
if(btnText.getTextColors().equals("#fff")){
Toast.makeText(getApplicationContext(), "votw", Toast.LENGTH_LONG).show();
}
String logInEmailField = loginEmail.getText().toString();
String passField = loginPassw.getText().toString();
if(logInEmailField.isEmpty() || passField.isEmpty()){
errorLogin();
}else{
loader();
noError(logInEmailField, passField);
}
}
});
ActionBar ac = getSupportActionBar();
if(ac != null) {
ac.hide();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == SIGN_IN){
GoogleSignInResult gsr = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleResult(gsr);
}
}
public void handleResult(GoogleSignInResult result){
Log.d(TAG, "" + result.isSuccess());
if(result.isSuccess()){
dismissProgress();
GoogleSignInAccount gsA = result.getSignInAccount();
userName = gsA.getDisplayName();
setUserFullname(userName);
Intent i = new Intent(this, MainActivity.class);
//i.putExtra(Constants.PASS_PROFILE, name);
i.putExtra(Constants.PASS_PROFILE, true);
startActivity(i);
}else{
}
}
private void setUserFullname(String name){
SharedPreferences sPref = getSharedPreferences("PASS", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sPref.edit();
edit.putString("passer", name);
edit.apply();
}
private void errorLogin(){
AlertDialog.Builder errorDialog = new AlertDialog.Builder(LoginActivity.this);
errorDialog.setMessage(R.string.emptyField)
.setTitle(R.string.errTitle)
.setPositiveButton(android.R.string.ok, null);
AlertDialog dialog = errorDialog.create();
dialog.show();
}
ProgressDialog progress;
private void noError(String email, String passw) {
User user = new User();
mFirebaseAuth.signInWithEmailAndPassword(email, passw).addOnCompleteListener(LoginActivity.this,
new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
dismissProgress();
Intent i = new Intent(LoginActivity.this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
} else if (!task.isSuccessful()){
dismissProgress();
AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this)
.setMessage(task.getException().getMessage())
.setTitle(R.string.errTitle)
.setPositiveButton(android.R.string.ok, null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
}
private void loader(){
pDialog = new ProgressDialog(this);
pDialog.setProgress(1000);
pDialog.setMessage("Please wait");
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.show();
}
private void dismissProgress(){
pDialog.dismiss();
pDialog.dismiss();
}
private void errAlert(String signUpErr){
AlertDialog.Builder builder = new AlertDialog.Builder(this)
.setMessage(signUpErr)
.setTitle("Login Error")
.setPositiveButton(android.R.string.ok, null);
AlertDialog alert = builder.create();
alert.show();
}
public void signUp(){
startActivity(new Intent(this, SignUpActivity.class));
}
public void signIn(){
loader();
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleClient);
startActivityForResult(signInIntent, SIGN_IN);
}
@Override
public void onConnectionFailed(ConnectionResult errorResul){
Log.d(TAG, "connetionFailed" + errorResul);
}
}
我也面临类似的错误。我正在使用getReference(“.info/connected”)跟踪firebase连接状态 上面的监听器被频繁调用,connected的值可以是true,也可以是false。当我检查logcat时,有以下错误
/? E/AsyncOperation: serviceID=16, operation=ValidateAuthServiceOperation
java.lang.NullPointerException: onPostInitComplete can be called only once per call to getRemoteService
at iri.a(:com.google.android.gms:74)
at ioj.a(:com.google.android.gms:987)
at ipf.a(:com.google.android.gms:66)
at ixg.a(:com.google.android.gms:284)
at eks.a(:com.google.android.gms:125)
at eks.a(:com.google.android.gms:113)
at ixn.run(:com.google.android.gms:113)
at jaq.run(:com.google.android.gms:450)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at jew.run(:com.google.android.gms:17)
at java.lang.Thread.run(Thread.java:848)
我认为由于这个错误,firebase连接经常丢失和恢复,这就是为什么firebase数据库代码不起作用的原因。我终于找到了解决方案,这是我的错误。问题是我限制了我设备的背景数据。启用它并尝试再次登录后,它会工作。说真的,这不应该是回答,而应该是评论。我想我已经找到了解决方案,一旦我确认了,我会将答案粘贴到这里。@DevMike很抱歉在答案中发布了这个。我刚刚开始使用stackoverflow。下次我会记得的。
private ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
}
/? E/AsyncOperation: serviceID=16, operation=ValidateAuthServiceOperation
java.lang.NullPointerException: onPostInitComplete can be called only once per call to getRemoteService
at iri.a(:com.google.android.gms:74)
at ioj.a(:com.google.android.gms:987)
at ipf.a(:com.google.android.gms:66)
at ixg.a(:com.google.android.gms:284)
at eks.a(:com.google.android.gms:125)
at eks.a(:com.google.android.gms:113)
at ixn.run(:com.google.android.gms:113)
at jaq.run(:com.google.android.gms:450)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at jew.run(:com.google.android.gms:17)
at java.lang.Thread.run(Thread.java:848)