我正在努力将Google地图整合到我正在处理的应用程序中,到目前为止我已经有一段相当不愉快的时间了。无论如何,我终于得到了一个显示地图并设置位置和缩放级别的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);
}
另外,我写了一个简单方便的方法来从我的地址模型得到一个经纬度,你可以批评,以及:
/*
* 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;
}
我知道这段代码并不理想,需要重构。这是我第一次使用Google地图,因此请随时提供建议,告诉我如何做到这一点。尝试在我的布局XML中使用MapFragment时遇到了很多问题,所以我正在以编程方式创建它。
问题的核心: 我从暂存服务器获取了一些伪造地址数据,导致Address#getLatLng方法返回null,从而在调用CameraUpdateFactory.newLatLngZoom时导致异常。在得到这个例外之后,我再也无法从Google获取地图数据。地图片段是现在空白和消息显示在logcat中:
05-21 18:11:42.903:I /谷歌地图的Android API(15747):无法联系谷歌服务器。连接建立后将进行另一次尝试。
05-21 18:11:43.093:E/Google Maps Android API(15747):无法加载地图。联系Google服务器时出错。这可能是一个身份验证问题(但可能是由于网络错误)。
我已经创建了一个新的API密钥,并替换了我的清单中的当前一个,没有变化。我对上述代码所作的唯一修改是为了解释一个空的LatLng,并且我已经取消了那些无意中将我的代码恢复到功能状态的更改。
此外,为了让事情变得有点陌生,我构建了包含在Google Play Services Extras中的示例地图项目,并且它完美地工作(具有单独的API密钥,btw)。
我在这里做了什么错?我忽略了一些明显的东西?
https://developers.google.com/maps/documentation/android/ – kongkea
您使用的是哪种谷歌地图版本?另外,您是否正在使用调试密钥或释放键来显示地图? – MiStr
@kongkea有什么有用的,你打算与你的链接?发布地图开发者文档的链接并且没有其他说明是无用的。 – dm78