无法加载地图。联系Google服务器时出错这可能是一个身份验证问题

时间:2013-07-16 04:20:11

标签: android google-maps android-fragments android-tabs

我搜索了所有的日子,我找不到答案......

一切准备就绪但谷歌地图仍然无法显示片段

我检查我已经开启谷歌地图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;

    }
}

Map_fragment.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帮助!!

24 个答案:

答案 0 :(得分:65)

听起来您的API_KEY问题是从Google API访问获得的,因此请验证您的API_KEY证书指纹包名称

也在<manifest>

中使用
<uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" >
    </uses-feature>

并验证:<meta-data .... >应位于<application>代码


<强> PS。

1。还可以尝试添加以下权限

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
After changing API key 必须 AndroidManifest.xml

2。 Clear Application Data

清除申请数据:

转到Settings>Application Manager>Select Your Application > Click on Clear Data

{p> Must Uninstall The Application installing it !之前注意Re-install Completely Uninstall the Application以外clear its Data completely {{1}} 1}}

答案 1 :(得分:35)

我花了很多时间,有太多类似的问题。

我尝试添加自己的权限WIFI_STATE权限,但真正的问题出在应用程序数据中。

在清单中更改API密钥后,您必须“清除数据”(或完全重新安装)。

这对我有帮助,我希望这篇文章可以帮助别人。

答案 2 :(得分:10)

通过向清单添加权限解决了我的问题:

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

答案 3 :(得分:6)

我遇到同样的问题,我的问题是我没有在控制台中激活服务:

  1. 转到控制台:https://code.google.com/apis/console/
  2. 转到服务部分
  3. 启用 Google Maps Android API v2
  4. 按照documentacion中的所有步骤进行操作

答案 4 :(得分:5)

如果您对auth有问题,请在Logcat中检查您的包名。 如果您使用 Android Studio ,请查看 build.gradle 。当文件包含applicationIdSuffix '.dev'时。您应该将.dev添加到您的包名称中。

E.I。包名是:

  

com.company.main

在API控制台中编写

  

... 9S.ME.DA.FE; com.company.main.dev

答案 5 :(得分:4)

在做完所有人说要检查我的清单,添加权限,在eclipse中使用sha1创建新密钥等等之后,它仍然无法正常工作:

adb uninstall com.example.hellomap

然后再次运行eclipse。看起来该设备并没有获得全新的数据。希望这会有所帮助。

答案 6 :(得分:2)

我能够使用调试密钥并从eclipse加载。我在AndroidManifest.xml

中遗漏了以下权限
uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"

答案 7 :(得分:1)

在审核了大量案例并成功运行地图之后,请记住以下几点:

  • 使用android api 17,booth模拟器和项目
  • 参考Google服务
  • 如果需要,请使用Android支持
  • 在库中使用以下顺序:src,gen,google apis,android support,dependencies和private libraries
  • 使用正确的api密钥
  • 清除数据,重新安装应用。

答案 8 :(得分:1)

我配置了很多服务,包括谷歌地图API v2(不是谷歌地图Android API v2),这是相互矛盾的。删除不需要的服务并生成新密钥后,包括清单中的清除安装,地图就会显示在设备上。

答案 9 :(得分:1)

我已通过在清单中提供权限来修复此问题

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

答案 10 :(得分:1)

我在Android Studio中遇到了同样的问题。连接到android调试器时,谷歌地图不会显示。

我通过为位于~/.android/debug.keystore的调试密钥库添加SHA1指纹来修复它。我认为这个密钥库是默认生成的(虽然不确定)。

终端中的以下命令用于获取SHA1指纹:

keytool -list -v -keystore ~/.android/debug.keystore 

当它要求输入密码时,不要输入任何内容,只需按Enter即可。 (在我的情况下工作)

将此指纹添加到开发人员控制台中Android应用程序的API密钥中。

干杯!

答案 11 :(得分:0)

使用Android Studio时,我也遇到了同样的问题。

我已经提到了所有的解决方案,但它仍然没有用。

问题是我在初始项目设置后changed package name。更改包名称反映在Manifest中,但在build.gradle文件中存在旧包名称。

一旦build.gradle中有changed package name,Map就会开始工作。

希望它有所帮助。

答案 12 :(得分:0)

检查清单:  1.检查Android Manifest for READ_GSERVICES

的权限

&LT; uses-permission android:name =“com.google.android.providers.gsf.permission.READ_GSERVICES”/&gt;

  1. 如果您在清单中做了一些更改,请清除应用程序数据。

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

    我的问题只是通过替换位于的debug.keystore来解决 你的应用程序的debug.keystore .android文件夹。

答案 13 :(得分:0)

我被困在这个问题上大约一个星期。所以我开始使用真正的设备。但有一天,我尝试将Custon调试密钥库(Eclipse,Window - &gt; Preferences - &gt; Android - &gt; Build - &gt; Cusom调试密钥库)设置为默认值。一切都变得有效了。当然,首先我在谷歌控制台上有一把钥匙。

希望这会有所帮助!

答案 14 :(得分:0)

我遇到了同样的问题,为此有解决方案,我尝试使用相同的包名从不同的Google帐户创建调试api密钥。 步骤清除错误: 1.在不同的Google帐户中删除具有相同包名称的不需要的api密钥。 2.请在单个帐户中维护Api密钥生成以解决此问题。 谢谢。试试这个。

答案 15 :(得分:0)

调试时,我需要为~/.android/debug.keystore

添加额外的API密钥

此密钥库会自动为您设置,密码为&#34; android&#34;?

答案 16 :(得分:0)

我遇到了同样的问题。我检查了日志,并说有“服务器上的身份验证失败”。所以,我检查了www.console.developers.google.com,发现包名不正确。 (这个包名是自动编写的)我写得正确,一切正常。

答案 17 :(得分:0)

我迄今为止犯下的最奇怪的错误是从debug.keystore获取SHA1代码。

我虽然没有密码,但密码是 android

不确定它是否对任何人有帮助,但它对我有帮助。加上使用完整的包名,你可以在java源代码文件中找到它。例如,有我的: com.example.erikas.mapsdemo (看起来像:package com.example.erikas.mapsdemo;)

因此,当您尝试获取API密钥时,请使用以下输入:

XX:XX:XX:XX:XX:17:C9:22:BB:BD:7C:87:12:83:2D:XX:XX:XX:XX:XX;com.example.erikas.mapsdemo

所以我自己的错误是错误的SHA1代码和错误的包。但幸运的是 - 经过2天的头痛后我想出来了! :d

答案 18 :(得分:0)

在IntelliJ中..如果您确定SHA1键是正确的,API key不会丢失,

Permission并且Manifest中的任何设置都是正确的。

  

也许您必须在Google-Play-Services-lib上右键单击并再次编译

我做了所有的事情,这对我有用。

答案 19 :(得分:0)

我的错误是,当我刚刚将发布配置添加到Google Developers Console时,我正在运行调试配置。所以,我按照以下步骤操作:

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

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

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

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

答案 20 :(得分:0)

其中许多帮助了我,但主要问题是我没有正确的签名。我正在使用Xamarin,因此它没有内置到IDE中,所以当我使用keytool生成密钥时,它永远不会进入应用程序。我必须在.csproj文件中添加以下内容:

<PropertyGroup>
   <AndroidKeyStore>True</AndroidKeyStore>
   <AndroidSigningKeyStore>maps.keystore</AndroidSigningKeyStore>
   <AndroidSigningStorePass>android</AndroidSigningStorePass>
   <AndroidSigningKeyAlias>androiddebugkey</AndroidSigningKeyAlias>
   <AndroidSigningKeyPass>android</AndroidSigningKeyPass>
</PropertyGroup>

答案 21 :(得分:0)

如果没有(如上所述)有效,很可能您使用了错误的debug.keystore文件来生成指纹。如果您的计算机中有多个debug.keystore文件,请确保使用正确的debug.keystore来生成SHA1指纹。

答案 22 :(得分:0)

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

答案 23 :(得分:0)

在我的情况下,有效的是我必须通过命令行安装它:

  

adb install /path/to/app/MyApp.apk