当前位置: 代码迷 >> Android >> Android基于Google 地图 V2map开发基础
  详细解决方案

Android基于Google 地图 V2map开发基础

热度:361   发布时间:2016-04-28 07:02:27.0
Android基于Google map V2地图开发基础

参考资料

google?map?v2?api网址:

https://developers.google.com/maps/documentation/android/map

google?map?v2?官方用例网址:

https://developers.google.com/maps/documentation/android/utility/

基础开发环境配置网址:

http://www.cnblogs.com/linzhichao86/p/Android_GoogleMap.html

http://www.androidhive.info/2013/08/android-working-with-google-maps-v2/

其他的参考资料网址:

http://blog.csdn.net/mad1989/article/category/1121318

http://tech.it168.com/a2012/0309/1322/000001322925.shtml

?

?

知识整理

1.安装google?setting?和?google?store?

???请确保你的手机上安装这2个软件

2.下载?Google?play?services

???打开Eclipse???Windows???Android?SDK?Manager,选择Extra选项下的Google?play?services,下载该选项。

??下载完成后该lib位置在

??android-sdk-windows\extras\google\google_play_services\libproject\google-play-services_lib

??为项目引用该lib,Eclipse???Android???Library?,选择add

3.SHA获取

???SHA网络上获取有几种方式,这边列出2种。

(1)Keytool

?????Keytool这个文件一般位于%JAVA_HOME%/bin目录下,如果是Linux系统,则位于?

$JAVA_HOME/bin下的,比如windows下在C:\programs\Java\jdk1.6.0_18\bin下。

输入命令:

Window系统:

????Keytool?-list?-v?-keystore?"%USERPROFILE%\.android\debug.keystore"?

????-alias?androiddebugkey?-storepass?android?-keypass?android

linux?or?Mac?OS系统:

????keytool?-list?-v?-keystore?~/.android/debug.keystore?-alias?androiddebugkey?

????-storepass?android?-keypass?android

(2)较为快捷的方式

Eclipse???Android? Build,SHA1 fingerprint的值

4.注册Google?mail账号

???需要google?mail的账号,当然如果你有,就可以直接跳过这步骤了。

5.Google?map?v2?key值获取

??终于快结束了环境配置了,Key值获取的网址如下:

https://code.google.com/apis/console/

打开google?map?android?api?v2服务,接着选择API?access,点击选择Create?new?Android?key.....,在弹出框内,输入获取SHA,输入格式为SHA;你的项目包名(如果你换掉IDE(eclipse)或者换掉包名都需要重新申请——我没试过换掉eclipse是否要重新申请的情况)

代码片段:

1.AndroidMainfest.xml配置文件配置

??

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.googlemap"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="9"        android:targetSdkVersion="9" />    <!--begin-->    <permission        android:name="com.googlemap.permission.MAPS_RECEIVE"        android:protectionLevel="signature" />  <uses-permission android:name="com.map.permission.MAPS_RECEIVE" />   <!--end api可下载地图,注意com.googlemap替换为项目包名----------------------->    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!--允许API可存取Google web-based 服务-->  <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />    <!--允许网络定位-->  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <!--允许GPS定位-->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <!--Google Maps Android API 2会使用到OpenGL ES version 2,所以添加此特性,以免Google Play Store 认为APP不支持OpenGL ES version 2-->    <uses-feature        android:glEsVersion="0x00020000"        android:required="true" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >              <!--注意com.googlemap替换为项目包名,android:value值更改为申请的KEY-->        <meta-data            android:name="com.google.android.maps.v2.API_KEY"            android:value="your key" />                <activity            android:name="com.googlemap.MainActivity2"            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>

?

?

?

2.Xml布局文件

?

 <?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:map="http://schemas.android.com/apk/res-auto"      android:layout_width="match_parent"     android:layout_height="match_parent">    <!--sdk 3.1即(API12)之前的版本为com.google.android.gms.maps.SupportMapFragment,其他版本则为com.google.android.gms.maps.MapFragment-->    <fragment        android:id="@+id/googlemap"        android:layout_width="match_parent"        android:layout_height="match_parent"        class="com.google.android.gms.maps.SupportMapFragment" />   </RelativeLayout>

?

?

?

?

?

3.地图初始显示

??

 /**sdk 3.1即(API12)之前的版本需要继承FragmentActivity,其他版本则无需*/  public class MainActivity extends FragmentActivity {     @Override     protected void onCreate(Bundle arg0) {         super.onCreate(arg0);         setContentView(R.layout.main);     }}

?

?

?

4.定位

?????定位自己当前的位置,使用到LocationManager类,代码如下:

?

????

 /**初始化GoogleMap*/if (null == mGoogleMap) {//此处初始化方法为sdk3.1(API12)之前的版本    mGoogleMap = ((SupportMapFragment)   getSupportFragmentManager().findFragmentById(R.id.nav_testmap)).getMap();} /**if (null == mGoogleMap) {    mGoogleMap =             ((MapFragment) this.findFragmentById(R.id.nav_testmap)).getMap();}*/     /**定位自己当前位置*/void getPointLocation() {      Criteria criteria = new Criteria();     // ACCURACY_FINE 较高精确度     criteria.setAccuracy(Criteria.ACCURACY_FINE);     criteria.setAltitudeRequired(false);     criteria.setBearingRequired(false);     criteria.setCostAllowed(true);     criteria.setPowerRequirement(Criteria.POWER_LOW);     //获取LocationManager对象     locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);     //provider的Criteria.ACCURACY_FINE精确度不是最精确的     //若正式环境改为精确度最高的     //LocationManager.GPS_PROVIDER     provider = locationManager.getBestProvider(criteria, true);     locationListener = new LocationListener() {       @Override      public void onStatusChanged(String provider, int status,         Bundle extras) {      }       @Override      public void onProviderEnabled(String provider) {        }      @Override    public void onProviderDisabled(String provider) {       }      @Override     public void onLocationChanged(Location location) {   	 //获取当前位置        lat = location.getLatitude();        lng = location.getLongitude();      }     };         //返回缓存中的位置信息(上次获取的位置信息) location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER); location = locationManager.getLastKnownLocation(locationManager.NETWORK_PROVIDER); //注册周期性位置更新,第二个参数为最短更新时间,第三个参数为最短更新距离 locationManager.requestLocationUpdates(provider, 0, 0,locationListener);} //移除位置监听locationManager.removeUpdates(locationListener); 

?

?

?

5.标识

???标识位置,使用到的类Marker,代码如下:

? ?

 marker = mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(lat, lng)).title("lat:" + lat + " lng:" + lng).snippet("我的位置"));

