--------------------------------------------准备工作-----------------------------------------

官网文档地址:https://developers.google.com/maps/documentation/android/

按照文档申请API_KEY,安装GooglePlayservices

--------------------------------------------AndroidManifest.xml---------------------------

<?xmlversion="1.0"encoding="utf-8"?>

<manifestxmlns:android="http://schemas.android.com/apk/res/android"

package="com.zfibs.travels"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="17"/>

<uses-feature

android:glEsVersion="0x00020000"

android:required="true"/>

<permission

android:name="com.zfibs.travels.permission.MAPS_RECEIVE"

android:protectionLevel="signature"/>

<uses-permissionandroid:name="com.zfibs.travels.permission.MAPS_RECEIVE"/>

<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permissionandroid:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

<!--ThefollowingtwopermissionsarenotrequiredtouseGoogleMapsAndroidAPIv2,butarerecommended.-->

<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-permissionandroid:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

<activity

android:name="com.zfibs.travels.MainActivity"

android:label="@string/app_name">

<intent-filter>

<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

<activityandroid:name=".MapActivity"></activity>

<meta-data

android:name="com.google.android.maps.v2.API_KEY"

android:value="AIzaSyBZpHp0fZJktlQlvb8czIP_hEAaZYPLd8w"/>

</application>

</manifest>

--------------------------------------------Layoutactivity_main.xml--------------------

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

<Button

android:id="@+id/loaction_but"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/loaction_str"/>

<Button

android:id="@+id/scenic_but"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/scenic_str"/>

<Button

android:id="@+id/hostel_but"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hostel_str"/>

<Button

android:id="@+id/restaurant_but"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/restaurant_str"/>

<Button

android:id="@+id/shop_but"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/shop_str"/>

<Button

android:id="@+id/draw_line"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/draw_line"/>

</LinearLayout>

--------------------------------------------Layoutactivity_map.xml---------------------

<fragmentxmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/map"

android:layout_width="match_parent"

android:layout_height="match_parent"

class="com.google.android.gms.maps.SupportMapFragment"/>

--------------------------------------------ActivityMainActivity.java--------------------

publicclassMainActivityextendsActivity{

/**当前位置按钮*/

privateButtonloaction_but=null;

/**风景按钮*/

privateButtonscenic_but=null;

/**旅店按钮*/

privateButtonhostel_but=null;

/**餐厅按钮*/

privateButtonrestaurant_but=null;

/**购物按钮*/

privateButtonshop_but=null;

/**多点连线*/

privateButtondraw_line=null;

/**跳转意图*/

privateIntentactivityIntent=null;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViews();

setListeners();

activityIntent=newIntent(this,MapActivity.class);

}

privatevoidfindViews(){

loaction_but=(Button)findViewById(R.id.loaction_but);

scenic_but=(Button)findViewById(R.id.scenic_but);

hostel_but=(Button)findViewById(R.id.hostel_but);

restaurant_but=(Button)findViewById(R.id.restaurant_but);

shop_but=(Button)findViewById(R.id.shop_but);

draw_line=(Button)findViewById(R.id.draw_line);

}

privatevoidsetListeners(){

loaction_but.setOnClickListener(newOnClickListenerImpl(0));

scenic_but.setOnClickListener(newOnClickListenerImpl(1));

hostel_but.setOnClickListener(newOnClickListenerImpl(2));

restaurant_but.setOnClickListener(newOnClickListenerImpl(3));

shop_but.setOnClickListener(newOnClickListenerImpl(4));

draw_line.setOnClickListener(newOnClickListenerImpl(5));

}

/*设置按钮的事件类*/

publicclassOnClickListenerImplimplementsOnClickListener{

privateintindex=0;

/**构造方法*/

publicOnClickListenerImpl(intindex){

this.index=index;

}

@Override

publicvoidonClick(Viewv){

activityIntent.putExtra("index",index);

startActivity(activityIntent);

}

}

}

--------------------------------------------ActivityMapActivity.java---------------------

packagecom.zfibs.travels;

importjava.util.LinkedList;

importjava.util.List;

importjava.util.Map;

