一:申请key:
1.首先找到debug keystore位置:
打开Eclipse--->Windows--->Preferences--->Android--->Build
一般是这样的路径 C:\Documents and Settings\Administrator\.android\debug.keystore
2.在cmd中执行
keytool -list -alias androiddebugkey -keystore "C:\Documents and Settings\Administrator\.android\debug.keystore" -storepass android -keypass android
得到认证指纹 (MD5)如:6F:C9:41:48:A5:F3:36:A5:D3:DD:B5:D1:CB:AC:47:88
3.打开申请key页面 http://code.google.com/android/maps-api-signup.html
复制 认证指纹 (MD5):到下面的 My certificate's MD5 fingerprint
4.然后点击 Generate Api key
5.等到apikey:0Mg_koWoyZUhlluO4-i6-bq9WYMFbxKodZZMz2Q
二:设计main.xml如下:(将申请到得key设置在com.google.android.maps.MapView 中如下所示)
- xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <FrameLayout
- android:id="@+id/map_layout"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <com.google.android.maps.MapView
- android:id="@+id/map_view"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:apiKey="0Mg_koWoyZUhlluO4-i6-bq9WYMFbxKodZZMz2Q"
- android:clickable="true"
- android:enabled="true" />
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="vertical"
- android:paddingBottom="105dip" >
- <TextView
- android:id="@+id/map_bubbleText"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/location_tips"
- android:gravity="left|center"
- android:maxEms="12"
- android:paddingLeft="12dip"
- android:paddingRight="10dip"
- android:text="@string/load_tips"
- android:textColor="#cfcfcf"
- android:textSize="14sp" />
- LinearLayout>
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="vertical" >
- <ImageView
- android:id="@+id/point_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:layout_marginBottom="30dip"
- android:src="@drawable/point_start" />
- LinearLayout>
- FrameLayout>
- LinearLayout>
三:创建MyLocationManager类主要用于管理经纬度获取方法实现
- package com.android.map;
- import android.content.Context;
- import android.location.Location;
- import android.location.LocationListener;
- import android.location.LocationManager;
- import android.os.Bundle;
- import android.util.Log;
- public class MyLocationManager {
- private final String TAG = "FzLocationManager";
- private static Context mContext;
- private LocationManager gpsLocationManager;
- private LocationManager networkLocationManager;
- private static final int MINTIME = 2000;
- private static final int MININSTANCE = 2;
- private static MyLocationManager instance;
- private Location lastLocation = null;
- private static LocationCallBack mCallback;
- public static void init(Context c , LocationCallBack callback) {
- mContext = c;
- mCallback = callback;
- }
- private MyLocationManager() {
- // Gps 定位
- gpsLocationManager = (LocationManager) mContext
- .getSystemService(Context.LOCATION_SERVICE);
- Location gpsLocation = gpsLocationManager
- .getLastKnownLocation(LocationManager.GPS_PROVIDER);
- gpsLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
- MINTIME, MININSTANCE, locationListener);
- // 基站定位
- networkLocationManager = (LocationManager) mContext
- .getSystemService(Context.LOCATION_SERVICE);
- Location networkLocation = gpsLocationManager
- .getLastKnownLocation(LocationManager.GPS_PROVIDER);
- networkLocationManager.requestLocationUpdates(
- LocationManager.NETWORK_PROVIDER, MINTIME, MININSTANCE,
- locationListener);
- }
- public static MyLocationManager getInstance() {
- if (null == instance) {
- instance = new MyLocationManager();
- }
- return instance;
- }
- private void updateLocation(Location location) {
- lastLocation = location;
- mCallback.onCurrentLocation(location);
- }
- private final LocationListener locationListener = new LocationListener() {
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
- public void onProviderEnabled(String provider) {
- }
- public void onProviderDisabled(String provider) {
- }
- public void onLocationChanged(Location location) {
- Log.d(TAG, "onLocationChanged");
- updateLocation(location);
- }
- };
- public Location getMyLocation() {
- return lastLocation;
- }
- private static int ENOUGH_LONG = 1000 * 60;
- public interface LocationCallBack{
- /**
- * 当前位置
- * @param location
- */
- void onCurrentLocation(Location location);
- }
- public void destoryLocationManager(){
- Log.d(TAG, "destoryLocationManager");
- gpsLocationManager.removeUpdates(locationListener);
- networkLocationManager.removeUpdates(locationListener);
- }
- }
四:创建MyMapOverlay抽象类,并继承Overlay,创建抽象方法
changePoint(GeoPoint newPoint,int type)用于回调重新获取到的GeoPoint 重新定位地图,并获取地址信息
- import android.view.MotionEvent;
- import com.google.android.maps.GeoPoint;
- import com.google.android.maps.MapView;
- import com.google.android.maps.Overlay;
- //覆盖整个地图捕捉触控事件的OverLay
- public abstract class MyMapOverlay extends Overlay{
- private int point_X;
- private int point_Y;
- private GeoPoint newPoint;
- public MyMapOverlay(int x,int y){
- point_X = x;
- point_Y = y;
- }
- boolean flagMove=false;
- //触控屏幕移动地图,重新根据屏幕中心点获取该点经纬度
- @Override
- public boolean onTouchEvent(MotionEvent event, MapView mapView) {
- System.out.println("X->"+event.getX()+":"+point_X);
- System.out.println("Y->"+event.getY()+":"+point_Y);
- if(event.getAction() == MotionEvent.ACTION_DOWN){
- changePoint(newPoint,1);
- }else if(event.getAction() == MotionEvent.ACTION_UP){
- newPoint = mapView.getProjection().fromPixels(point_X,point_Y);
- changePoint(newPoint,2);
- }
- return false;
- }
- public abstract void changePoint(GeoPoint newPoint,int type);
- }
五:MyMapActivity 继承MapActivity类并实现经纬度获取回调接口LocationCallBack 。项目实现如下:
- package com.android.googlemap;
- import java.io.IOException;
- import java.util.List;
- import java.util.Locale;
- import android.graphics.Rect;
- import android.location.Address;
- import android.location.Geocoder;
- import android.location.Location;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.Window;
- import android.widget.TextView;
- import com.android.map.MyLocationManager;
- import com.android.map.MyLocationManager.LocationCallBack;
- import com.android.map.MyMapOverlay;
- import com.google.android.maps.GeoPoint;
- import com.google.android.maps.MapActivity;
- import com.google.android.maps.MapController;
- import com.google.android.maps.MapView;
- import com.google.android.maps.Overlay;
- public class MyMapActivity extends MapActivity implements LocationCallBack {
- private MapView mapView;
- private MapController mMapCtrl;
- private MyLocationManager myLocation;
- private List
mapOverlays; - public GeoPoint locPoint;
- private MyMapOverlay mOverlay;
- private TextView desText;
- private String lost_tips;
- private int point_X;
- private int point_Y;
- private int statusBarHeight;
- public final int MSG_VIEW_LONGPRESS = 10001;
- public final int MSG_VIEW_ADDRESSNAME = 10002;
- public final int MSG_GONE_ADDRESSNAME = 10003;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- mapView = (MapView) findViewById(R.id.map_view);
- desText = (TextView) this.findViewById(R.id.map_bubbleText);
- lost_tips = getResources().getString(R.string.load_tips);
- mapView.setBuiltInZoomControls(true);
- mapView.setClickable(true);
- mMapCtrl = mapView.getController();
- point_X = this.getWindowManager().getDefaultDisplay().getWidth() / 2;
- point_Y = this.getWindowManager().getDefaultDisplay().getHeight() / 2;
- mOverlay = new MyMapOverlay(point_X, point_Y) {
- @Override
- public void changePoint(GeoPoint newPoint, int type) {
- if (type == 1) {
- mHandler.sendEmptyMessage(MSG_GONE_ADDRESSNAME);
- } else {
- locPoint = newPoint;
- mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);
- }
- }
- };
- mapOverlays = mapView.getOverlays();
- if (mapOverlays.size() > 0) {
- mapOverlays.clear();
- }
- mapOverlays.add(mOverlay);
- mMapCtrl.setZoom(12);
- MyLocationManager.init(MyMapActivity.this.getApplicationContext(),
- MyMapActivity.this);
- myLocation = MyLocationManager.getInstance();
- }
- @Override
- protected void onResume() {
- super.onResume();
- }
- @Override
- protected void onPause() {
- super.onPause();
- }
- @Override
- protected boolean isRouteDisplayed() {
- // TODO Auto-generated method stub
- return false;
- }
- public void onCurrentLocation(Location location) {
- if (locPoint == null) {
- locPoint = new GeoPoint((int) (location.getLatitude() * 1E6),
- (int) (location.getLongitude() * 1E6));
- mHandler.sendEmptyMessage(MSG_VIEW_LONGPRESS);
- }
- }
- public void changePoint(GeoPoint locPoint) {
- }
- /**
- * 通过经纬度获取地址
- *
- * @param point
- * @return
- */
- private String getLocationAddress(GeoPoint point) {
- String add = "";
- Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
- try {
- List addresses = geoCoder.getFromLocation(
- point.getLatitudeE6() / 1E6, point.getLongitudeE6() / 1E6,
- 1);
- Address address = addresses.get(0);
- int maxLine = address.getMaxAddressLineIndex();
- if (maxLine >= 2) {
- add = address.getAddressLine(1) + address.getAddressLine(2);
- } else {
- add = address.getAddressLine(1);
- }
- } catch (IOException e) {
- add = "";
- e.printStackTrace();
- }
- return add;
- }
- /**
- *
- * 用线程异步获取
- */
- Runnable getAddressName = new Runnable() {
- public void run() {
- String addressName = "";
- while (true) {
- addressName = getLocationAddress(locPoint);
- if (!"".equals(addressName)) {
- break;
- }
- }
- Message msg = new Message();
- msg.what = MSG_VIEW_ADDRESSNAME;
- msg.obj = addressName;
- mHandler.sendMessage(msg);
- }
- };
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_VIEW_LONGPRESS:// 处理长按时间返回位置信息
- {
- if (null == locPoint)
- return;
- new Thread(getAddressName).start();
- desText.setVisibility(View.VISIBLE);
- desText.setText(lost_tips);
- mMapCtrl.animateTo(locPoint);
- mapView.invalidate();
- }
- break;
- case MSG_VIEW_ADDRESSNAME:
- desText.setText((String) msg.obj);
- desText.setVisibility(View.VISIBLE);
- if (statusBarHeight == 0) {
- Rect frame = new Rect();
- getWindow().getDecorView().getWindowVisibleDisplayFrame(
- frame);
- statusBarHeight = frame.top;
- point_Y -= statusBarHeight / 2;
- }
- break;
- case MSG_GONE_ADDRESSNAME:
- desText.setVisibility(View.GONE);
- break;
- }
- }
- };
- // 关闭程序也关闭定位
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- myLocation.destoryLocationManager();
- }
- }
六:在AndroidManifest.xml中不要忘了要添加访问网络和启动定位等的几个权限已经google地图库
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <uses-library android:name="com.google.android.maps" />
- <activity android:name="com.android.googlemap.MyMapActivity" android:screenOrientation="portrait"
- 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>
七:运行效果:
1
提示:如果没有出现地图只出现地址信息背景是网格的,那就是key的问题,根据开始的方法找到自己开发的eclipse中sdk的debug keystore位置重新申请key即可