谷歌地图API的Android V2:GoogleMap的是空(Google Map Android

2019-08-08 06:26发布

我想使用的GoogleMap显示MapView类探索,没有运气,因为大多数代码示例使用MapFragment我不想要的。

我使用谷歌地图API的Android V2。

起初,只是为了与测试从谷歌的例子在这里 ,我设法拿到了典型的法线贴图显示。

public class POnlineMapView extends Activity {

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

上面的代码工作完全这表明一切都已经设置正确。

我现在想使用MapView类操纵显示设置,如中心点,但似乎我得到一个空对象每次我尝试获取GoogleMap对象。 为什么会这样?

public class POnlineMapView extends Activity {

    private MapView myMapView;
    private GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myMapView = new MapView(getApplicationContext());
        Bundle b = getIntent().getExtras();
        double longitude = b.getDouble("longitude");
        double latitude = b.getDouble("latitude");

        setContentView(R.layout.online_map_activity);
        map = myMapView.getMap();

        CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(latitude,longitude));
        CameraUpdate zoom=CameraUpdateFactory.zoomTo(17);

        map.moveCamera(center); //this gives a NullPointerException, probably due to the myMapView.getMap() method?
        map.animateCamera(zoom);    
    }
}

Answer 1:

检查谷歌游戏服务是否安装(并更新)

见谷歌地图API的Android抛出V2 GooglePlayServicesNotAvailableException,过时的,SupportMapFragment.getMap()返回null

也请阅读https://developers.google.com/maps/documentation/android/map (部分验证地图的可用性)



Answer 2:

这似乎是一个老问题,但我在尝试使用MapView的同样的问题。

假设你已经正确导入谷歌播放服务的lib,你必须检查是否有访问谷歌服务,你可以在你onCreate方法做到这一点,你必须初始化谷歌地图Android的AP。 您可以通过添加以下代码到你onCreate方法做到这一点

try {
        MapsInitializer.initialize(this);
    } catch (GooglePlayServicesNotAvailableException e) {
        Log.e("Address Map", "Could not initialize google play", e);
    }

switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) )
{
  case ConnectionResult.SUCCESS:
      Toast.makeText(getApplicationContext(), "SUCCESS", Toast.LENGTH_SHORT).show();
      break;
  case ConnectionResult.SERVICE_MISSING: 
      Toast.makeText(getApplicationContext(), "SERVICE MISSING", Toast.LENGTH_SHORT).show();
      break;
  case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: 
      Toast.makeText(getApplicationContext(), "UPDATE REQUIRED", Toast.LENGTH_SHORT).show();
      break;
  default: Toast.makeText(getApplicationContext(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(this), Toast.LENGTH_SHORT).show();
}

如果你获得成功,那么一切工作至今。 你还必须实现活动lyfecycle的mothods并调用这些方法中的每一个内部地图视图的相应methond:

@Override
protected void onResume() {
    myMapView.onResume();
    super.onResume();

}

@Override
protected void onPause() {
    myMapView.onResume();
    super.onPause();

}

@Override
protected void onDestroy() {
    myMapView.onDestroy();
    super.onDestroy();
   //((MapView)findViewById(R.id.mapView)).onDestroy();
}

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

最后,你必须检查你已经添加了谷歌地图API密钥到您的清单文件:

<meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="YOUR KEY"/>

你可以找到的说明这里得到你的关键: https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_api

编辑:忘了提,你也必须设置清单文件应用程序的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

这样做的应用程序块里面设置...



Answer 3:

谢谢你,你终于给了我一个线索编程,我怎么这么笨监督它初始化地图:)

嗯,有时候没有选项,当你想使用地图从片段使用MapFragment(或SupportMapFragment一样),即! 这实际上是一个非常普遍的情况下使用标签(动作条),其中所述图案是使用片段工作时。 所以,你有每个选项卡,在该片段为要膨胀布局的地图你自己的片段其中包含了MapFragment片段,等瞧 - 祝你好运!

现在,根据MapView的规格实在是没办法说,使用的MapView不鼓励或过时了,所以我为什么不使用它呢? 我不想在维持嵌套的片段,而不必从SDK支持黑客(即使是在最近支持LIB V13似乎有错误,并从布局嵌套片段不支持),所以使用的MapView转身对我来说到KISS。

下面是我CustomMapFragment我与布局通胀(允许复杂的布局)和嵌入式地图中使用,欢迎您使用它。 您可能还需要延长的支持-lib中,而不是SDK中的片段。

该onCreateView()方法膨胀布局(只需要提供你自己的),并预计该布局具有ID为“mapViewHolder”里的MapView将在布局创建连接到ViewGroup中(RelativeLayout的,LinearLayout中,等)。 活动必须实现CustomMapFragment.Handler接口,否则抛出ClassCastException。

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import R;

public class AppMapFragment extends Fragment {
  /*
   * to interact with activity
   */
  public static interface Handler {
    void onMapResume(GoogleMap map);
  }

  private Handler handler;
  private MapView mapView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
      // initialize explicitely, since we're working with MapView (not MapFragment)
      MapsInitializer.initialize(getActivity());
      this.mapView = new MapView(getActivity());
      this.mapView.onCreate(savedInstanceState);
    } catch (GooglePlayServicesNotAvailableException e) {
      Toast.makeText(getActivity(), "Please install Google Play Store and retry again!", Toast.LENGTH_LONG).show();
      getActivity().finish();
    }
  }

  @Override
  public void onResume() {
    super.onResume();
    this.mapView.onResume();
    this.handler.onMapResume(this.mapView.getMap());
  }

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

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

  @Override
  public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    this.mapView.onSaveInstanceState(outState);
  }

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

  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
      this.handler = (Handler) activity;
    } catch (ClassCastException e) {
      throw new ClassCastException("Your activity has to implement the interface " + this.handler.getClass().getName());
    }
  }

  public AppMapFragment() {
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_results_map, container, false);

    ((ViewGroup) rootView.findViewById(R.id.mapViewHolder)).addView(this.mapView);

    return rootView;
  }
}


Answer 4:

MapFragment和MapView类之间的一个区别是,你必须手动管理MapView类的生命周期,而MapFragment本身需要照顾它。

你必须调用从父活动/片段的相应方法下面的方法。

onCreate(Bundle)
onResume()
onPause()
onDestroy()
onSaveInstanceState()
onLowMemory()

我在谷歌的Play服务,它可以安装在Android的SDK管理器的额外部分样品RawMapViewDemoActivity验证了这一点。

该样品显示出在地图上在第一,它显示一个空白页一次我注释掉mMapView.onXXX的6行()。

也许生命周期就是为什么我们看到到处都是最例子使用MapFragment的原因。



Answer 5:

尝试这个办法:

  private MapView myMapView; private GoogleMap map; myMapView = (MapView) findViewById(R.id.map); if (map == null) { map = ((MapView) findViewById(R.id.map)).getMap(); } 


Answer 6:

我没有与地图视图运气无论是。
我确实有与MapFragment运气。

试试这个:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;

public class TestActivity extends FragmentActivity {

  SupportMapFragment mapFragment;
  GoogleMap map;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (mapFragment == null) {
      mapFragment = new SupportMapFragment();
      getSupportFragmentManager().beginTransaction()
          .add(android.R.id.content, mapFragment).commit();
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    setupMap();
  }

  private void setupMap() {
    if (map != null)
      return;
    map = mapFragment.getMap();
    if (map == null)
      return;

    doZoom();
  }

  private void doZoom() {
    if (map != null) {
      map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(45.424900,
          -75.694968), 17));
    }
  }
}


文章来源: Google Map Android API v2 : GoogleMap is null