importandroid.app.ProgressDialog;

importandroid.content.Context;

importandroid.graphics.Color;

importandroid.location.Criteria;

importandroid.location.Location;

importandroid.location.LocationListener;

importandroid.location.LocationManager;

importandroid.os.AsyncTask;

importandroid.os.Bundle;

importandroid.support.v4.app.FragmentActivity;

importandroid.util.Log;

importandroid.view.KeyEvent;

importandroid.view.Menu;

importandroid.widget.Toast;

importcom.google.android.gms.maps.CameraUpdateFactory;

importcom.google.android.gms.maps.GoogleMap;

importcom.google.android.gms.maps.SupportMapFragment;

importcom.google.android.gms.maps.UiSettings;

importcom.google.android.gms.maps.model.BitmapDescriptorFactory;

importcom.google.android.gms.maps.model.CameraPosition;

importcom.google.android.gms.maps.model.LatLng;

importcom.google.android.gms.maps.model.MarkerOptions;

importcom.google.android.gms.maps.model.Polyline;

importcom.google.android.gms.maps.model.PolylineOptions;

publicclassMapActivityextendsFragmentActivity{

privatestaticfinalStringapi_key="AIzaSyBZpHp0fZJktlQlvb8czIP_hEAaZYPLd8w";

privatestaticfinalintradius=5000;

privatestaticfinalStringlanguage="zh-CN";

privatestaticfinalStringkeywords="";

/**Google地图类*/

privatestaticGoogleMapgoogleMap=null;

/**位置管理器类*/

privateLocationManagerlocationManager=null;

/**查询得到多点List*/

privateList<LatLng>liLatLngs=null;

/**Google地图UI设置实体类*/

privateUiSettingsuiSettings=null;

/**查询附近信息返回的List信息*/

privateList<Map<String,String>>listMaps=null;

/**最佳的Provide*/

privateStringfineProvide="";

/**当前位置信息*/

privateLatLnglatLng=newLatLng(42.730070,-73.690570);

/**搜索位置详细信息*/

privateMap<String,String>locatInfo=null;

/**查询时候的进度框*/

privateProgressDialogprogressDialog=null;

/**查询附近信息的Type值*/

privateStringtypes="";

/**Google地图工具类*/

privateGoogleUtilgoogleUtil=null;

/**匹配的名称*/

privateStringname="";

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_map);

initActivityData();

dome(this.getIntent().getIntExtra("index",0));

}

/**

*初始化Activity基础数据信息

*/

privatevoidinitActivityData(){

//初始化地图信息

SupportMapFragmentsupportMapFragment=(SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

googleMap=supportMapFragment.getMap();

if(null!=googleMap){

uiSettings=googleMap.getUiSettings();

uiSettings.setMyLocationButtonEnabled(true);

}else{

Toast.makeText(this,"加载地图失败",Toast.LENGTH_SHORT).show();

}

googleUtil=newGoogleUtil();

//初始化位置管理器

locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);

getFineProvider();

locationManager.requestLocationUpdates(fineProvide,1000,0,locationListener);

}

privatevoiddome(intindex){

switch(index){

case0:

getFineProvider();//获取当前位置的坐标

newSearchAsyncTask(0).execute();

break;

case1://风景

types="painter";

newSearchAsyncTask(1).execute();

break;

case2://旅馆

types="lodging";

newSearchAsyncTask(1).execute();

break;

case3://餐厅

types="food|restaurant";

newSearchAsyncTask(1).execute();

break;

case4://购物

types="shopping_mall";

newSearchAsyncTask(1).execute();

break;

case5://多点连线

dealListPoints();

break;

}

}

/**

*处理多个点连线的信息

*/

