>Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yu.lbs"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="com.google.android.maps" />
<activity
android:name="com.yu.lbs.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主.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.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:apiKey=".........."
android:clickable="true"
android:enabled="true" />
</LinearLayout>
主活动.java:
import android.os.Bundle;
import android.view.Menu;
import com.google.android.maps.MapActivity;
public class MainActivity extends MapActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
可以启动活动。但是在MapView中什么都没有。可以显示地图的小网格,我认为这是MapView附带的,但没有加载地图。可能出了什么问题?我正在使用谷歌API v3。但此代码来自使用 API v1 的教科书。
我解决问题的方式,我必须这样做:
final MapView mapView = (MapView)fragmentView.findViewById(R.id.map_fieldLocation);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng coordinates = new LatLng(match.match.LocationLatitude, match.match.LocationLongitude);
googleMap.addMarker(new MarkerOptions().position(coordinates).title(match.match.LocationAddress));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 15));
mapView.onResume();
}
});
我缺少的重要部分是,您必须在调用getMapAsync()
之前调用 onCreate()
方法,一旦调用回调,您需要在 MapView
对象上调用 onResume()
。
这完全为我解决了这个问题。
下面是它在您自己的类中的样子:
public class MainActivity extends MapActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (getView() != null) {
final MapView mapView = (MapView)getView().findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng coordinates = new LatLng(match.match.LocationLatitude, match.match.LocationLongitude);
googleMap.addMarker(new MarkerOptions().position(coordinates).title(match.match.LocationAddress));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 15));
mapView.onResume();
}
}
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
希望这有帮助!
我猜你正在从你试图实现的谷歌地图版本中弄得一团糟。从您使用的代码来看,您似乎正在尝试使用Google Maps API V1。
问题是你现在无法为Google Map API V1生成新的API密钥,这个版本已被弃用,谷歌没有为其提供新的密钥。
从评论来看,在 API 控制台中您没有激活正确的 API。看看这篇博文,了解如何为 Google 地图 API V2 for Android 生成 API 密钥:
谷歌地图 API V2 密钥
接下来,查看以下指南以在应用程序中实现此版本:
谷歌地图 API V2
在 android 中使用 Map API V2 for google map。访问此链接可能会对您有所帮助。
它比旧版本更好,也更容易。
根据文档(截至今天),您需要将生命周期回调转发到 MapView。
一个更简洁的方法是使用 LifecycleObserver。当地图放置在活动或片段中时,这有效。
你不会得到onLowMemory()
或onSaveInstanceState()
但你仍然可以将它们转发到MapView。
下面是一个 Kotlin 示例。
import android.content.Context
import android.util.AttributeSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
import com.google.android.gms.maps.MapView
class MyMapView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : MapView(context, attrs, defStyle), LifecycleObserver {
init {
if(context is LifecycleOwner) {
context.lifecycle.addObserver(this)
}
}
//Your code here
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun create() {
onCreate(null)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
onStart()
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resume() {
onResume()
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pause() {
onPause()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
onStop()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun destroy() {
onDestroy()
}
}