我花了一些时间试图让它工作,我不断在每个教程的某个地方卡住。简而言之,我正在尝试创建一个标签式应用程序,其中一个标签是谷歌地图。
我已经解决了所有常见的错误:
我已经通过SDK下载了所有相关内容。
我有一个API密钥。
我添加了编译com.google.android.gms:play-services:7.5.0 to my dependencies.
我正在尝试关注this code,但它并没有完全为我工作,所以我稍微改了一下,但我还是碰壁了。
我当前的错误是java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
。我想这会在getMapAsync
初始化。
这是我的java代码:
public class MapFragment extends Fragment{
MapView mMapView;
private GoogleMap googleMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflat and return the layout
View v = inflater.inflate(R.layout.fragment_location_info, container,
false);
mMapView = (MapView) v.findViewById(R.id.mapView);
mMapView.onCreate(savedInstanceState);
mMapView.onResume();// needed to get the map to display immediately
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
MapsInitializer.initialize(getApplicationContext());
// latitude and longitude
double latitude = 17.385044;
double longitude = 78.486671;
// create marker
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");
// Changing marker icon
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
}
});
//MapsInitializer.initialize(getApplicationContext());
googleMap = mMapView.getMap();
// latitude and longitude
double latitude = 17.385044;
double longitude = 78.486671;
// create marker
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");
// Changing marker icon
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
// adding marker
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(17.385044, 78.486671)).zoom(12).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
// Perform any camera updates here
return v;
}
@Override
public void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
}
答案 0 :(得分:1)
看起来您的代码正处于转型过程中。您同时拨打getMapAsync()
和getMap()
。
只需使用getMapAsync()
,在获得onMapReady()
回调之前不要对地图执行任何操作。
此外,您不需要MapsInitializer。来自文档:
如果使用此功能,请使用此课程初始化Google Maps Android API 需要在获取地图之前使用。它必须被调用,因为有些 需要BitmapDescriptorFactory和CameraUpdateFactory等类 要初始化。
如果您正在使用MapFragment或MapView并且已经获得了 (非null)GoogleMap通过在其中任何一个类上调用getMap(), 那你就不用担心这门课了。看样品 申请一些例子。
以下是您修改的代码:
public class MapFragment extends Fragment implements OnMapReadyCallback {
MapView mMapView;
private GoogleMap googleMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflate and return the layout
View v = inflater.inflate(R.layout.fragment_location_info, container,
false);
mMapView = (MapView) v.findViewById(R.id.mapView);
mMapView.onCreate(savedInstanceState);
//mMapView.onResume(); // should not be needed
mMapView.getMapAsync(this);
//MapsInitializer.initialize(getApplicationContext());
// Perform any camera updates here
return v;
}
@Override
public void onMapReady(GoogleMap gMap) {
googleMap = gMap;
mMapView.onResume(); //call this here if you really need to
//MapsInitializer.initialize(getApplicationContext());
// latitude and longitude
double latitude = 17.385044;
double longitude = 78.486671;
// create marker
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps");
// Changing marker icon
marker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
// adding marker
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(17.385044, 78.486671)).zoom(12).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
//.........................