加载地图失败。无法连接Google服务器。这可能是一个身份验证问题。

32

我每天都在搜索,但是我找不到答案...

所有的东西都准备好了,但是谷歌地图仍然无法在带有选项卡的片段上显示。

我检查过了,已经打开了Google Map Android V2和正确的API_KEY。

我不知道发生了什么事情!

img

MainActivity.java:

public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener {

    SectionsPagerAdapter mSectionsPagerAdapter;

    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String titles[] = { this.getString(R.string.title_around),
                this.getString(R.string.title_map),
                this.getString(R.string.title_favorite),
                this.getString(R.string.title_achievement), };

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mSectionsPagerAdapter = new SectionsPagerAdapter(
                getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);
        mViewPager
                .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < titles.length; i++) {
            actionBar.addTab(actionBar.newTab().setText(titles[i])
                    .setTabListener(this));
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab,
            FragmentTransaction fragmentTransaction) {
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            // TODO 在這邊決定哪個位置要給什麼 View(Fragment)
            Fragment fragment = null;
            // TODO 建議先在之前就初始化好 4 個 Fragment
            switch (position) {
            case 0:
                fragment = new AroundFragment();
                break;
            case 1:
                fragment = new MapsFragment();
                break;
            case 2:
                fragment = new FavoriteFragment();
                break;
            case 3:
                fragment = new AchievementFragment();
                break;
            default:
                break;
            }

            return fragment;
        }

        @Override
        public int getCount() {
            return 4;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // TODO 在這邊決定每一個 View 的 title
            switch (position) {
            case 0:
                return getString(R.string.title_around);
            case 1:
                return getString(R.string.title_map);
            case 2:
                return getString(R.string.title_favorite);
            case 3:
                return getString(R.string.title_achievement);
            }
            return null;
        }
    }

}

MapsFragment.java:

public class MapsFragment extends Fragment{
    static final LatLng NKUT = new LatLng(23.979548, 120.696745);
    private GoogleMap map;
    SupportMapFragment mMapFragment;
    public MapsFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.map_fragment,container, false);

        map = ((SupportMapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

         mMapFragment = SupportMapFragment.newInstance();
         FragmentTransaction fragmentTransaction =
                 getFragmentManager().beginTransaction();
         fragmentTransaction.add(R.id.map,mMapFragment);
         fragmentTransaction.commit();

        return rootView;

    }
}

地图片段.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout> 

清单文件 Manifest.xml:

<!-- Google Map -->
<permission
        android:name="com.jertt.yummymap.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
<uses-permission android:name="com.jertt.yummymap.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<!-- The following two permissions are not required to use
     Google Maps Android API v2, but are recommended. -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<!-- end -->
    <!-- Google Map API Key -->

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="key" />

    <!-- end -->

解决方案:

我找到了解决方法!!!

如果你使用的是私有密钥库来申请API_KEY,那么你无法通过eclipse上传和安装应用程序。

你需要自己将.apk文件上传到设备上并进行安装!

感谢Tarsem和srikanth gr的帮助!!


你的项目中添加了 Google Play 库吗? - Srikanth Roopa
是的,请看,我添加了http://imgur.com/tH5dzZc。 - JackWu
1
我找到了解决方案!!!如果您使用私有密钥库来应用API_KEY,则无法使用eclipse上传和安装应用程序。您需要自己将.apk文件上传到设备并安装它!感谢Tarsem和srikanth gr的帮助!! - JackWu
你在Google API上使用了哪个包来关联密钥?我的应用程序在全屏模式下工作正常,但选项卡视图版本无法工作。我知道我的密钥是有效的,因为全屏版本可以工作。有什么想法吗? - Marty Griffin
https://dev59.com/PmMm5IYBdhLWcg3wm_7z#22653551 - Pratik Butani
25个回答

0
在我的情况下,有效的方法是通过命令行安装它:
adb install /path/to/app/MyApp.apk

0
你所需要做的就是:在你的代码中使用调试密钥;卸载应用程序;使用调试密钥安装新的应用程序。

0

对我来说,错误在于我在运行调试配置时,只是将发布配置添加到了Google开发者控制台。 因此,我按照以下步骤操作:

  1. 使用以下命令获取您的调试密钥库的sha1:

    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

  2. 转到https://console.developers.google.com并添加sha1 + package。

  3. 将API_KEY添加到AndroidManifest.xml文件中。


0

检查清单: 1. 检查Android清单文件中是否有READ_GSERVICES权限。

< uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

  1. 如果在清单文件中进行了更改,请清除应用程序数据。

  2. 检查.android文件夹中的debug.keystore。

    我只需将我的.android文件夹中的debug.keystore替换为您应用程序的debug.keystore,问题就解决了。


已经有一个广受接受的答案涵盖了你所说的内容。 - namezero

0

我曾经遇到过同样的问题。我检查了日志,发现上面写着“服务器认证失败”。于是,我登录了www.console.developers.google.com并发现包名不正确(这个包名是自动生成的)。我将其更正后,一切都正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接