?

?

???你可以设置markericon图标

?

// GREEN color iconmarker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));// Changing your own marker iconmarker.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon)));

?

?

6.镜头定位移动

?

cameraPosition = new CameraPosition.Builder().target(new LatLng(lat, lng)).zoom(17).bearing(0).tilt(20).build();mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

?

?

?

7.路线绘制

  start = new LatLng(22.43040815, 114.20932812);  			   end = new LatLng(22.410410, 114.247622);    //移除地图上的覆盖物  mGoogleMap.clear();  wayLine(start, end);    /**路线绘制*/    private void wayLine(LatLng start, LatLng end) {  	  String url = navUtil.getDirectionsUrl(start, end);  	  NavUtil.googleMapRouteTask gRouteTask = navUtil.new googleMapRouteTask(  				url);  	  gRouteTask.execute(url);  }      /**组合成googlemap direction所需要的url*/	public String getDirectionsUrl(LatLng origin, LatLng dest) {		// Origin of route		String str_origin = "origin=" + origin.latitude + ","				+ origin.longitude;		// Destination of route		String str_dest = "destination=" + dest.latitude + "," + dest.longitude;		// Sensor enabled		String sensor = "sensor=false";		// Travelling Mode		String mode = "mode=driving";		// String waypointLatLng = "waypoints="+"40.036675"+","+"116.32885";		// 如果使用途径点,需要添加此字段		// String waypoints = "waypoints=";		String parameters = null;		// Building the parameters to the web service		parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode;		// parameters = str_origin + "&" + str_dest + "&" + sensor + "&"		// + mode+"&"+waypoints;		// Output format		// String output = "json";		String output = "xml";		// Building the url to the web service		String url = "https://maps.googleapis.com/maps/api/directions/"				+ output + "?" + parameters;		System.out.println("getDerectionsURL--->: " + url);		return url;	}  	     /**异步请求获取导航数据*/	public class googleMapRouteTask extends			AsyncTask<String, Void, List<LatLng>> {		HttpClient client;		String url;		List<LatLng> routes = null;		public googleMapRouteTask(String url) {			this.url = url;		}		@Override		protected List<LatLng> doInBackground(String... params) {			HttpGet get = new HttpGet(url);			try {				HttpResponse response = client.execute(get);				int statusecode = response.getStatusLine().getStatusCode();				System.out.println("response:" + response + "      statuscode:"						+ statusecode);				if (statusecode == 200) {					String responseString = EntityUtils.toString(response							.getEntity());					int status = responseString.indexOf("<status>OK</status>");					System.out.println("status:" + status);					if (-1 != status) {						int pos = responseString.indexOf("<overview_polyline>");						pos = responseString.indexOf("<points>", pos + 1);						int pos2 = responseString.indexOf("</points>", pos);						responseString = responseString								.substring(pos + 8, pos2);						routes = decodePoly(responseString);					} else {						// 错误代码,						return null;					}				} else {					// 请求失败					return null;				}			} catch (ClientProtocolException e) {				e.printStackTrace();			} catch (IOException e) {				e.printStackTrace();			}			System.out.println("doInBackground:"+routes);			return routes;		}		@Override		protected void onPreExecute() {			client = new DefaultHttpClient();			client.getParams().setParameter(					CoreConnectionPNames.CONNECTION_TIMEOUT, 15000);			client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,					15000);			super.onPreExecute();		}		@Override		protected void onPostExecute(List<LatLng> routes) {			super.onPostExecute(routes);			if (routes == null) {				// 导航失败				Toast.makeText(context, "没有搜索到线路", Toast.LENGTH_LONG).show();			}			else{				//地图描点				PolylineOptions lineOptions = new PolylineOptions();				lineOptions.addAll(routes);				lineOptions.width(3);				lineOptions.color(Color.BLUE);				mGoogleMap.addPolyline(lineOptions);				//定位到第0点经纬度			mGoogleMap.animateCamera(CameraUpdateFactory.newLatLng(routes.get(0)));			}		}	}      /**解析返回xml中overview_polyline的路线编码*/	private List<LatLng> decodePoly(String encoded) {		List<LatLng> poly = new ArrayList<LatLng>();		int index = 0, len = encoded.length();		int lat = 0, lng = 0;		while (index < len) {			int b, shift = 0, result = 0;			do {				b = encoded.charAt(index++) - 63;				result |= (b & 0x1f) << shift;				shift += 5;			} while (b >= 0x20);			int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));			lat += dlat;			shift = 0;			result = 0;			do {				b = encoded.charAt(index++) - 63;				result |= (b & 0x1f) << shift;				shift += 5;			} while (b >= 0x20);			int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));			lng += dlng;			LatLng p = new LatLng((((double) lat / 1E5)),					(((double) lng / 1E5)));			poly.add(p);		}		return poly;	}

?

?

  相关解决方案