google地图demo
--------------------------------------------准备工作-----------------------------------------
官网文档地址: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-->
更多相关文章
- Mac上Android(安卓)studio环境搭建
- android典型代码系列(十)------获取一个应用程序的权限信息(反射
- Android从SD卡中加载图片或读取信息
- android获取设备信息
- Android(安卓)添加桌面快捷方式操作
- Android(安卓)Studio实现Activity生命周期的7个方法Log打印日志
- Debug Android(安卓)and Linux suspend and resume
- 使用android中的aapt查看安卓apk包信息
- android平台解析epub格式的书籍信息