privatevoiddealListPoints(){//根据数据库查询经过的经度和纬度信息

liLatLngs=newLinkedList<LatLng>();

liLatLngs.add(newLatLng(37.35,-122.0));

liLatLngs.add(newLatLng(37.45,-122.0));

liLatLngs.add(newLatLng(37.45,-122.2));

liLatLngs.add(newLatLng(37.35,-122.2));

liLatLngs.add(newLatLng(37.35,-122.0));

PolylineOptionsrectOptions=newPolylineOptions().addAll(liLatLngs);

Polylinepolyline=googleMap.addPolyline(rectOptions);

polyline.setColor(Color.RED);

for(inti=0;i<liLatLngs.size();i++){

//设置标识信息

googleMap.addMarker(newMarkerOptions().position(liLatLngs.get(i)).title("名称").snippet("描述...")

.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

if(i==liLatLngs.size()-1){

setMapCenter(liLatLngs.get(i));

}

}

}

/**

*获取最佳LocationProvifer

*/

@SuppressWarnings("unused")

privatevoidgetFineProvider(){

Criteriacriteria=newCriteria();

criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度

criteria.setAltitudeRequired(false);//不要求海拔

criteria.setBearingRequired(false);//不要求方位

criteria.setCostAllowed(false);//不允许有话费

criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗

this.fineProvide=locationManager.getBestProvider(criteria,true);

if(null==this.fineProvide){

this.fineProvide=LocationManager.GPS_PROVIDER;

}

Locationlocation=null;

//while(null!=location){

location=locationManager.getLastKnownLocation(fineProvide);

//}

if(null!=location){

latLng=newLatLng(location.getLatitude(),location.getLongitude());

setMapCenter(latLng);

}else{

Toast.makeText(this,"定位失败!",Toast.LENGTH_SHORT).show();

}

}

/**

*处理搜索和定位的信息类

*

*@authorfy

*

*/

privateclassSearchAsyncTaskextendsAsyncTask<Integer,String,Integer>{

privateintindex=0;

publicSearchAsyncTask(intindex){

this.index=index;

progressDialog=ProgressDialog.show(MapActivity.this,"请稍等...","获取数据中...",true);

progressDialog.setCancelable(true);

}

@Override

protectedvoidonPostExecute(Integerresult){

super.onPostExecute(result);

//更新UI

if(this.index==0){

if(null!=locatInfo){

googleMap.addMarker(newMarkerOptions().position(latLng).title(locatInfo.get("name"))

.snippet(locatInfo.get("address")).icon(BitmapDescriptorFactory.fromResource(R.drawable.location)));

setMapCenter(latLng);

}

}else{

if(null!=listMaps&&listMaps.size()>0){

for(inti=0;i<listMaps.size();i++){

//设置标识信息

googleMap.addMarker(newMarkerOptions().position(latLng).title(listMaps.get(i).get("name"))

.snippet(listMaps.get(i).get("address")).icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

}

}

}

}

@Override

protectedIntegerdoInBackground(Integer...arg0){

try{

if(index==0){//定位

if(null!=latLng){

locatInfo=googleUtil.queryByLatLng(latLng,language);

}

}else{//搜索附近信息

if(null!=latLng){

listMaps=googleUtil.queryByCondition(api_key,latLng,radius,keywords,language,name,types);

}

}

}catch(Exceptione){

e.printStackTrace();

}

progressDialog.dismiss();

returnnull;

}

}

/**

*位置发生改变时候的监听器

*/

LocationListenerlocationListener=newLocationListener(){

//Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数

@Override

publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){

}

//Provider被enable时触发此函数,比如GPS被打开

@Override

publicvoidonProviderEnabled(Stringprovider){

}

//Provider被disable时触发此函数,比如GPS被关闭

@Override

publicvoidonProviderDisabled(Stringprovider){

}

//当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发

@Override

publicvoidonLocationChanged(Locationlocation){

if(location!=null){

latLng=newLatLng(location.getLatitude(),location.getLongitude());

Log.i("fy","经度"+location.getLatitude());

Log.i("fy","纬度"+location.getLongitude());

//Toast.makeText(getApplicationContext(),+"|,Toast.LENGTH_LONG).show();

googleMap.addMarker(newMarkerOptions().position(latLng).title("名称...").snippet("描述..."));

}

}

};

/**

*设置视图的中心

*

*@paramlatLng

*/

publicstaticvoidsetMapCenter(LatLnglatLng){

//设置显示的级别

googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,15));

