ไม่สามารถรับผู้ให้บริการ com.google.firebase.provider.FirebaseInitProvider


160

ฉันกำลังทดสอบเครื่องมือ Crash ใหม่: https://firebase.google.com/docs/crash/

หลังจากผ่านขั้นตอนต่าง ๆ แล้วแอปก็จะเปิดตัวและมันก็จะพูดว่า:

05-18 17:28:18.870 28743 28743 E AndroidRuntime: java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.IllegalStateException: Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.installProvider(ActivityThread.java:5156)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.-wrap1(ActivityThread.java)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:148)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:5417)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-18 17:28:18.870 28743 28743 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Incorrect provider authority in manifest. Most likely due to a missing applicationId variable in application's build.gradle.
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.google.firebase.provider.FirebaseInitProvider.zza(Unknown Source)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    at android.app.ActivityThread.installProvider(ActivityThread.java:5153)
05-18 17:28:18.870 28743 28743 E AndroidRuntime:    ... 10 more

1
คุณมี applicationID ใน build.gradle ของคุณหรือไม่
Ian Barber

1
@IanBarber: โอ้ว้าวในขณะที่การแก้ไข build.gradle ฉันเอามันออก ความผิดฉันเอง.
Macarse

stackoverflow.com/a/38224316/4663544เท่านั้นที่ทำงานให้ฉัน
Jeba Ra

8
ลองAndroid studio> Build>Clean Project
Ujjwal ซิงห์

ฉันแก้ไขโดยการทำให้คลาสแอปพลิเคชันของฉันขยาย MultiDexApplication เมื่อ multiDexEnabled เป็นจริงใน graddle defaultConfig ของแอป
เฮอร์แมน

คำตอบ:


145

1

เพิ่มapplicationIdไปที่ build.gradle ของแอปพลิเคชัน:

android {
    ...
    defaultConfig {
        applicationId "com.example.my.app"
        ...
    }
}

และสะอาดกว่าโครงการ -> สร้างหรือสร้างโครงการใหม่


2.หาก minSdkVersion ของคุณ <= 20 ( https://developer.android.com/studio/build/multidex )

ใช้ Multidex อย่างถูกต้อง

build.gradle ของแอปพลิเคชัน

android {
...               
    defaultConfig {
    ....
        multiDexEnabled true
    }
    ...
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
    ...
}

manifest.xml

<application
    ...
    android:name="android.support.multidex.MultiDexApplication" >
    ...

3

หากคุณใช้คลาสแอปพลิเคชันที่กำหนดเอง

public class MyApplication extends MultiDexApplication {
    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(this);
    }
}

manifest.xml

<application
    ...
    android:name="com.example.my.app.MyApplication" >
    ...

1
ฉันได้รับข้อผิดพลาดเดียวกันและได้รับการแก้ไขโดยวิธีแก้ปัญหา ฉันไม่รู้ว่าทำไม แต่ใช้งานได้
FUJI Goro

สิ่งนี้ช่วยวันให้ฉันได้ พบข้อผิดพลาดขณะที่ฉันพยายามเรียกใช้แอพ Cordova ไปยังอุปกรณ์ Android
manosim

1
ฉันมีปัญหาเดียวกันและ applicationId บน build.gradle ของฉัน ฉันจะทำอย่างไรในกรณีนั้น
Maria Mercedes Wyss Alvarez

@ekonstantinidis คุณแก้ไขได้อย่างไรสำหรับแอพ Cordova ของคุณ? สามารถเพิ่มในการกำหนดค่าที่ถูกต้องเมื่อสร้าง build.gradle หรือไม่ (ในระหว่างcordova platform add android)?
Zach

@Zach ฉันไม่คิดอย่างนั้น cordova platform add androidฉันเพิ่มมันหลังจากที่ผมวิ่ง ฉันเดาว่ามันจะได้รับการแก้ไขเมื่อ Cordova ได้รับการอัปเดตหรือไม่ ps ฉันไม่ได้ใช้ Firebase เลย
manosim

93

ฉันมีปัญหาเดียวกันในอุปกรณ์ที่มี SDK <22 แต่สำหรับฉันเหตุผลคือ MultiDex MultiDex.installต้องอยู่ในattachBaseContextวิธีการ

หากคุณใช้ MultiDex ให้ลองสิ่งนี้:

public class YourApplication extends Application {

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(this);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this); //initialize other plugins 

    }
}

app / build.gradle:

