我过去4天一直在使用Google Maps API v2,但在显示Google地图方面却失败了,但只显示了灰色的图块。 Eclipse在模拟器和真实设备上运行应用程序时没有显示任何错误(连接到PC作为模拟器)。我提到的API密钥(代替我的api密钥)是我的通过显示调试证书指纹获得。任何人请。救命!提前谢谢。
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.VertexVerveInc.GPSLocator"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name">
<uses-library android:name="com.google.android.maps"/>
<activity
android:name="GPSLocatorActivity"
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>
main.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="my api key"
/>
</LinearLayout>
GPSLocatorActivity.java文件
package com.VertexVerveInc.GPSLocator;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MapController;
import com.google.android.maps.GeoPoint;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.Geocoder;
import android.location.Address;
import com.google.android.maps.Overlay;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.util.List;
import java.util.Locale;
import java.io.IOException;
import android.os.Bundle;
import android.widget.Toast;
public class GPSLocatorActivity extends MapActivity {
private MapView mapView;
private MapController mapController;
private LocationManager locationManager;
private LocationListener locationListener;
@SuppressWarnings( "deprecation" )
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new GPSLocationListener();
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
locationListener);
mapView = (MapView) findViewById(R.id.mapView);
// enable Street view by default
mapView.setStreetView(true);
// enable to show Satellite view
mapView.setSatellite(true);
// enable to show Traffic on map
mapView.setTraffic(true);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
mapController.setZoom(16);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
private class GPSLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location location) {
if (location != null) {
GeoPoint point = new GeoPoint(
(int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
/* Toast.makeText(getBaseContext(),
"Latitude: " + location.getLatitude() +
" Longitude: " + location.getLongitude(),
Toast.LENGTH_SHORT).show();*/
mapController.animateTo(point);
mapController.setZoom(16);
// add marker
MapOverlay mapOverlay = new MapOverlay();
mapOverlay.setPointToDraw(point);
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
String address = ConvertPointToLocation(point);
Toast.makeText(getBaseContext(), address, Toast.LENGTH_SHORT).show();
mapView.invalidate();
}
}
public String ConvertPointToLocation(GeoPoint point) {
String address = "";
Geocoder geoCoder = new Geocoder(
getBaseContext(), Locale.getDefault());
try {
List<Address> addresses = geoCoder.getFromLocation(
point.getLatitudeE6() / 1E6,
point.getLongitudeE6() / 1E6, 1);
if (addresses.size() > 0) {
for (int index = 0; index < addresses.get(0).getMaxAddressLineIndex(); index++)
address += addresses.get(0).getAddressLine(index) + " ";
}
}
catch (IOException e) {
e.printStackTrace();
}
return address;
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
class MapOverlay extends Overlay
{
private GeoPoint pointToDraw;
public void setPointToDraw(GeoPoint point) {
pointToDraw = point;
}
public GeoPoint getPointToDraw() {
return pointToDraw;
}
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
super.draw(canvas, mapView, shadow);
// convert point to pixels
Point screenPts = new Point();
mapView.getProjection().toPixels(pointToDraw, screenPts);
// add marker
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.red);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 24, null); // 24 is the height of image
return true;
}
}
}
答案 0 :(得分:4)
如果您使用签名的apk,调试密钥导出意味着,地图在实际设备中看起来是空白的。您正在使用unsigned apk,即调试密钥。如果你导出apk,请使用释放密钥。
https://developers.google.com/maps/documentation/android/start#the_google_maps_api_key
发放证书指纹。
在manifest.please中添加了一些权限。
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<permission
android:name="com.VertexVerveInc.GPSLocator.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.VertexVerveInc.GPSLocator.permission.MAPS_RECEIVE" />
在布局中,您正在使用地图v1,切换到地图v2。
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/rg_views"
android:name="com.google.android.gms.maps.SupportMapFragment"
/>
http://www.vogella.com/articles/AndroidGoogleMaps/article.html
答案 1 :(得分:1)
使用以下权限:
<uses-permission android:name="android.permission.INTERNET"/
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
检查你的api密钥是否正确。
答案 2 :(得分:1)
首先,您要检查设备。您可以在设备上添加apk文件。
如果同样的问题仍然存在,则只会出现API密钥问题。 带有调试签名证书的API密钥
生成API密钥的过程是 https://developers.google.com/maps/documentation/android/start#the_google_maps_api_key
答案 3 :(得分:1)
为了显示地图,您必须生成两个v2 API密钥:一个调试密钥(用于在开发期间在Eclipse中进行调试)和一个发布密钥(用于发布应用程序)。
现在,如果您自己测试应用程序,则需要一个调试密钥。
答案 4 :(得分:1)
您使用的地图com.google.android.maps.MapView
是Google Map API的v1。不幸的是,它已被正式弃用。
您应该使用版本2的新版Google Maps API。
Here这是如何使用Google Maps API v2的好例子。
希望这会有所帮助: - )