Мне трудно реализовать firebase в модульном проекте Android, написанном на kotlin.
Моя структура выглядит так:
И затем в моем основном действии oncreate я вызываю FirebaseApp.inialize (это)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
FirebaseApp.initializeApp(this)
setContentView(R.layout.activity_main)
spotifyAuthDataViewModel = ViewModelProviders.of(this)
.get(SpotifyAuthDataViewModel::class.java)
val liveData = spotifyAuthDataViewModel.getAuthData()
info { liveData.value!!.spotifyToken }
}
Моя модель просмотра с живыми данными выглядит так:
class SpotifyAuthDataViewModel : ViewModel() {
var authData: MutableLiveData<SpotifyAuthData> = MutableLiveData()
private var mDatabase: DatabaseReference? = null
fun getAuthData(): LiveData<SpotifyAuthData> {
mDatabase = FirebaseDatabase.getInstance().reference
FirebaseDatabase.getInstance()
.getReference("/spotify_data")
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError?) {
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
if (dataSnapshot.exists()) {
var spotifyAuthData: SpotifyAuthData? =
dataSnapshot.getValue<SpotifyAuthData>(SpotifyAuthData::class.java)
authData.postValue(spotifyAuthData)
}
}
}
)
return authData
}
}
Но когда я пытаюсь запустить приложение, я получаю это сообщение
java.lang.RuntimeException: Unable to resume activity {com.jd.test.app/com.jd.test.feature.MainActivity}: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.jd.test.app. Make sure to call FirebaseApp.initializeApp(Context) first.
Я также попытался создать класс, расширяющий мое приложение, вызвав firebaseapp.initialize (this) и добавив это в свой манифест, но у меня все равно возникла та же ошибка.
Манифест:
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:tools = "http://schemas.android.com/tools"
package = "com.jd.test.feature">
<uses-permission android:name = "android.permission.INTERNET" />
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" />
<application android:name = ".BaseApplication">
<activity android:name = ".MainActivity"
android:theme = "@style/AppTheme">
<intent-filter android:order = "1">
<action android:name = "android.intent.action.VIEW"/>
<category android:name = "android.intent.category.BROWSABLE"/>
<category android:name = "android.intent.category.DEFAULT"/>
<data
android:host = ""
android:pathPrefix = "/.*"
android:scheme = "https"/>
</intent-filter>
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name = "android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name = ".spotify.views.SpotifyLogin"/>
</application>
</manifest>
BaseApplication.kt:
class BaseApplication : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
}
}
Моя функция Gradle
apply plugin: 'com.android.feature'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
debug {
useProguard false
minifyEnabled false
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
def lifecycle_version = "1.1.0"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'io.github.tonnyl:spark:0.1.0-alpha'
implementation 'com.github.Joran-Dob:PlayPauseFab:0.0.3'
implementation project(':base')
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.github.bumptech.glide:glide:4.4.0'
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"
implementation 'com.spotify.android:auth:1.1.0'
implementation 'com.spotify.sdk:spotify-player-24-noconnect-2.20b@aar'
implementation "org.jetbrains.anko:anko:0.10.5"
implementation 'com.android.support:palette-v7:27.1.1'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.google.firebase:firebase-core:15.0.2'
implementation 'com.google.firebase:firebase-database:15.0.1'
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"
kapt 'com.github.bumptech.glide:compiler:4.4.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
apply plugin: 'com.google.gms.google-services'
@PeterHaddad Я попытался добавить класс, расширяющий действие, и добавить его к имени приложения манифеста. И вызывая firebase init в этих классах oncreate, он вызывается, но все равно вылетает с той же ошибкой
Какие именно шаги вы предприняли для интеграции Firebase? Обратите внимание, что официальная документация для этого находится здесь: firebase.google.com/docs/android/setup
@DougStevenson Я следил за официальными документами. Мой файл Gradle функции содержит реализацию 'com.google.firebase: firebase-core: 15.0.2' implementation 'com.google.firebase: firebase-database: 15.0.1' и применить плагин: 'com.google.gms.google- services ', и я добавил google-service.json и добавил classpath' com.google.gms: google-services: 3.3.1 '// плагин google-services в основной Gradle
Плагин com.google.gms.google-services Gradle работает только с модулями, которые являются модулями приложений Android, которые применяют плагин com.android.application. Он не работает с библиотечными модулями или функциональными модулями.
Когда вы применяете плагин google-services, он вносит изменения в ваше приложение, которые позволяют ему автоматически инициализироваться с использованием информации, найденной в вашем файле google-services.json.
Спасибо за отличный ответ! Добавлен api 'com.google.firebase: firebase-core: 15.0.0' api 'com.google.firebase: firebase-database: 15.0.0' и плагин apply к сборке, у которой есть com.android.application, но теперь У меня проблемы с импортом firebase в действия с функциями. Есть ли какие-либо особые изменения, необходимые для получения ссылки на вызовы firebase в действиях с функциями?
Если у вас есть дополнительный вопрос, отличный от исходного, задайте его отдельно.
Спасибо за ответ! Я только что сделал: stackoverflow.com/questions/50309893/…
Я действительно смущен, потому что образец Google Analytics для мгновенных приложений (с функциями и градиентами приложений) применяет плагин к функции, а также реализует там ядро firebase, см .: github.com/googlesamples/android-instant-apps/blob/master/…
Я не знаю. Собирается ли образец так, как вы ожидаете, если следовать инструкциям? Похоже, они применяют плагин только в базе, а не в функции.
Образец работает так, как ожидалось, и применяет com.google.gms.google-services внутри плагина apply: 'com.android.feature' gradle, см .: 17: github.com/googlesamples/android-instant-apps/blob/master/…
Если вы используете функции (apply plugin: 'com.android.feature'
), то apply plugin: 'com.google.gms.google-services' и SDK (api 'com.google.firebase. ~~~~~~) необходимо добавить в файл gradle baseFeature.
Вы также должны добавить google-services.json в эту папку модулей!
Возможный дубликат Обязательно сначала вызовите FirebaseApp.initializeApp (Context)