主要代码如下:
package com.easyway.android.google; import java.io.IOException; import java.util.List; import java.util.Locale; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; /** * 在定位方面可以通过LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDER两种方式获取定位位置。 * 除了直接使用LocationManager提供的静态Provider(如GPS_PROVIDER和NETWORK_PROVIDER等)外,还可以使用我们自 * 己创建的LocationProvider对象。 *创建LocationProvider对象一般要先创建Criteria对象,来设置我们的LocationProvider要满足什么样的标准 *Criteria myCri=new Criteria(); *myCri.setAccuracy(Criteria.ACCURACY_FINE);//精确度 *myCri.setAltitudeRequired(false);//海拔不需要 *myCri.setBearingRequired(false);//Bearing是“轴承”的意思,此处可理解为地轴线之类的东西,总之Bearing Information *是一种地理位置信息的描述 *myCri.setCostAllowed(true);//允许产生现金消费 *myCri.setPowerRequirement(Criteria.POWER_LOW);//耗电 *String myProvider=locMan.getBestProvider(myCri,true); * * * 运行成功之后地图定位到当前所在位置 * * * 运行须知: * 1.在创建项目时选择包含Google Api的Android SDK * <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="GoogleAPK" * /> * 2.必须具有访问地图和网络的权限程序需要实时的从Google地图库中读取信息,所以添加接入Internet权限。 * <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> * <uses-permission android:name="android.permission.INTERNET" /> * 3.在AndroidManifest.xml中配置必须添加香瓜的用于类库userlibary * <uses-library android:name="com.google.android.maps" /> * * 例如: * <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> * <uses-library android:name="com.google.android.maps" /> * <activity android:name=".AndroidGoogleMapActivity" * 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> * 4.AndroidGoogleMapActivity文件。在这个activity中我们继承了一个特别的类叫做:MapActivity 。 * * * @author longgangbai * */ public class AndroidGoogleMapActivity extends MapActivity { private MapView mapView; MapController mapController; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mapView=(MapView)findViewById(R.id.mapView); this.mapView.setBuiltInZoomControls(true);//可以多点触摸放大 mapView.setSatellite(true);//使用卫星图 //1.定位地图中要查看的经纬度 GeoPoint point=new GeoPoint(39000000, 116000000); this.mapController=mapView.getController(); this.mapController.animateTo(point);//通过动画方式移动到指定坐标 Log.i("welcome", "created map activity!"); //2.自动定位功能功能由于种种原因不可以 //获取定位设置对象 //Location location = getLocationManager(); //获取当前的经纬度 //getCurrentLocation(location); //3.根据输入的地址查询相关的地址 queryLocationByAddress("苏州科技城高新软件园"); } /** * 根据地址查询相关的经纬度 * @param address * @throws IOException */ public void queryLocationByAddress(String locationName) { //根据本地Locale获取地点 Locale locale=Locale.getDefault(); //创建Geocoder解析地址 Geocoder gc=new Geocoder(AndroidGoogleMapActivity.this,locale/* Locale.CHINA */);//Locale是java.util中的一个类 //gc.getFromLocation(latitude, longitude, 1); List<Address> addressList; try { addressList = gc.getFromLocationName(locationName, 1); StringBuilder buffer=new StringBuilder(); if(addressList!=null&&addressList.size()>0){ Address address=addressList.get(0); for (int i=0;i<address.getMaxAddressLineIndex();i++) { buffer.append(address.getAddressLine(i)).append(" \n"); } double latitude=address.getLatitude()*1E6;//经度 double longitude=address.getLongitude()*1E6; //纬度 //定位到输入地址 queryAddressByLocation(new GeoPoint((int)latitude, (int)longitude)); //显示该地址的信息 buffer.append("经度为:"+latitude+"纬度为"+longitude).append("\n"); buffer.append(address.getLocality()).append("\n"); buffer.append(address.getPostalCode()).append("\n"); buffer.append(address.getCountryName ()).append("\n"); Log.v("tag", "latitude " + latitude + " longitude:" + longitude ); //创建对话框 AlertDialog.Builder builder=new Builder(AndroidGoogleMapActivity.this); builder.setTitle("当前的经纬度") .setMessage(buffer) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create() .show(); } }catch (IOException e) { e.printStackTrace(); } } /** * 获取定位管理器 * @return */ private Location getLocationManager() { Criteria mCriteria = new Criteria(); mCriteria.setAccuracy(Criteria.ACCURACY_FINE); mCriteria.setAltitudeRequired(false); mCriteria.setBearingRequired(false); mCriteria.setCostAllowed(true); mCriteria.setPowerRequirement(Criteria.POWER_LOW); //获取定位管理器 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.getBestProvider(mCriteria, true); //基于GPS定位的功能的 //GPS功能必须开启,在真机才可以模拟 Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if(location==null){ //采用基于网络的,必须在公共上ip注册的才可以使用此种方式 location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); } return location; } /** * * @param latitude * @param longitude */ public void queryAddressByLocation(GeoPoint p){ //GeoPoint geoGPSLocation = new GeoPoint((int)(m_CurrentLocation.getLatitude()*1000000), (int)(m_CurrentLocation.getLongitude()*1000000)); //Android中提供了一个叫ZoomControls的控件对地图来进行放大和缩小处理。 mapView.displayZoomControls(true);//显示地图缩放的按钮 mapController.animateTo(p);//带动画移到p点 mapController.setZoom(7); } /** * 这里需要一个名叫isRouteDisplayed()的方法,这个方法是必须的。用来获取地图API密匙,一旦获得就会传给上边提到的apiKey这个变量。 */ @Override protected boolean isRouteDisplayed() { return false; } }
main.xml
<?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" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <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="0S3Q4ZaVtVDhibBF6eIGl30D9JDmXVdvP4sQvnQ" /> </LinearLayout> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.easyway.android.google" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <uses-library android:name="com.google.android.maps" /> <activity android:name=".AndroidGoogleMapActivity" 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> <!-- --> <uses-permission android:name="android.permission.INTERNET" /> </manifest>