在初始化 Aeris 地图视图时为 google 个地图获取空值

Get null for google maps while initializing Aeris Map View

我正在按照教程创建一个简单的 aeris 地图。

错误详情:

12-04 11:55:51.216 22405-22405/usc.forecast.weather E/AndroidRuntime: FATAL EXCEPTION: main
  Process: usc.forecast.weather, PID: 22405
  java.lang.RuntimeException: Unable to start activity ComponentInfo{usc.forecast.weather/usc.forecast.weather.MapActivity}: java.lang.NullPointerException
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
   at android.app.ActivityThread.access0(ActivityThread.java:135)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5001)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
   at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
   at com.hamweather.aeris.maps.AerisMapView.init(AerisMapView.java:219)
   at usc.forecast.weather.MapFragment.onCreateView(MapFragment.java:32)**
   at android.app.Fragment.performCreateView(Fragment.java:1700)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
   at android.app.BackStackRecord.run(BackStackRecord.java:684)
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
   at android.app.Activity.performStart(Activity.java:5240)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
   at android.app.ActivityThread.access0(ActivityThread.java:135) 
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
   at android.os.Handler.dispatchMessage(Handler.java:102) 
   at android.os.Looper.loop(Looper.java:136) 
   at android.app.ActivityThread.main(ActivityThread.java:5001) 
   at java.lang.reflect.Method.invokeNative(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:515)

mapView.init(savedInstanceState, AerisMapType.GOOGLE);

以及AerisMapView.java(第三方,aeris weather

的init方法内部
public void init(Bundle savedInstanceState, AerisMapView.AerisMapType type) {
        this.type = type;
        switch(null.$SwitchMap$com$hamweather$aeris$maps$AerisMapView$AerisMapType[type.ordinal()]) {
        case 1:
            this.mapView.onCreate(savedInstanceState);
            MapsInitializer.initialize(this.getContext());
            this.googleMap = this.mapView.getMap(); <-------
            this.googleMap.getUiSettings().setZoomControlsEnabled(false);
            this.googleMap.setOnCameraChangeListener(this);
            this.googleMap.setOnMarkerClickListener(this);
            this.markerAdapter = new AerisGoogleInfoAdapter();
            this.googleMap.setOnInfoWindowClickListener(this);
            this.googleMap.setInfoWindowAdapter(this.markerAdapter);
        default:
        }
    }

我的代码:

MapFragment.java

public class MapFragment extends MapViewFragment implements  OnAerisMapLongClickListener, AerisCallback {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        AerisEngine.initWithKeys(this.getString(R.string.aeris_client_id), this.getString(R.string.aeris_client_secret), "usc.forecast.weather");

        View view = inflater.inflate(R.layout.fragment_interactive_maps, container, false);
        mapView = (AerisMapView) view.findViewById(R.id.aerisfragment_map);
        mapView.init(savedInstanceState, AerisMapType.GOOGLE);

        Bundle bundle = getArguments();
        String lat = bundle.getString("lat");
        String lng = bundle.getString("lng");

        Location location = new Location("");
        location.setLatitude(Double.valueOf(lat));
        location.setLongitude(Double.valueOf(lng));

        mapView.moveToLocation(location);
        mapView.addLayer(AerisTile.RADSAT);

        mapView.setOnAerisMapLongClickListener(this);

        return view;
    }

    @Override
    public void onMapLongClick(double lat, double longitude) {
        // code to handle map long press. i.e. Fetch current conditions?
        // see demo app MapFragment.java
    }

    @Override
    public void onResult(EndpointType type, AerisResponse response) {

    }}

MapActivity.java

public class MapActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

    Intent intent = getIntent();
    String lat = intent.getStringExtra("lat");
    String lng = intent.getStringExtra("lng");


    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    MapFragment fragment = new MapFragment();

    Bundle bundle = new Bundle();
    bundle.putString("lat", lat);
    bundle.putString("lng", lng);

    fragment.setArguments(bundle);

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}}

activity_map.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

fragment_interactive_maps.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.hamweather.aeris.maps.AerisMapView
        android:id="@+id/aerisfragment_map"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </com.hamweather.aeris.maps.AerisMapView>
</LinearLayout>

build.gradle(项目)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "usc.forecast.weather"
        minSdkVersion 19
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.google.android.gms:play-services-maps:8.3.0'
    compile 'com.facebook.android:facebook-android-sdk:4.6.0'
    compile 'com.hamweather:aeris-maps-library:1.1.1@aar'}

确保将这些 MapView 调用包含在这些生命周期事件中。

    @Override
    public void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

编辑:要让 MapFragment 初始化并开始使用它,您通常需要这样做:

mapFragment.getMapAsync(this);

然后当它加载时调用此覆盖,然后您就可以使用它(这可能是它为空的原因,因为您试图过早地使用它)。

@Override
public void onMapReady(GoogleMap googleMap) {

}

还要确保在 FragmentActivity:

中包含此实现语句
implements OnMapReadyCallback

MapFragment 不需要像 MapView 那样(上图)绑定到生命周期程序中,因为它是 Fragment 并自行处理。

发生这种情况的原因是我 phone 上的 Google Play 服务已过时。 Android Studio 的最新版本正在使用最新的 API SDK 来编译应用程序,因此 google 地图返回 null。

我在链接到(当前)com.google.android.gms:play-services-maps:9.4 版本的地图 SDK 时看到了这个问题,我相信这个问题也出现在 9.2.1 中。

Aeris 已经意识到这个问题并建议您坚持使用 com.google.android.gms:play-services:8.4.0 直到他们推出 SDK 更新(计划于 2016 年第四季度)。