32

我搜索了一天,我找不到答案...

一切准备就绪,但谷歌地图仍然无法在带有标签的片段上显示

我检查我是否已经打开了 google map android v2 和正确的 API_KEY

我不知道发生了什么!

图像

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> 

清单.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 的帮助!!

4

25 回答 25

69

听起来您API_KEY从 Google API Access获得的有问题,因此请验证您的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"/>

2. 必须After changing API key_AndroidManifest.xml Clear Application Data

清除应用程序数据:

要么Settings>Application Manager>Select Your Application > Click on Clear Data

或者 Must Uninstall The Application 之前installing it ! 注意不要Re-install,除非你Completely Uninstall the Application为了clear its Data completely

于 2013-07-16T04:34:37.600 回答
35

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

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

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

这对我有帮助,我希望这篇文章对某人有所帮助。

于 2013-07-30T13:01:25.037 回答
10

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

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
于 2013-08-08T11:44:12.507 回答
6

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

  1. 转到控制台:https ://code.google.com/apis/console/
  2. 转到服务部分
  3. 启用Google Maps Android API v2
  4. 遵循文档中的所有步骤
于 2013-08-23T08:10:48.360 回答
5

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

ei 包名是:

com.company.main

在 API 控制台中写入

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

于 2014-09-12T22:03:48.797 回答
4

在做了人们说喜欢检查我的清单、添加权限、在 Eclipse 中使用 sha1 制作新密钥等之后,它仍然无法正常工作,我只是做了:

adb uninstall com.example.hellomap

然后再次运行eclipse。该设备似乎没有获得全新的数据。希望这可以帮助。

于 2013-09-12T21:23:36.750 回答
2

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

uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"
于 2013-10-26T14:03:13.410 回答
1

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

我通过为位于~/.android/debug.keystore. 我认为这个密钥库是默认生成的(虽然不确定)。

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

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

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

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

干杯!

于 2014-11-24T12:11:35.117 回答
1

我已通过在清单中给予许可来解决此问题

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
于 2013-12-13T12:07:15.997 回答
1

在查看了大量案例并成功运行地图之后,请牢记以下几点:

  • 使用android api 17,booth emulator和project
  • 参考谷歌服务
  • 如果需要,使用 android 支持
  • 在库中使用以下顺序:src、gen、google apis、android 支持、依赖项和私有库
  • 使用正确的 api 密钥
  • 清除数据,重新安装应用程序。
于 2013-07-30T22:27:27.657 回答
1

我配置了许多服务,包括冲突的 Google Maps API v2(不是 Google Maps Android API v2)。删除不需要的服务并生成新密钥后,包括在清单中,全新安装,地图出现在设备上。

于 2013-08-23T13:02:16.720 回答
0

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

于 2014-10-24T19:37:30.103 回答
0

In IntelliJ ..if you sure that you SHA1 key is correct, API key is not missing,

Permission and any setup in Manifest is correct.

Maybe you have to Right Click on your Google-Play-Services-lib and Compile it again

I have done all the things and this does the trick for me.

于 2014-08-20T14:54:35.940 回答
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

于 2014-09-09T08:54:30.423 回答
0

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

于 2013-09-20T20:37:30.320 回答
0

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

这个密钥库是自动为您设置的,密码是“android”?

于 2014-10-03T17:15:28.410 回答
0

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

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

于 2013-08-23T09:41:39.797 回答
0

我面临着同样的问题。我尝试了几种解决方案 - 没有一个对我有用。对我有用的是在我的设备上生成一个新的 API 密钥并清除 Google Play 服务的数据

于 2015-04-30T16:57:13.953 回答
0

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

于 2013-10-08T12:23:51.073 回答
0

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

<PropertyGroup>
   <AndroidKeyStore>True</AndroidKeyStore>
   <AndroidSigningKeyStore>maps.keystore</AndroidSigningKeyStore>
   <AndroidSigningStorePass>android</AndroidSigningStorePass>
   <AndroidSigningKeyAlias>androiddebugkey</AndroidSigningKeyAlias>
   <AndroidSigningKeyPass>android</AndroidSigningKeyPass>
</PropertyGroup>
于 2014-05-01T03:58:06.030 回答
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+package。

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

于 2014-08-13T11:56:02.243 回答
0

我在这个问题上被困了大约一个星期。所以我开始使用真机。但是有一天我尝试将 Custon 调试密钥库(Eclipse,Window -> Preferences -> Android -> Build -> Cusom 调试密钥库)设置为与默认密钥库相同。一切都开始工作了。当然,首先我有一个谷歌控制台的钥匙。

希望这会有所帮助!

于 2014-12-05T01:15:13.033 回答
0

检查清单: 1. 检查 Android Manifest 中 READ_GSERVICES 的权限

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

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

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

    只需将位于 .android 文件夹中的 debug.keystore 替换为应用程序的 debug.keystore 即可解决我的问题。

于 2015-05-05T10:19:15.973 回答
0

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

我已经参考了所有解决方案,但仍然无法正常工作。

问题是changedpackage name在初始项目设置之后。更改包名称反映在 中Manifest,但在build.gradle文件中旧包名称在那里。

一旦我changed package name进入 build.gradle,Map 就开始工作了。

希望它可以帮助某人。

于 2015-05-15T06:56:58.437 回答
0

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

于 2016-01-03T21:08:07.057 回答