11

我正在努力将谷歌地图集成到我正在开发的应用程序中,到目前为止,我在这方面度过了一段相当不愉快的时光。无论如何,我终于得到了一个显示地图并设置位置和缩放级别的 SupportMapFragment。

到目前为止,这是我的代码的功能位:

@Override
public void onActivityCreated( Bundle savedInstanceState ) {

    super.onActivityCreated( savedInstanceState );

    Location location = BundleChecker.getExtraOrThrow( KEY_LOCATION, new Bundle[] { savedInstanceState, getArguments() } );
    setLocation( location );

    if ( checkGooglePlayServicesStatus() == ConnectionResult.SUCCESS ) {
        setMapFragment( new SupportMapFragment() );
        getActivity().getSupportFragmentManager().beginTransaction().add( R.id.location_detail_mapFrame, getMapFragment() ).commit();

    }

    populateAddress();
    attachButtonListeners();

    Runnable initMap = new Runnable() {

        @Override
        public void run() {

            if ( checkGooglePlayServicesStatus() == ConnectionResult.SUCCESS ) {
                try {
                    GoogleMap map = getMapFragment().getMap();
                    LatLng latLng = getLocation().getAddress().getLatLng( getActivity() );
                    CameraUpdate update = CameraUpdateFactory.newLatLngZoom( latLng, DEFAULT_MAP_ZOOM );
                    map.animateCamera( update );
                }
                catch (IOException e) {
                    Log.e( TAG, e.getMessage(), e );
                    Toast.makeText( getActivity(), "Unable to find location", Toast.LENGTH_SHORT ).show();
                }
            }

        }
    };

    Handler handler = new Handler();
    handler.postDelayed( initMap, 200 );
}

另外,我编写了一个简单的便捷方法来从我的 Address 模型中获取 LatLng,您也可能会批评它:

/*
 * Convenience method to easily check if there is a valid lat & lng in this address
 */
public boolean hasLatLng() {

    return getLatitude() != null && getLongitude() != null;
}

/*
 * Convenience method for use with Google Maps API
 */
public LatLng getLatLng( Context context ) throws IOException {

    LatLng latLng = null;
    if ( hasLatLng() ) {
        latLng = new LatLng( getLatitude(), getLongitude() );
    }
    else {
        String locationString = getStreet() + ", " + AddressUtil.makeCityStateZipString( this );
        Geocoder geoCoder = new Geocoder( context );
        try {
            List<android.location.Address> matches = geoCoder.getFromLocationName( locationString, 2 );
            if ( matches != null && matches.size() > 0 ) {
                double lat = matches.get( 0 ).getLatitude();
                double lng = matches.get( 0 ).getLongitude();
                latLng = new LatLng( lat, lng );
            }
        }
        catch (IOException e) {
            throw new IOException( e );
        }
    }

    return latLng;
}

我知道这段代码并不理想,需要重构。这是我第一次使用谷歌地图,所以请随时提供关于我如何做到这一点的建议。尝试在我的布局 XML 中使用 MapFragment 时遇到了很多问题,所以我以编程方式创建它。

问题的核心:我从临时服务器获取了一些虚假地址数据,这导致 Address#getLatLng 方法返回 null,从而在调用 CameraUpdateFactory.newLatLngZoom 时导致异常。收到此异常后,我无法再从 Google 获取地图数据。地图片段现在是空白的,并且消息显示在 logcat 中:

SupportMapFragment 没有地图内容

05-21 18:11:42.903: I/Google Maps Android API(15747): 无法联系 Google 服务器。建立连接后将进行另一次尝试。

05-21 18:11:43.093: E/Google Maps Android API(15747): 加载地图失败。联系 Google 服务器时出错。这可能是身份验证问题(但可能是由于网络错误)。

我创建了一个新的 api 密钥并替换了清单中的当前密钥,没有任何变化。我对上述代码所做的唯一更改是考虑空 LatLng 并且我已经撤消了这些更改,试图让我的代码恢复到功能状态。

此外,为了让事情有点奇怪,我构建了包含在 Google Play Services Extras 中的示例地图项目,它运行良好(顺便说一句,有一个单独的 API 密钥)。

我在这里做错了什么?我是否忽略了一些明显的东西?

4

3 回答 3

19

此问题通常源自引用google-play-service库中的问题。看看我写的这篇关于如何在你的应用程序中集成谷歌地图的博文,尤其是前 3 个步骤:

谷歌地图 API V2

造成这种情况的另一个原因可能是您没有正确配置 Google API 控制台,所以我建议您也看看这个指南:

谷歌地图 API V2 密钥

可能导致这种情况的另一个原因是,如果您在清单文件中的权限存在某种问题。您也可以查看第一个指南以获取所需的权限。

于 2013-05-22T18:04:15.637 回答
2

使用这样的东西:

  1. 更新 SDK 中的 google play 服务。

  2. 手动从设备中卸载应用程序并重新启动设备。我已经尝试过了,它运行得很好,兄弟

还要做一件事,从https://code.google.com/apis/console/获取新的 api 密钥以编辑新的 sh1 代码

您可以从 window-preference-android-buid 获取您的 sh1 代码

于 2013-08-29T13:09:12.170 回答
0

让 Google 地图发挥作用是一项 Googlemare。这对我有用:

- 使用 Android 管理器更新 Google play 服务 - 使用以下内容创建一个新的 apikey:Sha1 密钥库(Window->preferences->Android->Build)和项目包名称。在以下位置执行此操作:https ://code.google.com/apis/console/

有人更改了包名并破坏了该应用程序!!

借助谷歌地图,在您需要愤怒管理疗法之前试试这个。

于 2014-06-09T13:56:22.610 回答