//Zoomin,animatingthecamera.

googleMap.animateCamera(CameraUpdateFactory.zoomIn());

//Zoomouttozoomlevel10,animatingwithadurationof2seconds.

googleMap.animateCamera(CameraUpdateFactory.zoomTo(10),2,null);

//构造一个CameraPosition关注山景和动画镜头的位置。

CameraPositioncameraPosition=newCameraPosition.Builder().target(latLng)//集映射到中心的山景

.zoom(17).bearing(90)//设置相机的方向东

.tilt(30)//设置相机的倾斜30度

.build();

googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

}

@Override

publicbooleanonCreateOptionsMenu(Menumenu){

getMenuInflater().inflate(R.menu.main,menu);

returntrue;

}

/***

*监听调用返回键的事件

*/

@Override

publicbooleanonKeyDown(intkeyCode,KeyEventevent){

if(keyCode==KeyEvent.KEYCODE_BACK){

if(null!=progressDialog&&progressDialog.isShowing()){

progressDialog.dismiss();

}else{

finish();

}

returnfalse;

}

returnfalse;

}

@Override

protectedvoidonDestroy(){

if(null!=progressDialog){

progressDialog.cancel();

}

super.onDestroy();

}

}

--------------------------------------------工具类GoogleUtil.java------------------------

packagecom.zfibs.travels;

importjava.io.InputStream;

importjava.net.URL;

importjava.util.HashMap;

importjava.util.LinkedList;

importjava.util.List;

importjava.util.Map;

importjava.util.Scanner;

importorg.json.JSONArray;

importorg.json.JSONObject;

importcom.google.android.gms.maps.model.LatLng;

/**

*GoogleMap的搜索工具

*

*@authorfy

*

*/

