在Viewpager中实现Google地图,错误:无法获取提供程序com.google.firebase.provider.FirebaseInitProvider。
在Viewpager中实现Google地图,错误:无法获取提供程序com.google.firebase.provider.FirebaseInitProvider。
我在ViewPager中的Android Google地图集成中遇到了异常,请帮助我解决这个问题。我使用了以下代码,请纠正我的错误。这是我诚挚的请求。如果我的问题不合格,请添加评论,我会删除我的帖子。谢谢
活动名称:
MapTradeActivity.class
package com.tradezap.toolbartest; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import java.util.ArrayList; import java.util.List; public class MapTradeActivity extends AppCompatActivity { private TabLayout tabLayout; private ViewPager parent_viewpager; ViewPagerAdapter pageAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maptrade); parent_viewpager = (ViewPager) findViewById(R.id.parent_viewpager); setupViewPager(parent_viewpager); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(parent_viewpager); parent_viewpager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); setupTabIcons(); } private void setupTabIcons() { int[] tabIcons = { R.drawable.ic_settings,R.drawable.ic_category_24dp,R.drawable.ic_deal1 }; tabLayout.getTabAt(0).setIcon(tabIcons[0]); tabLayout.getTabAt(1).setIcon(tabIcons[1]); tabLayout.getTabAt(2).setIcon(tabIcons[2]); } private void setupViewPager(ViewPager viewPager) { pageAdapter = new ViewPagerAdapter(getSupportFragmentManager()); pageAdapter.addFrag(new fragment_settings()); pageAdapter.addFrag(new fragment_category()); pageAdapter.addFrag(new fragment_deal()); parent_viewpager.setAdapter(pageAdapter); } class ViewPagerAdapter extends FragmentPagerAdapter { private final ListmFragmentList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { System.out.println(""+mFragmentList.size()); return mFragmentList.size(); } public void addFrag(Fragment fragment) { mFragmentList.add(fragment); } @Override public CharSequence getPageTitle(int position) { return null; } } private TabLayout.OnTabSelectedListener onTabSelectedListener(final ViewPager mPager) { return new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { mPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }; } }
片段名称:fragment_deal
package com.tradezap.toolbartest; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import java.lang.reflect.Field; /** * Created by apple1 on 13/06/16.,OnMapReadyCallback */ public class fragment_deal extends Fragment implements View.OnClickListener { private View dealFragView; private SupportMapFragment mSupportMapFragment; private GoogleMap mMap; private static final LatLng marker_latlng = new LatLng(11.01, 76.95); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { dealFragView = inflater.inflate(R.layout.fragment_deal_layout, container, false); return dealFragView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentManager fm = getChildFragmentManager(); mSupportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map_container); if (mSupportMapFragment == null) { mSupportMapFragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.map_container, mSupportMapFragment).commit(); } } @Override public void onResume() { super.onResume(); if (mMap == null) { mMap = mSupportMapFragment.getMap(); mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0))); } } @Override public void onClick(View v) { } @Override public void onDetach() { super.onDetach(); try { Field childFragmentManager = Fragment.class .getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } }
AndroidManifest.xml
遇到的异常日志
06-13 17:37:34.977 16326-16326/com.tradezap.googlemaptest E/AndroidRuntime: FATAL EXCEPTION: main Process: com.tradezap.googlemaptest, PID: 16326 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.tradezap.googlemaptest-1/base.apk"],nativeLibraryDirectories=[/data/app/com.tradezap.googlemaptest-1/lib/arm, /vendor/lib, /system/lib]] at android.app.ActivityThread.installProvider(ActivityThread.java:5177) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4769) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4709) at android.app.ActivityThread.-wrap1(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1415) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.tradezap.googlemaptest-1/base.apk"],nativeLibraryDirectories=[/data/app/com.tradezap.googlemaptest-1/lib/arm, /vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.app.ActivityThread.installProvider(ActivityThread.java:5162) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4769) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4709) at android.app.ActivityThread.-wrap1(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1415) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) Suppressed: java.lang.ClassNotFoundException: com.google.firebase.provider.FirebaseInitProvider at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 12 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
我遵循了这篇帖子:How to put Google Maps V2 on a Fragment Using ViewPager请帮忙,谢谢。
问题原因:使用了错误的方法onActivityCreated()导致该问题的出现。
解决方法:改用方法onViewCreated()来替代onActivityCreated(),并进行相应的代码调整。以下是修改后的代码:
public void onViewCreated(View view, Bundle savedInstanceState) { insertNestedFragment(); } // 动态嵌入子片段 private void insertNestedFragment() { FragmentManager fm = getChildFragmentManager(); mSupportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.child_fragment_container); if (mSupportMapFragment == null) { mSupportMapFragment = SupportMapFragment.newInstance(); fm.beginTransaction().replace(R.id.child_fragment_container, mSupportMapFragment).commit(); } }
通过以上修改,问题应该得以解决。