2017-12-12 4 views
2

Ich habe meinem Android-Projekt Firebase hinzugefügt, um Firebase Cloud Messaging zu verwenden. Ich folgte der documentation und ich fand keine Anweisung zum Anruf FirebaseApp.initializeApp().Muss FirebaseApp.initializeApp() aufgerufen werden, um Firebase zu initialisieren?

Meine App funktioniert gut, außer einmal mit dem folgenden Fehler abgestürzt.

Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.my.app. Make sure to call FirebaseApp.initializeApp(Context) first. 
at com.google.firebase.FirebaseApp.getInstance(Unknown Source) 
at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source) 
at com.my.app.core.ApplicationEx.onCreate(ApplicationEx.java:79) 

Als ich für den Fehler gesucht, die resolution gegeben ist FirebaseApp.initializeApp() beim Start zu nennen.

Ich frage mich, ob das wirklich notwendig ist, da die Dokumentation es nicht erwähnt und meine App funktioniert (meistens) gut ohne es.

Weiß jemand, ob der Aufruf von FirebaseApp.initializeApp() wirklich notwendig ist, und was sonst hätte den oben erwähnten Fehler verursachen können?

Es folgt mein build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 26 
    defaultConfig { 
     applicationId "com.my.app" 
     minSdkVersion 17 
     targetSdkVersion 26 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     multiDexEnabled true 
    } 
    flavorDimensions "appType" 
    productFlavors { 
     passenger { 
      dimension "appType" 
      applicationId "com.my.app.passenger" 
      versionCode 1 
      versionName "1" 
     } 
     driver { 
      dimension "appType" 
      applicationId "com.my.app.driver" 
      versionCode 1 
      versionName "1" 
     } 
     admin { 
      dimension "appType" 
      applicationId "com.my.app.admin" 
      versionCode 1 
      versionName "1" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      testCoverageEnabled true 
     } 
     packagingOptions { 
      exclude 'META-INF/ASL2.0' 
      exclude 'META-INF/LICENSE' 
      exclude 'META-INF/NOTICE' 
      exclude 'META-INF/NOTICE.txt' 
      exclude 'META-INF/LICENSE.txt' 
      exclude 'META-INF/MANIFEST.MF' 
     } 
    } 
} 

repositories { 
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } 
} 

dependencies { 
    implementation project(path: ':cards') 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 
    implementation "com.android.support:design:${supportVersion}" 
    implementation "com.android.support:support-v4:${supportVersion}" 
    implementation "com.android.support:appcompat-v7:${supportVersion}" 
    implementation "com.android.support:cardview-v7:${supportVersion}" 
    implementation "com.android.support:gridlayout-v7:${supportVersion}" 
    implementation "com.google.android.gms:play-services-maps:${googlePlayServicesVersion}" 
    implementation "com.google.android.gms:play-services-location:${googlePlayServicesVersion}" 
    implementation "com.google.android.gms:play-services-places:${googlePlayServicesVersion}" 
    implementation "com.google.android.gms:play-services-gcm:${googlePlayServicesVersion}" 
    implementation "com.google.android.gms:play-services-ads:${googlePlayServicesVersion}" 
    implementation "com.google.android.gms:play-services-auth:${googlePlayServicesVersion}" 
    implementation 'com.google.maps:google-maps-services:0.2.5' 
    implementation "com.google.firebase:firebase-messaging:${googlePlayServicesVersion}" 
    implementation "com.loopj.android:android-async-http:${asyncHttpVersion}" 
    implementation "com.android.support.test.espresso:espresso-idling-resource:${espressoVersion}" 
    implementation 'com.android.support:multidex:1.0.2' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    implementation 'org.slf4j:slf4j-api:1.7.25' 
    implementation 'com.github.tony19:logback-android-core:1.1.1-6' 
    implementation 'ch.acra:acra:4.9.2' 
    implementation('com.github.tony19:logback-android-classic:1.1.1-6') { 
     exclude group: 'com.google.android', module: 'android'  // workaround issue #73 
    } 
    testImplementation 'org.testng:testng:6.9.6' 
    testImplementation 'org.mockito:mockito-core:1.10.19' 
    testImplementation 'org.powermock:powermock-api-mockito:1.6.5' 
    testImplementation 'org.powermock:powermock-module-junit4-rule-agent:1.6.5' 
    testImplementation 'org.powermock:powermock-module-junit4-rule:1.6.5' 
    testImplementation 'org.powermock:powermock-module-junit4:1.6.5' 
    androidTestImplementation "com.android.support:support-annotations:${supportVersion}" 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test:rules:1.0.1' 
    androidTestImplementation 'org.testng:testng:6.9.6' 
    androidTestImplementation 'org.mockito:mockito-core:1.10.19' 
    androidTestImplementation 'com.google.dexmaker:dexmaker:1.2' 
    androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2' 
    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' 
    androidTestImplementation("com.android.support.test.espresso:espresso-core:${espressoVersion}", { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
} 

apply plugin: 'com.google.gms.google-services' 
+0

Sie bitte Ihre build.gradle zeigen. –

+0

@DougStevenson, bearbeitete Frage –

+0

Haben Sie unterschiedliche Prozesse für verschiedene Komponenten in Ihrem Manifest definiert? Was ist in 'com.my.app.core.ApplicationEx'? –

Antwort

1

Die Firebase SDKs im Allgemeinen nicht die Verwendung von anderen Prozessen als dem Hauptprozess unterstützen. Wenn und sobald ACRA startet und einen anderen Prozess startet, erstellt sein eigener Prozess eine neue Application-Unterklasse für diesen Prozess. Dies liegt daran, dass jeder App-Prozess genau ein Application-Objekt instanziiert sein muss.

Dies bedeutet für Ihre App, dass dieser andere Prozess niemals Firebase-APIs verwenden sollte. Dies bedeutet, dass Sie einen anderen Ort finden müssen, um diesen IID-Token zu erhalten.

(Beachten Sie, dass die Firebase SDKs automatisch von einem ContentProvider initialisiert werden, der standardmäßig in Ihre App integriert wird. Sie sollten FirebaseApp.initializeApp() nur aufrufen, wenn Sie diesen ContentProvider entfernt haben oder Google nicht verwenden -services plugin.)

Wenn Apps das IID-Token abrufen müssen, erstellen sie normalerweise eine Unterklasse von FirebaseInstanceIdService, wie in documentation beschrieben. Dieser Dienst wird jedes Mal benachrichtigt, wenn ein neues Token bekannt ist. Das ist der Ort, wo Sie es abrufen und es an Ihren Server senden sollten.

+0

Danke für die Antwort. Kannst du bitte folgendes klären: 1) Soll ich 'FirebaseInstanceId.getInstance(). GetToken()' nicht zuerst aufrufen, damit der 'FirebaseInstanceIdService' über die Token-Aktualisierung benachrichtigt wird? Wenn ja, wo sollte ich es anstelle von 'ApplicationEx' verwenden? 2) Was könnte der Grund sein, warum die App nicht immer abstürzt? 3) Der Aufruf von FirebaseApp.initializeApp() 'ist laut Ihrer Antwort nicht notwendig? –

+0

1) Nein. Wie gesagt, die Dokumentation sagt, wie und wo Sie das Token bekommen sollten. 2) Die App stürzt nicht immer ab, weil ich achte, dass ACRA nicht immer eintritt. 3) Es ist nicht notwendig, es sei denn, Sie haben die Umstände, die ich sagte, die selten sind. –

0

Schritt 1:

Downloads von Google-services.json von Feuerbasis Projekt, in dem Sie Ihre Feuerbasis Projektschlüssel sehen und Wert

"project_info": { 
    "project_number": "XXXXXXXXXXXX", 
    "firebase_url": "https://xxxxxxx-XXXXXX.firebaseio.com", 
    "project_id": "xxxxxx-XXXXX", 
    "storage_bucket": "xxxxxx-XXXXX.appspot.com" 
} 

Schritt 2: in Ihrer Anwendungsklasse Sie einen Eintrag machen von Firebase

private FirebaseDatabase database; 

public void onCreate() { 
     super.onCreate(); 
     FirebaseApp.initializeApp(this); 
     database = FirebaseDatabase.getInstance(); 
} 

// by calling this method wherever you can use firebase database object for further operations. 

public FirebaseDatabase getDataBase(){ 
     return database; 
    } 

Schritt 3: In Ihrer Projektebene build.gradle

dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
compile 'com.google.firebase:firebase-messaging:11.4.0' 
    compile 'com.google.firebase:firebase-database:11.4.0' 
} 

apply plugin: 'com.google.gms.google-services' 

Schritt 4:
In Ihrer Projektebene build.gradle

dependencies { 
    classpath 'com.android.tools.build:gradle:2.3.3' 
     classpath 'com.google.gms:google-services:3.1.0' 
     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 

allprojects { 
    repositories { 
     jcenter() 
     maven { url "https://maven.google.com" }// Google's Maven repository 
    } 
} 

und für weitere Fragen lesen Sie bitte DOCUMENTATION

Verwandte Themen