百度地图定位demo

AS写的百度地图定位demo

版本V6.0.5

先上效果图

  

demo下载地址:http://download.csdn.net/download/shenyuanqing/9062447

主要步骤 

1.获取密钥,需要数字签名(SHA1)跟包名

2.下载相应功能SDK,jar放app/libs文件夹,so文件放app/src/main/jniLibs文件夹并添加依赖

3.根据百度API文档显示Hello BaiduMap

4. 绑定BDLocationListener监听器得到定位经纬度显示在屏幕中间

5.得到屏幕中间点的经纬度进行反向地图编码得到具体地址

6.PoiSearch进行地址搜索

7.正向地图编码即由搜索到的地址转换为经纬度

8.得到经纬度后,就可以显示在屏幕中间了

源码

[java]  view plain copy
  1. package com.shen.baidumaptest.activity;  
  2.   
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.widget.TextView;  
  8. import android.widget.Toast;  
  9.   
  10. import com.baidu.location.BDLocation;  
  11. import com.baidu.location.BDLocationListener;  
  12. import com.baidu.location.LocationClient;  
  13. import com.baidu.location.LocationClientOption;  
  14. import com.baidu.location.Poi;  
  15. import com.baidu.mapapi.SDKInitializer;  
  16. import com.baidu.mapapi.map.BaiduMap;  
  17. import com.baidu.mapapi.map.BitmapDescriptor;  
  18. import com.baidu.mapapi.map.BitmapDescriptorFactory;  
  19. import com.baidu.mapapi.map.MapStatus;  
  20. import com.baidu.mapapi.map.MapStatusUpdate;  
  21. import com.baidu.mapapi.map.MapStatusUpdateFactory;  
  22. import com.baidu.mapapi.map.MapView;  
  23. import com.baidu.mapapi.map.MyLocationConfiguration;  
  24. import com.baidu.mapapi.map.MyLocationData;  
  25. import com.baidu.mapapi.model.LatLng;  
  26. import com.baidu.mapapi.search.core.SearchResult;  
  27. import com.baidu.mapapi.search.geocode.GeoCodeResult;  
  28. import com.baidu.mapapi.search.geocode.GeoCoder;  
  29. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;  
  30. import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;  
  31. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;  
  32. import com.shen.baidumaptest.R;  
  33.   
  34. import java.util.List;  
  35.   
  36.   
  37. public class MainActivity extends BaseActivity {  
  38.     private MapView mapView=null;  
  39.     private BaiduMap baiduMap;  
  40.     private LocationClient locationClient=null;  
  41.     private BDLocationListener locationListener=new MyLocationListener();  
  42.     private double latitude,latitudeLocation;  
  43.     private double longitude,longitudeLocation;  
  44.     private String addressLocation;  
  45.     private GeoCoder search=null;  
  46.     private TextView tvAddress,tvCity;  
  47.     @Override  
  48.     protected void onCreate(Bundle savedInstanceState) {  
  49.         super.onCreate(savedInstanceState);  
  50.         SDKInitializer.initialize(getApplicationContext());  
  51.         setContentView(R.layout.activity_main);  
  52.         /**竖屏**/  
  53.         setOrientationPortrait();  
  54.         initView();  
  55.     }  
  56.   
  57.     private void initView(){  
  58.         tvAddress=(TextView) findViewById(R.id.tv_address);  
  59.         tvCity=(TextView) findViewById(R.id.tv_city);  
  60.         mapView=(MapView) findViewById(R.id.mapview);  
  61.         baiduMap=mapView.getMap();  
  62.         locationClient=new LocationClient(getApplicationContext());  
  63.         locationClient.registerLocationListener(locationListener);  
  64.         initLocation();  
  65.         locationClient.start();  
  66.   
  67.         /**滑屏触发地图状态改变监听器**/  
  68.         baiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {  
  69.             @Override  
  70.             public void onMapStatusChangeStart(MapStatus mapStatus) {  
  71.   
  72.             }  
  73.   
  74.             @Override  
  75.             public void onMapStatusChange(MapStatus mapStatus) {  
  76.   
  77.             }  
  78.   
  79.             /**屏幕中间的经纬度**/  
  80.             @Override  
  81.             public void onMapStatusChangeFinish(final MapStatus mapStatus) {  
  82.                 latitude = mapStatus.target.latitude;  
  83.                 longitude = mapStatus.target.longitude;  
  84.                 LatLng ptCenter = new LatLng(latitude, longitude);  
  85.                 search.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));  
  86.             }  
  87.         });  
  88.   
  89.         search=GeoCoder.newInstance();  
  90.         /**根据经纬度得到屏幕中心点地址**/  
  91.         search.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {  
  92.             @Override  
  93.             public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {  
  94.   
  95.             }  
  96.   
  97.             @Override  
  98.             public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {  
  99.                 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
  100.                     Toast.makeText(MainActivity.this"抱歉,未能找到结果", Toast.LENGTH_LONG).show();  
  101.                     return;  
  102.                 }  
  103.                 baiduMap.clear();  
  104.                 baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result.getLocation()));  
  105.                 addressLocation = result.getAddress();  
  106.                 tvAddress.setText(result.getAddress());  
  107.                 getCity();  
  108.             }  
  109.         });  
  110.   
  111.         /**跳转到搜索地址页面**/  
  112.         findViewById(R.id.tv_city).setOnClickListener(new View.OnClickListener() {  
  113.             @Override  
  114.             public void onClick(View v) {  
  115.                 Intent intent = new Intent(MainActivity.this, SearchActivity.class);  
  116.                 intent.putExtra("city", tvCity.getText().toString());  
  117.                 startActivityForResult(intent, 0);  
  118.             }  
  119.         });  
  120.   
  121.         /**返回定位点**/  
  122.         findViewById(R.id.rl_locating_point).setOnClickListener(new View.OnClickListener() {  
  123.             @Override  
  124.             public void onClick(View v) {  
  125.                 location(latitudeLocation,longitudeLocation);  
  126.             }  
  127.         });  
  128.     }  
  129.   
  130.     /**经纬度地址动画显示在屏幕中间**/  
  131.     private void location(double latitude,double longitude){  
  132.         LatLng ll = new LatLng(latitude, longitude);  
  133.         MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);  
  134.         baiduMap.animateMapStatus(msu);  
  135.         tvAddress.setText(addressLocation);  
  136.         getCity();  
  137.     }  
  138.   
  139.     /**接收异步返回的定位结果**/  
  140.     public class MyLocationListener implements BDLocationListener{  
  141.   
  142.         @Override  
  143.         public void onReceiveLocation(BDLocation location) {  
  144.             //Receive Location  
  145.             StringBuffer sb = new StringBuffer(256);  
  146.             sb.append("time : ");  
  147.             sb.append(location.getTime());  
  148.             sb.append("\nerror code : ");  
  149.             sb.append(location.getLocType());  
  150.             sb.append("\nlatitude : ");  
  151.             sb.append(location.getLatitude());  
  152.             sb.append("\nlontitude : ");  
  153.             sb.append(location.getLongitude());  
  154.             sb.append("\nradius : ");  
  155.             sb.append(location.getRadius());  
  156.             if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果  
  157.                 sb.append("\nspeed : ");  
  158.                 sb.append(location.getSpeed());// 单位:公里每小时  
  159.                 sb.append("\nsatellite : ");  
  160.                 sb.append(location.getSatelliteNumber());  
  161.                 sb.append("\nheight : ");  
  162.                 sb.append(location.getAltitude());// 单位:米  
  163.                 sb.append("\ndirection : ");  
  164.                 sb.append(location.getDirection());// 单位度  
  165.                 sb.append("\naddr : ");  
  166.                 sb.append(location.getAddrStr());  
  167.                 sb.append("\ndescribe : ");  
  168.                 sb.append("gps定位成功");  
  169.   
  170.             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果  
  171.                 sb.append("\naddr : ");  
  172.                 sb.append(location.getAddrStr());  
  173.                 //运营商信息  
  174.                 sb.append("\noperationers : ");  
  175.                 sb.append(location.getOperators());  
  176.                 sb.append("\ndescribe : ");  
  177.                 sb.append("网络定位成功");  
  178.             } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果  
  179.                 sb.append("\ndescribe : ");  
  180.                 sb.append("离线定位成功,离线定位结果也是有效的");  
  181.             } else if (location.getLocType() == BDLocation.TypeServerError) {  
  182.                 sb.append("\ndescribe : ");  
  183.                 sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");  
  184.             } else if (location.getLocType() == BDLocation.TypeNetWorkException) {  
  185.                 sb.append("\ndescribe : ");  
  186.                 sb.append("网络不同导致定位失败,请检查网络是否通畅");  
  187.             } else if (location.getLocType() == BDLocation.TypeCriteriaException) {  
  188.                 sb.append("\ndescribe : ");  
  189.                 sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");  
  190.             }  
  191.             sb.append("\nlocationdescribe : ");  
  192.             sb.append(location.getLocationDescribe());// 位置语义化信息  
  193.             List<Poi> list = location.getPoiList();// POI数据  
  194.             if (list != null) {  
  195.                 sb.append("\npoilist size = : ");  
  196.                 sb.append(list.size());  
  197.                 for (Poi p : list) {  
  198.                     sb.append("\npoi= : ");  
  199.                     sb.append(p.getId() + " " + p.getName() + " " + p.getRank());  
  200.                 }  
  201.             }  
  202.             Log.e("BaiduLocationApiDem", sb.toString());  
  203.             showCurrentPosition(location);  
  204.         }  
  205.     }  
  206.   
  207.     /**配置定位SDK参数**/  
  208.     private void initLocation(){  
  209.         LocationClientOption option=new LocationClientOption();  
  210.         option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);  
  211.         option.setCoorType("bd09ll");  
  212. //        int span=1000;  
  213. //        option.setScanSpan(span);  
  214.         option.setIsNeedAddress(true);  
  215.         option.setOpenGps(true);  
  216.         option.setLocationNotify(true);  
  217.         option.setIsNeedLocationDescribe(true);  
  218.         option.setIsNeedLocationPoiList(true);  
  219.         option.setIgnoreKillProcess(false);  
  220.         option.setEnableSimulateGps(false);  
  221.         locationClient.setLocOption(option);  
  222.     }  
  223.   
  224.     /**定位**/  
  225.     private void showCurrentPosition(BDLocation location){  
  226.         baiduMap.setMyLocationEnabled(true);  
  227.         MyLocationData locationData=new MyLocationData.Builder()  
  228.                 .accuracy(location.getRadius())  
  229.                 .direction(100).latitude(location.getLatitude())  
  230.                 .longitude(location.getLongitude()).build();  
  231. //        MyLocationConfiguration.LocationMode locationMode=MyLocationConfiguration.LocationMode.NORMAL;  
  232. //        BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);  
  233. //        MyLocationConfiguration config = new MyLocationConfiguration(locationMode, true, mCurrentMarker);  
  234. //        baiduMap.setMyLocationConfigeration(config);  
  235.         baiduMap.setMyLocationData(locationData);  
  236.         latitudeLocation=location.getLatitude();  
  237.         longitudeLocation=location.getLongitude();  
  238.         addressLocation=location.getAddrStr();  
  239.         location(latitudeLocation, longitudeLocation);  
  240.     }  
  241.   
  242.     /**根据搜索页面地名的经纬度定位**/  
  243.     protected void onActivityResult(int RequestCode,int ResultCode,Intent data){  
  244.         if(RequestCode==0){  
  245.             if(ResultCode==1){  
  246.                 location(Double.parseDouble(data.getStringExtra("latitude")),Double.parseDouble(data.getStringExtra("longitude")));  
  247.             }  
  248.         }  
  249.     }  
  250.   
  251.     /**得到当前所在城市**/  
  252.     private void getCity(){  
  253.         if(addressLocation!=null&&!addressLocation.equals("")){  
  254.             int indexProvince=addressLocation.indexOf("省");  
  255.             int indexCity=addressLocation.indexOf("市");  
  256.             tvCity.setText(addressLocation.substring(indexProvince + 1, indexCity));  
  257.         }  
  258.     }  
  259.   
  260.     @Override  
  261.     protected void onResume(){  
  262.         super.onResume();  
  263.         mapView.onResume();  
  264.     }  
  265.   
  266.     @Override  
  267.     protected  void onPause(){  
  268.         super.onPause();  
  269.         mapView.onPause();  
  270.     }  
  271.   
  272.     @Override  
  273.     protected void onDestroy(){  
  274.         super.onDestroy();  
  275.         mapView.onDestroy();  
  276.         if(locationClient!=null){  
  277.             locationClient.stop();  
  278.         }  
  279.     }  
  280. }  