publicclassGoogleUtil{

privateStringURL_API1="http://maps.googleapis.com/maps/api/geocode/json?";

privateStringURL_API2="https://maps.googleapis.com/maps/api/place/search/json?";

privatestaticfinalStringAPI_KEY="AIzaSyBZpHp0fZJktlQlvb8czIP_hEAaZYPLd8w";

/**

*根据坐标点查询当前位置

*

*@paramlatLng

*@return

*/

publicMap<String,String>queryByLatLng(LatLnglatLng,Stringlanguage)throwsException{

StringURL_API=this.URL_API1;

Map<String,String>map=newHashMap<String,String>();

StringBufferbuf=newStringBuffer();

InputStreaminput=null;

URL_API+="latlng="+latLng.latitude+","+latLng.longitude;

URL_API+="&language="+language+"&sensor=false";

//http://maps.googleapis.com/maps/api/geocode/json?latlng=,&sensor=false

System.out.print("请求的URL="+URL_API);

try{

URLurl=newURL(URL_API);

input=url.openStream();

Scannerscan=newScanner(input);

while(scan.hasNext()){

buf.append(scan.next());//所有的数据都保存在字符串里面

}

}catch(Exceptione){

e.printStackTrace();

throwe;

}finally{

if(input!=null){

input.close();

}

}

System.out.println("查询得到的数据="+buf.toString());

JSONObjectallData=newJSONObject(buf.toString());

//获取连接状态

Stringstatus=allData.getString("status");

if("OK".equals(status)){

JSONArrayjsonArr=allData.getJSONArray("results");

JSONObjectjsonObj=jsonArr.getJSONObject(0);

map.put("address",jsonObj.getString("formatted_address"));

//map.put("icon",jsonObj.getString("icon"));

map.put("name",jsonObj.getString("name"));

System.out.print("查询得到的数据address="+jsonObj.getString("formatted_address"));

JSONObjectlocationJsonObj=jsonObj.getJSONObject("geometry").getJSONObject("location");

map.put("latitude",locationJsonObj.getString("lat"));

map.put("longitude",locationJsonObj.getString("lng"));

map.put("status","OK");

}else{

map.put("status","FAIL");

}

returnmap;

}

/**

*根据传入的条件信息查询附近信息

*

*@paramkeyAPI密钥

*@paramlocation即要在其周围检索地方信息的纬度/经度。必须指定为纬度、经度。

*@paramradius范围

*@paramsensor请求的设备是否会使用GPS等位置传感器

*@paramkeyword方建立索引的全部内容相匹配的字词(可选)

*@paramlanguage语言代码(可选)

*@paramname地方信息的名称进行匹配的字词(可选)

*@paramtypes指定类型相匹配的地方信息,类型应使用竖线符号(type1|type2|etc)进行分隔(可选)

*@returnList<Map<String,String>>

*/

publicList<Map<String,String>>queryByCondition(Stringkey,LatLnglatLng,intradius,Stringkeyword,

Stringlanguage,Stringname,Stringtypes)throwsException{

StringURL_API=this.URL_API2;

List<Map<String,String>>listMaps=newLinkedList<Map<String,String>>();

//*******************************************组装请求路径信息*********************//

//例子:https://maps.googleapis.com/maps/api/place/search/json?location=-33.8670522,151.1957362&radius=500&types=food&name=harbour&sensor=false&key=AddYourOwnKeyHere

URL_API+="location="+latLng.latitude+","+latLng.longitude+"&radius="+radius+"";

if(null!=keyword&&keyword.length()>0){//关键词

URL_API+="&keyword="+keyword;

}

if(null!=language&&language.length()>0){//语言

URL_API+="&language="+language;

}

if(null!=name&&name.length()>0){//匹配名称

URL_API+="&name="+name;

}

if(null!=types&&types.length()>0){//类型

URL_API+="&types="+types;

}

URL_API+="&sensor=true";

URL_API+="&key="+API_KEY+"";

System.out.print("请求的URL="+URL_API);

//*******************************************获取查询得到的返回值****//

StringBufferbuf=newStringBuffer();

InputStreaminput=null;

try{

URLurl=newURL(URL_API);

input=url.openStream();

Scannerscan=newScanner(input);

while(scan.hasNext()){

buf.append(scan.next());//所有的数据都保存在字符串里面

}

}catch(Exceptione){

e.printStackTrace();

throwe;

}finally{

if(input!=null){

input.close();

}

}

System.out.println("查询得到的数据="+buf.toString());

JSONObjectallData=newJSONObject(buf.toString());

//获取连接状态

Stringstatus=allData.getString("status");

if("OK".equals(status)){

JSONArrayjsonArr=allData.getJSONArray("results");

for(inti=0;i<jsonArr.length();i++){

Map<String,String>map=newHashMap<String,String>();

JSONObjectjsonObj=jsonArr.getJSONObject(i);

map.put("address",jsonObj.getString("formatted_address"));

map.put("icon",jsonObj.getString("icon"));

map.put("name",jsonObj.getString("name"));

System.out.println("查询得到的数据address="+jsonObj.getString("formatted_address"));

JSONObjectlocationJsonObj=jsonObj.getJSONObject("geometry").getJSONObject("location");

map.put("latitude",locationJsonObj.getString("lat"));

map.put("longitude",locationJsonObj.getString("lng"));

listMaps.add(map);

}

}

returnlistMaps;

}

}

--------------------------------------------运行效果-----------------------------------------

<!--EndFragment-->

更多相关文章

  1. Mac上Android(安卓)studio环境搭建
  2. android典型代码系列(十)------获取一个应用程序的权限信息(反射
  3. Android从SD卡中加载图片或读取信息
  4. android获取设备信息
  5. Android(安卓)添加桌面快捷方式操作
  6. Android(安卓)Studio实现Activity生命周期的7个方法Log打印日志
  7. Debug Android(安卓)and Linux suspend and resume
  8. 使用android中的aapt查看安卓apk包信息
  9. android平台解析epub格式的书籍信息

随机推荐

  1. Android的电话功能介绍
  2. android:背景选择器-selector
  3. 7.4作业 table应用之课程表
  4. html常用标签与应用场景
  5. 爆肝之我在html学导航表格
  6. HTMLa标签,img标签配合三种列表标签写出图
  7. HTML常用标签及应用场景
  8. OneForAll安装使用
  9. 表格和列表制作
  10. 我的第三课作业