我正在努力将谷歌地图集成到我正在开发的应用程序中,到目前为止,我在这方面度过了一段相当不愉快的时光。无论如何,我终于得到了一个显示地图并设置位置和缩放级别的 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 中:
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 密钥)。
我在这里做错了什么?我是否忽略了一些明显的东西?