android {

    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "com.test.app"
        minSdkVersion 16
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

....
}

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])

        compile 'com.android.support:appcompat-v7:24.2.1'
        ...
        compile 'com.google.firebase:firebase-messaging:9.6.1'
        compile 'com.google.android.gms:play-services:9.6.1'
        compile 'com.android.support:multidex:1.0.1'

    }
...

4
มันทำงาน แต่มีเรียนพิเศษที่จะทำแทนการเอาชนะหนึ่งฟังก์ชั่นและก็เรียกว่า MultiDexApplication ดูคำตอบด้านล่างstackoverflow.com/questions/37312103/...
GregoryK

ใช่มันใช้งานได้สำหรับฉันด้วยฉันมักจะเขียน MultiDex.install (นี่) ข้างใน onCreate () วิธีขอบคุณเพื่อน
dara

ในกรณีของฉันฉันเพิ่งปรับปรุงคอมไพล์ 'com.android.support:multidex:1.0.1' เป็นเวอร์ชันล่าสุดที่มีอยู่
Aleksey Timoshchenko

นี่ควรเป็นคำตอบที่ยอมรับได้ ฉันลองคำตอบทั้งหมดและทำตามคำแนะนำของ Google และ Firebase แต่นี่เป็นคำตอบที่ถูกต้องคุณเป็นคนที่ยอดเยี่ยมมาก!
blueware

ขอบคุณคุณจะพบได้อย่างไร แต่คำถามของฉันคือแอพไลน์โค้ดของฉันไม่สูงกว่า 65000 ทำไมฉันจึงควรใช้มัน multudex และทำไมฉันจึงทำงานกับ sdk> 22 และมันไม่ทำงานบน sdk <22
milad salimi

75

คำตอบที่ยอมรับไม่ได้แก้ปัญหาของฉัน

หากคุณกำลังใช้ Multidex แอพลิเคชันของคุณควรจะขยายแทนMultiDexApplicationApplication

MyApplication.java

public class MyApplication extends MultiDexApplication{
     ...
}

AndroidManifest.xml

<application
      android:name="your.package.name.MyApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      ...
      />

หวังว่ามันจะช่วย


ทำงานอย่างสมบูรณ์แบบ! ขอบคุณมาก :)
Solution Spirit

3
คุณจะรู้สิ่งเหล่านี้ได้อย่างไร? ใครบอกคุณ??? ฉันเพิ่งเริ่มมีปัญหานี้หลังจากอัปเดตเป็น Android Studio 3 และติดตั้งแอพ "แก้ปัญหา" รุ่น "Release" ทำงานได้ดี ในตอนนี้โซลูชันของคุณยังใช้งานได้ในเวอร์ชัน "Debug" ฉันมีความสุขมากที่คนอย่างคุณอยู่ !!
Ton

นั่นเป็นคำตอบที่สมบูรณ์แบบ
androidXP

ในคำตอบทั้งหมดนี้ไม่มีใครอธิบายได้ว่าการเพิ่ม multidex ทำอะไรเพื่อแก้ปัญหา (สิ่งสุ่มที่น่างงที่ต้องทำเมื่อเผชิญกับปัญหาดังกล่าว)
Aditya Anand

36

หากคุณพบปัญหาเดียวกัน แต่มีการapplicationIdตั้งค่าไว้build.gradleแล้วคุณสามารถลองทำสิ่งต่อไปนี้:

  • ใน Android Studio: Build>Clean Project
  • ใน IDEs อื่น ๆ : สะอาดสร้างใหม่อะไรก็ได้ ...

3
และถ้าคุณยังมีปัญหาอยู่ให้ลบไดเรกทอรีสร้างแล้วลองอีกครั้ง ผมติดอยู่จนกว่าฉันจะได้ :) ว่า
ลอเรน Moroney

เฉพาะการลบbuildไดเรกทอรีที่ใช้งานได้สำหรับฉัน ดูเหมือนว่ามันจะเกิดความสับสนขึ้นจากการดึงครั้งสุดท้ายของฉันจาก repo
Sevastyan Savanyuk

17

ฉันมีปัญหาเดียวกันในอุปกรณ์ Pre Lollipop เพื่อแก้ปัญหาที่ฉันทำดังนี้ ในขณะเดียวกันฉันใช้ multiDex ในโครงการ

1. เพิ่มสิ่งนี้สำหรับ build.gradle ในโมดูล: แอพ

multiDexEnabled = true

