2016-09-26 9 views
11

Tworzę aplikację dla systemu Android i obecnie próbuję implementować uwierzytelnianie użytkownika za pomocą Firebase. O ile wiem, moja aplikacja jest połączona z serwerem Firebase.Inicjowanie FirebaseApp pomimo wywołania funkcji FirebaseApp.initializeApp() w klasie Application

Występuje błąd runtime podczas próby przełączenia z działania SignIn do działania SignUp za pomocą przycisku naciśnij. Aplikacja ulega awarii i pojawia się błąd runtime.

O ile mogę powiedzieć, błąd Runtime jest z działalności zarejestruj za onCreate() rozmowy gdy próbuję zainicjować FirebaseAuth obiekt z FirebaseAuth.getInstance(). Wezwanie to nie ze względu na

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process seniordesign.phoneafriend. Make sure to call FirebaseApp.initializeApp(Context). 

jednak robię to wezwanie w mojej klasie Application onCreate() metody, które myślałem, że będzie dobrze. Dodałem wywołanie initalizeApp() do wywołania SignUp onCreate(), ale nie ma kości. Szukałem innych z tym problemem, ale nie znaleźliśmy czegoś podobnego. Dzięki za pomoc.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="seniordesign.phoneafriend"> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     android:name="seniordesign.phoneafriend.PhoneAFriend"> 
     <activity android:name=".SignIn"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".SignUp"></activity> 
    </application> 

</manifest> 

PhoneAFriend.java (moja klasa Application)

public class PhoneAFriend extends Application { 

    public void onCreate(){ 
     super.onCreate(); 
     Firebase.setAndroidContext(this); 
     FirebaseApp.initializeApp(this); 
    } 
} 

SignUp.java

public class SignUp extends AppCompatActivity { 
    protected Firebase ref; 
    protected EditText emailText; 
    protected EditText passText; 
    protected EditText confirmText; 
    protected Button button; 
    protected SignUp thisContext; 

    protected FirebaseAuth auth; 
    protected FirebaseAuth.AuthStateListener authListener; 
    private View.OnClickListener onClickListener; 

    public static Intent intent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_signup); 
     ref = new Firebase("https://phoneafriend-7fb6b.firebaseio.com"); 
     emailText = (EditText) findViewById(R.id.signup_emailText); 
     passText = (EditText) findViewById(R.id.signup_passwordText); 
     confirmText = (EditText) findViewById(R.id.signup_passwordConfirm); 
     intent = new Intent(this, SignIn.class); 
     //Tried this already 
     //FirebaseApp.initializeApp(this); 
     auth = FirebaseAuth.getInstance(); 


     button = (Button) findViewById(R.id.signup_button); 
     onClickListener = new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       createUser(view); 
       Log.v("SignUp Button" , "Clicked; Attempting to create user"); 
      } 
     }; 
     button.setOnClickListener(onClickListener); 

     authListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
        Log.d("FirebaseAuth", "onAuthStateChanged:signed_in:" + user.getUid()); 
       } else { 
        // User is signed out 
        Log.d("FirebaseAuth", "onAuthStateChanged:signed_out"); 
       } 
       // ... 
      } 
     }; 
     thisContext = this; 

    } 
    @Override 
    public void onStart(){ 
     super.onStart(); 
     //auth.addAuthStateListener(authListener); 
    } 

    @Override 
    public void onStop(){ 
     super.onStop(); 
     if(authListener != null) { 
      //auth.removeAuthStateListener(authListener); 
     } 
    } 

    protected void createUser(View view){ 
     String cString = null; 
     String pString = null; 
     String eString = emailText.getText().toString(); 
     if(passText.getText() != null && confirmText.getText() != null) { 
      pString = passText.getText().toString(); 
      cString = confirmText.getText().toString(); 
      Log.v("SignUP: Pass Null check" , "Pass"); 
      if (emailText.getText() != null && pString.equals(cString) && passText.getText() != null) { 
       Log.v("SignUP: Sign up check " , "Pass"); 
       auth.createUserWithEmailAndPassword(emailText.getText().toString() , passText.getText().toString()) 
         .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
          @Override 
          public void onComplete(@NonNull Task<AuthResult> task) { 
           Log.v("createUser complete" , "status: " + task.isSuccessful()); 
           if(task.isSuccessful()){ 
            startActivity(SignUp.intent); 
           } 
          } 

         }); 

      } 
     } 

     return; 
    } 
} 
+0

Miksujesz połączenia API ze starszej wersji 2.x.x. SDK z nowym pakietem SDK 9.x.x, nie są kompatybilne. Powinieneś używać tylko nowego SDK. Zobacz tę odpowiedź: http://stackoverflow.com/a/39321686/4815718 –

Odpowiedz

5

Podobnie jak qbix stwierdził pan dużo użyć wywołania API od którejkolwiek wersji, z której będziesz korzystać. Jeśli to możliwe, powinieneś użyć nowszego API, ponieważ z pewnością będzie on wspierany znacznie później.

Zobacz docs tutaj:

https://firebase.google.com/docs/database/android/start/

Usuń:

Firebase.setAndroidContext(this); 
FirebaseApp.initializeApp(this); 

I umieścić:

FirebaseDatabase database = FirebaseDatabase.getInstance(); 

Jeśli qbix umieszcza swój komentarz do odpowiedzi, należy zaakceptować jego raczej niż moje widzenie ma to, jak mnie pokonał o kilka minut.

również:

Jeśli przy użyciu starego Firebase i potrzebują pomocy przełączanie, ten poradnik jest na miejscu i pomoże w przełączniku. To dość prosty przełącznik.

https://firebase.google.com/support/guides/firebase-android

+0

'classpath 'com.google.gms: google-services: 3.0.0'' dla gradle projektu. 'compile 'com.google.android.gms: play-services: 9.8.0' skompiluj 'com.google.firebase: firebase-core: 9.8.0'' dla aplikacji, ale wciąż dostaję problem. Dowolny pomysł? – Si8

+0

powyższy komentarz rozwiązuje ten problem –

8

wiem, że jest już akceptowane odpowiedź. Jednak wystąpił ten sam komunikat o błędzie: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process (name). Make sure to call FirebaseApp.initializeApp(Context). Próbowałem kilku rozwiązań znalezionych w SO i dwukrotnie sprawdzałem wszystko, aż w końcu znalazłem, że nazwa pakietu zdefiniowana w konsoli Firebase nie jest zgodna z nazwą pakietu zdefiniowaną w moim manifeście plik.

Spróbuj przejść do konsoli Firebase -> Ustawienia projektu -> sprawdź, czy nazwy pakietów pasują do siebie.

Nadzieja może pomóc niektórym :)

0

Łatwiej jest użyć Firebase kreatora, który znajduje się w Android Studio: dodaje wszystkie zależności w Gradle plików, tworzy projekt Firebase razie potrzeby , łączy aplikację z projektem itp.

W Android Studio otwórz menu Narzędzia/Firebase i postępuj zgodnie z instrukcjami.

Następnie FirebaseApp.initializeApp() zwróci prawidłową wartość.

+1

Z wyjątkiem niektórych z nas używających rzeczy takich jak Xamarin, więc nie ma czegoś takiego jak kreator firebase. –

Powiązane problemy