SearchActiviy

[java]  view plain copy
  1. package com.shen.baidumaptest.activity;  
  2.   
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.text.Editable;  
  6. import android.text.TextWatcher;  
  7. import android.view.View;  
  8. import android.widget.AdapterView;  
  9. import android.widget.EditText;  
  10. import android.widget.ListView;  
  11.   
  12. import com.baidu.mapapi.search.core.PoiInfo;  
  13. import com.baidu.mapapi.search.geocode.GeoCodeOption;  
  14. import com.baidu.mapapi.search.geocode.GeoCodeResult;  
  15. import com.baidu.mapapi.search.geocode.GeoCoder;  
  16. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;  
  17. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;  
  18. import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;  
  19. import com.baidu.mapapi.search.poi.PoiCitySearchOption;  
  20. import com.baidu.mapapi.search.poi.PoiDetailResult;  
  21. import com.baidu.mapapi.search.poi.PoiResult;  
  22. import com.baidu.mapapi.search.poi.PoiSearch;  
  23. import com.shen.baidumaptest.R;  
  24. import com.shen.baidumaptest.adapter.SearchAdapter;  
  25.   
  26. import java.util.ArrayList;  
  27. import java.util.List;  
  28.   
  29.   
  30. public class SearchActivity extends BaseActivity {  
  31.     private EditText etSearch;  
  32.     private PoiSearch poiSearch;  
  33.     private List<PoiInfo> poiInfo;  
  34.     private SearchAdapter adapter;  
  35.     private GeoCoder search=null;  
  36.     private String city;  
  37.     @Override  
  38.     protected void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.         setContentView(R.layout.activity_address);  
  41.         goBack();  
  42.         setOrientationPortrait();  
  43.         initView();  
  44.     }  
  45.   
  46.     private void initView(){  
  47.         city=getIntent().getStringExtra("city");  
  48.         poiSearch=PoiSearch.newInstance();  
  49.         poiInfo=new ArrayList<>();  
  50.         adapter=new SearchAdapter(this,poiInfo);  
  51.         ListView listView=(ListView) findViewById(R.id.listview);  
  52.         listView.setAdapter(adapter);  
  53.         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  54.             @Override  
  55.             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  56.                 //根据所在城市的地址转换为经纬度  
  57.                 search.geocode(new GeoCodeOption().city(city).address(poiInfo.get(position).address));  
  58.             }  
  59.         });  
  60.   
  61.         search=GeoCoder.newInstance();  
  62.         /**得到经纬度**/  
  63.         search.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {  
  64.             @Override  
  65.             public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {  
  66.                 if (geoCodeResult.getLocation() != null) {  
  67.                     Intent intent = new Intent();  
  68.                     intent.putExtra("latitude", geoCodeResult.getLocation().latitude + "");  
  69.                     intent.putExtra("longitude", geoCodeResult.getLocation().longitude + "");  
  70.                     setResult(1, intent);  
  71.                     SearchActivity.this.finish();  
  72.                 }  
  73.             }  
  74.   
  75.             @Override  
  76.             public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {  
  77.   
  78.             }  
  79.         });  
  80.   
  81.         etSearch=(EditText) findViewById(R.id.et_search);  
  82.         etSearch.setText("");  
  83.         /**刷新查询数据**/  
  84.         etSearch.addTextChangedListener(new TextWatcher() {  
  85.             @Override  
  86.             public void beforeTextChanged(CharSequence s, int start, int count, int after) {  
  87.   
  88.             }  
  89.   
  90.             @Override  
  91.             public void onTextChanged(CharSequence s, int start, int before, int count) {  
  92.   
  93.             }  
  94.   
  95.             @Override  
  96.             public void afterTextChanged(Editable s) {  
  97.                 initData(etSearch.getText().toString());  
  98.             }  
  99.         });  
  100.     }  
  101.   
  102.     private void initData(String key){  
  103.         OnGetPoiSearchResultListener poiSearchResultListener=new OnGetPoiSearchResultListener() {  
  104.             @Override  
  105.             public void onGetPoiResult(PoiResult poiResult) {  
  106.                 poiInfo.clear();  
  107.                 if(poiResult.getAllPoi()!=null){  
  108.                     poiInfo.addAll(poiResult.getAllPoi());  
  109.                     adapter.notifyDataSetChanged();  
  110.                 }else{  
  111.                     adapter.notifyDataSetChanged();  
  112.                 }  
  113.             }  
  114.   
  115.             @Override  
  116.             public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {  
  117.   
  118.             }  
  119.         };  
  120.         poiSearch.setOnGetPoiSearchResultListener(poiSearchResultListener);  
  121.         poiSearch.searchInCity((new PoiCitySearchOption())  
  122.                 .city(city)  
  123.                 .keyword(key));  
  124.     }  
  125.   
  126.     private void goBack(){  
  127.         findViewById(R.id.iv_Back).setOnClickListener(new View.OnClickListener() {  
  128.             @Override  
  129.             public void onClick(View v) {  
  130.                 SearchActivity.this.finish();  
  131.             }  
  132.         });  
  133.     }  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package xgpushdemo.qt.an.appmap; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; /*** * 百度定位、导航 * */ public class MainActivity extends Activity { private Button clickbtn; private TextView txt1; private TextView txt2; private MapView mMapView = null; private BaiduMap mBaiduMap=null; //定位相关申明 private LocationClient locationClient; //是否第一次定位 private Boolean isFirstloc=true; //是否开启 private Boolean isStart=true; private String la; private String lo; private String city; public BDLocationListener myListener=new BDLocationListener() { @Override public void onReceiveLocation(BDLocation bdLocation) { if(bdLocation==null||mMapView==null) return; MyLocationData myLocationData= new MyLocationData.Builder().accuracy(bdLocation.getRadius()).direction(100). latitude(bdLocation.getLatitude()).longitude(bdLocation.getLongitude()).build(); mBaiduMap.setMyLocationData(myLocationData); city= bdLocation.getCity(); la=bdLocation.getLatitude()+""; lo=bdLocation.getLongitude()+""; // if(isFirstloc){ // isFirstloc=false; // LatLng ll=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude()); // MapStatusUpdate mapStatusUpdate= MapStatusUpdateFactory.newLatLngZoom(ll,16); // mBaiduMap.animateMapStatus(mapStatusUpdate); // } } };
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值