dexOptions {
    javaMaxHeapSize "4g"
}

2. เพิ่มการพึ่งพานี้

compile 'com.android.support:multidex:1.0.1'

3. จากนั้นใน MainApplication

public class MainApplication extends MultiDexApplication {

private static MainApplication mainApplication;

@Override
public void onCreate() {
    super.onCreate();
    mainApplication = this;
}

@Override
protected void attachBaseContext(Context context) {
    super.attachBaseContext(context);
    MultiDex.install(this);
}


public static synchronized MainApplication getInstance() {
    return mainApplication;
}
}

4. ในไฟล์รายการ

<application
    android:allowBackup="true"
    android:name="android.support.multidex.MultiDexApplication"

มันใช้งานได้สำหรับฉัน หวังว่านี่จะช่วยคุณได้เช่นกัน :)


4
คุณไม่ควรทำงานทั้งสามอย่าง (ขยาย MultiDexApplication, ใช้ attacheBaseContext และเปลี่ยนไฟล์ menifest) เพื่อให้เปิดใช้งาน multidex เพียงอันเดียวก็เพียงพอแล้ว: D developer.android.com/studio/build/multidex.html
Hossein Shahdoost

หาก minSdk ของคุณคือ 21 หรือสูงกว่าคุณไม่ควรทำสิ่งนี้เนื่องจากเอกสารระบุว่าเป็นค่าเริ่มต้นที่เปิดใช้งานแล้ว และยังมีปัญหานี้มาให้ฉันด้วย minSdk = 21 คำตอบสำหรับเรื่องนี้คืออะไร?
Aditya Anand

15

คุณควรจะแน่ใจ

เพื่อเพิ่มบรรทัดนี้ในรายการของคุณ

https://developer.android.com/studio/run/index.html#instant-run

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

ทำงานให้ฉันด้วยพร้อมกับ multiDexEnabled จริง
ashishdhiman2007

7

อย่ารวมไลบรารีบริการการเล่นทั้งหมด แต่ใช้สิ่งที่คุณต้องการแทนที่บรรทัดในbuild.gradleของคุณ:

compile 'com.google.android.gms:play-services:9.6.1'

ด้วยอันที่เหมาะสมจากGoogle Play Services APIเช่น:

compile 'com.google.android.gms:play-services-gcm:9.6.1'

7

เพิ่มสิ่งนี้ไปยัง build.gr ระดับโมดูลของคุณ:

android {               
defaultConfig {
    ....
    multiDexEnabled true
}
...
}

dependencies {
    compile 'com.android.support:multidex:1.0.1'
    .........
}

หากคุณแทนที่Applicationชั้นเรียนให้ขยายจากMultiDexApplication:

YourApplicationClass extends MultiDexApplication

หากคุณไม่สามารถขยายจากMultiDexApplicationคลาสได้ให้แทนที่attachBaseContext()วิธีดังต่อไปนี้:

protected void attachBaseContext(Context base) {
     super.attachBaseContext(context);
     Multidex.install(this);
  }

และอย่ารันอะไรก่อนที่จะMultiDex.install(this)ถูกประหารชีวิต

หากคุณไม่ได้แทนที่Applicationชั้นเรียนให้แก้ไขไฟล์รายการของคุณดังต่อไปนี้:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    .......>
     <application
         ......
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
    ......
</manifest>

3

สิ่งนี้ควรใช้งานได้:

ขั้นตอนที่ 1:

defaultConfig {
    applicationId "service.ingreens.com.gpsautoon"
    minSdkVersion 17
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

ขั้นตอนที่ 2:

compile 'com.android.support:multidex:1.0.1'

ขั้นตอนที่ 3: เข้าชั้นเรียนอื่น

public class MyApplication extends MultiDexApplication {
}

ขั้นตอนที่ 4:เพิ่มบรรทัดนี้ในรายการ

<application
    android:name="android.support.multidex.MultiDexApplication">
</application>

2

ในกรณีของฉันปัญหาได้รับการแก้ไขโดยการเพิ่มบรรทัดนี้ไปยังโมดูล build.gradle:

// เพิ่มที่ด้านล่าง

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

แหล่ง


ฉันได้รับ "ไม่พบปลั๊กอินที่มี ID 'com.google.gms.play-services'"
kaleemsagard

@kaleemsagard ใส่สิ่งนี้ลงในโครงการของคุณbuild.gradle dependencies { classpath 'com.google.gms:google-services:3.0.0' }
Borja

1

ในกรณีของฉันปัญหาเกิดขึ้นหลังจากเราย้ายไปยัง AndroidX ด้วยเหตุผลบางอย่างแอพกำลังเรียกใช้ MultiDex.install () พร้อมกับการสะท้อน:

    final Class<?> clazz = Class.forName("android.support.multidex.MultiDex");
    final Method method = clazz.getDeclaredMethod("install", Context.class);
    method.invoke(null, this);

ผมเปลี่ยนแพคเกจจากไปandroid.support.multidex.MultiDex androidx.multidex.MultiDexมันได้ผล


0

แทนที่จะเพิ่มชื่อแพ็กเกจด้วยตนเองใน build.gradleคุณสามารถทำได้ด้วยวิธีนี้:

ก่อนอื่นให้เพิ่มบรรทัดนี้ที่จุดเริ่มต้น

import java.util.regex.Pattern

จากนั้นเพิ่มสิ่งนี้ใน defaultConfig

android {
    ...
    defaultConfig {
        ...
        applicationId = doExtractStringFromManifest("package")
        ...
    }
    ...
}

และในที่สุดก็เพิ่มเมธอด doExtractStringFromManifest

def doExtractStringFromManifest(name) {
     def manifestFile = file(android.sourceSets.main.manifest.srcFile)
     def pattern = Pattern.compile(name + "=\"(\\S+)\"")
     def matcher = pattern.matcher(manifestFile.getText())
     matcher.find()
     return matcher.group(1)
}

เนื่องจากมีความคิดเห็นเกี่ยวกับคำตอบของคอร์โดวาจำนวนมากหากคุณทำงานกับคอร์โดวาคุณไม่ควรแก้ไขbuild.gradleตัวเองจริงๆ

// ไฟล์สร้าง! ห้ามแก้ไข!

ดังนั้นหากคุณใช้ Cordova สิ่งที่ดีที่สุดที่คุณสามารถทำได้คืออัพเดตเป็น Cordova-android 5.1.0 หรือสูงกว่าที่มีการเปลี่ยนแปลงนี้อยู่แล้ว


0

Mine เป็นเพราะ Firebase SDK ในไฟล์ Gradle ถูกตั้งค่าเป็นหมายเลขที่ไม่ถูกต้อง

ฉันลบ Firebase debs ออกจาก Gradle แล้วติดตั้งใหม่อีกครั้งโดยใช้ Firebase Assistant


0

ไปที่หุ่นยนต์ตั้งสตูดิโอ (โดยการกดCtrl+Alt+Sใน Windows), ค้นหาและยกเลิกการเลือกInstant RunEnable Instant Run

เมื่อปิดใช้งานInstant Runและเรียกใช้แอปพลิเคชันของคุณอีกครั้งปัญหาจะได้รับการแก้ไข


0

สำหรับแอปที่ตอบสนองพื้นเมืองเกิดข้อผิดพลาด java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" เป็นเพียงการใช้กับอุปกรณ์ที่มีรุ่น Android <~ 4.4 เท่านั้น

แก้ไขได้โดยเพียงแค่การเปลี่ยนApplicationในMainApplication.javaด้วยMultiDexApplication

บันทึก: import android.support.multidex.MultiDexApplication;



0

ในกรณีของฉันฉันลืมที่จะเพิ่ม (หรือลบออก) โดยไม่ตั้งใจ) แกนไฟในการสร้าง gradle

implementation 'com.google.firebase:firebase-core:xx.x.x'

1
3 เดือนที่ผ่านมาและตอนนี้เลิกใช้แล้ว: อย่าเพิ่มสิ่งนี้! Source = firebase.google.com/support/release-notes/android (ข้อผูกมัด: ขอบคุณ Google)
Aditya Anand

0

ฉันมีข้อผิดพลาดนี้เพียงบนอุปกรณ์ที่มี API ที่ต่ำกว่าที่ 21 ในกรณีที่ผมได้มีการทำงานร่วมกับโครงการที่multiDexEnabledตัวเลือกในการถูกกำหนดแล้วbuild.gradle trueฉันจะตรวจสอบไฟล์ Dex จากเอพีเคและจำนวนวิธีการอ้างอิงได้น้อยกว่า 64k เพื่อให้โครงการไม่จำเป็นต้องเป็น multidex หนึ่งดังนั้นผมตั้งไปmultiDexEnabled falseวิธีนี้ใช้ได้ผลสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.