简体   繁体   中英

“Unable to get provider com.google.firebase.provider.FirebaseInitProvider” Error path Android

I have an Application which is connected to firebase.The problem is when install the app in device(working on several devices).I read a lot of forums and no one works.I read here and this and so on.Thanks!!

The error is here.

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.dev.ptruck, PID: 8833
              java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.dev.ptruck-17.apk"],nativeLibraryDirectories=[/data/app-lib/com.dev.ptruck-17, /vendor/lib, /system/lib]]
                  at android.app.ActivityThread.installProvider(ActivityThread.java:5196)
                  at android.app.ActivityThread.installContentProviders(ActivityThread.java:4788)
                  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4728)
                  at android.app.ActivityThread.access$1500(ActivityThread.java:166)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:136)
                  at android.app.ActivityThread.main(ActivityThread.java:5584)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
                  at dalvik.system.NativeStart.main(Native Method)
               Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.dev.ptruck-17.apk"],nativeLibraryDirectories=[/data/app-lib/com.dev.ptruck-17, /vendor/lib, /system/lib]]
                  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                  at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
                  at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
                  at android.app.ActivityThread.installProvider(ActivityThread.java:5181)
                  at android.app.ActivityThread.installContentProviders(ActivityThread.java:4788) 
                  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4728) 
                  at android.app.ActivityThread.access$1500(ActivityThread.java:166) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1343) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:136) 
                  at android.app.ActivityThread.main(ActivityThread.java:5584) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                  at dalvik.system.NativeStart.main(Native Method) 

Here is the start Class

public class StartActivity extends Activity {
private static final String FIREBASE_URL = "https://database.firebaseio.com/";
private Firebase myFirebaseRef = null;
View rootView;
String uid;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);

    Firebase.setAndroidContext(this);
    final ProgressBar p = (ProgressBar) findViewById(R.id.start_progress_bar);

}
private void checkUserLogin() {
                    myFirebaseRef.addAuthStateListener(new Firebase.AuthStateListener() {
                        @Override
                        public void onAuthStateChanged(AuthData authData) {
                            if (authData != null) {

                                System.out.println(myFirebaseRef.getKey());
                                Intent toMainActivity = new Intent(getApplicationContext(), MenuActivity.class);
                                uid = myFirebaseRef.getAuth().getUid();
                                toMainActivity.putExtra("user_id", uid);
                                finish();
                                startActivity(toMainActivity);

                            } else if (authData == null) {

                                Intent toMainActivity = new Intent(getApplicationContext(), LoginActivity.class);
                                startActivity(toMainActivity);
                                // user is not logged in
                            }
                        }
                    });
}
private Runnable task = new Runnable() {
    public void run() {

        checkUserLogin();
    }
};
@Override
protected void onStart() {
    super.onStart();
    if(myFirebaseRef == null) {
        myFirebaseRef = new Firebase(FIREBASE_URL);
    }
    Handler handler = new Handler();
    handler.postDelayed(task, 3000);

}
@Override
protected void onDestroy() {
    super.onDestroy();

    unbindDrawables(rootView);
    rootView = null;
    System.gc();

}
protected void unbindDrawables(View view) {
    if (view != null) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }

    }

}

}

I have also faced same problem with Firebase when run application below API 19(< 4.4.2) devices due to error of Multidex . Then below solution work for me:

In app module build.gradle

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

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

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

update name in AndroidManifest.xml

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name=".MyApplication"
    android:theme="@style/AppTheme">

     // ...
</application>

Crate a MyApplication.java file

public class MyApplication extends Application {

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

}

In AndroidStudio try to do this:

  1. ctrl+alt+s
  2. Click on "Build, Execution, Deployment
  3. disable "Instant Run"

This should work

Disabling instant run fixed the issue for me.

Android Studio -> Preferences -> Build, Execution, Deployment -> Instant Run

-Uncheck the box next to "Enable Instant Run..."

-Click OK

我遇到了同样的问题,我所做的是从设备/模拟器中卸载应用程序,然后重新安装它(从Android Studio,“运行”按钮)。

If you have recently changed the firebase dependency version in your gradle you may need to update to the latest version of Google Repository in the Android SDK manager as well.

If you cannot update the Google Repository at the time, try changing the gradle dependency version back to lower.

Just insert below lines in your project AndroidManifest.xml file, if they're not in application tag

<meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM