什么网站源码做分类信息网站好,网页站点怎么命名,wordpress thepost,网站开发专业术语大全本文主要讲述利用百度地图API实现定位功能
第一步:下载SDK与申请KEY
参考链接#xff1a;Android 百度地图 SDK v3.0.0 #xff08;一#xff09; - Hongyang - 博客频道 - CSDN.NET
注意
百度地图SDK与百度定位SDK已经分开了#xff0c;如果在工程中同时导入这两个包…本文主要讲述利用百度地图API实现定位功能
第一步:下载SDK与申请KEY
参考链接Android 百度地图 SDK v3.0.0 一 - Hongyang - 博客频道 - CSDN.NET
注意
百度地图SDK与百度定位SDK已经分开了如果在工程中同时导入这两个包会冲突解决方法是下载包含这两个功能的SDK
参考链接 百度地图SDK和百度导航SDK合并冲突问题 - Singleton1900的专栏 - 博客频道 - CSDN.NET
代码实现
将地图中心点移到指定点实现
//设定中心点坐标
LatLng cenpt new LatLng(30.663791,104.07281);
//定义地图状态
MapStatus mMapStatus new MapStatus.Builder()
.target(cenpt)
.zoom(12)
.build();
//定义MapStatusUpdate对象以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
参考链接
百度地图一打开就自动将中心点移动到定位位置 - 开源中国社区
要实现定位功能得到经纬度
第一步配置Manifest文件
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidpackagecom.zj.mapdemoandroid:versionCode1android:versionName1.0 uses-permission android:namecom.android.launcher.permission.READ_SETTINGS /uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION /uses-permissionuses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION /uses-permissionuses-permission android:nameandroid.permission.ACCESS_WIFI_STATE /uses-permissionuses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permissionuses-permission android:nameandroid.permission.CHANGE_WIFI_STATE /uses-permissionuses-permission android:nameandroid.permission.READ_PHONE_STATE /uses-permissionuses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /uses-permissionuses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.MOUNT_UNMOUNT_FILESYSTEMS /uses-permissionuses-permission android:nameandroid.permission.READ_LOGS /uses-permissionuses-permission android:nameandroid.permission.VIBRATE /uses-permission android:nameandroid.permission.WAKE_LOCK /uses-permission android:nameandroid.permission.WRITE_SETTINGS /uses-sdkandroid:minSdkVersion8android:targetSdkVersion21 /applicationandroid:namecom.zj.mapdemo.LocationApplicationandroid:allowBackuptrueandroid:icondrawable/ic_launcherandroid:labelstring/app_nameandroid:themestyle/AppTheme serviceandroid:namecom.baidu.location.fandroid:enabledtrueandroid:process:remote intent-filteraction android:namecom.baidu.location.service_v2.2 /action/intent-filter/service meta-dataandroid:namecom.baidu.lbsapi.API_KEYandroid:valueB7h1TyUxC0nNGm4wsalDWHPnsCI9tNke /activityandroid:name.MainActivityandroid:labelstring/app_name intent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity/application/manifest
写Application文件,实例化LocationService
package com.zj.mapdemo;import com.baidu.mapapi.SDKInitializer;
import com.zj.mapdemo.LocationService;
import com.zj.mapdemo.WriteLog;
import android.app.Application;
import android.app.Service;
import android.os.Vibrator;/*** 主Application所有百度定位SDK的接口说明请参考线上文档http://developer.baidu.com/map/loc_refer/index.html** 百度定位SDK官方网站http://developer.baidu.com/map/index.php?titleandroid-locsdk* * 直接拷贝com.baidu.location.service包到自己的工程下简单配置即可获取定位结果也可以根据demo内容自行封装*/
public class LocationApplication extends Application {public LocationService locationService;public Vibrator mVibrator;Overridepublic void onCreate() {super.onCreate();/**** 初始化定位sdk建议在Application中创建*/locationService new LocationService(getApplicationContext());mVibrator (Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);WriteLog.getInstance().init(); // 初始化日志SDKInitializer.initialize(getApplicationContext()); }
}
locationService实现
package com.zj.mapdemo;import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import android.content.Context;/*** * author baidu**/
public class LocationService {private LocationClient client null;private LocationClientOption mOption,DIYoption;private Object objLock new Object();/**** * param locationContext*/public LocationService(Context locationContext){synchronized (objLock) {if(client null){client new LocationClient(locationContext);client.setLocOption(getDefaultLocationClientOption());}}}/**** * param listener* return*/public boolean registerListener(BDLocationListener listener){boolean isSuccess false;if(listener ! null){client.registerLocationListener(listener);isSuccess true;}return isSuccess;}public void unregisterListener(BDLocationListener listener){if(listener ! null){client.unRegisterLocationListener(listener);}}/**** * param option* return isSuccessSetOption*/public boolean setLocationOption(LocationClientOption option){boolean isSuccess false;if(option ! null){if(client.isStarted())client.stop();DIYoption option;client.setLocOption(option);}return isSuccess;}public LocationClientOption getOption(){return DIYoption;}/**** * return DefaultLocationClientOption*/public LocationClientOption getDefaultLocationClientOption(){if(mOption null){mOption new LocationClientOption();mOption.setLocationMode(LocationMode.Hight_Accuracy);//可选默认高精度设置定位模式高精度低功耗仅设备mOption.setCoorType(bd09ll);//可选默认gcj02设置返回的定位结果坐标系如果配合百度地图使用建议设置为bd09ll;mOption.setScanSpan(3000);//可选默认0即仅定位一次设置发起定位请求的间隔需要大于等于1000ms才是有效的mOption.setIsNeedAddress(true);//可选设置是否需要地址信息默认不需要mOption.setIsNeedLocationDescribe(true);//可选设置是否需要地址描述mOption.setNeedDeviceDirect(false);//可选设置是否需要设备方向结果mOption.setLocationNotify(false);//可选默认false设置是否当gps有效时按照1S1次频率输出GPS结果mOption.setIgnoreKillProcess(true);//可选默认true定位SDK内部是一个SERVICE并放到了独立进程设置是否在stop的时候杀死这个进程默认不杀死 mOption.setIsNeedLocationDescribe(true);//可选默认false设置是否需要位置语义化结果可以在BDLocation.getLocationDescribe里得到结果类似于“在北京天安门附近”mOption.setIsNeedLocationPoiList(true);//可选默认false设置是否需要POI结果可以在BDLocation.getPoiList里得到mOption.SetIgnoreCacheException(false);//可选默认false设置是否收集CRASH信息默认收集}return mOption;}public void start(){synchronized (objLock) {if(client ! null !client.isStarted()){client.start();}}}public void stop(){synchronized (objLock) {if(client ! null client.isStarted()){client.stop();}}}}
MainActivity实现
package com.zj.mapdemo;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;/**** 单点定位示例用来展示基本的定位结果配置在LocationService.java中* 默认配置也可以在LocationService中修改* 默认配置的内容自于开发者论坛中对开发者长期提出的疑问内容* * author baidu**/
public class MainActivity extends Activity {private LocationService locationService;private TextView LocationResult;private Button startLocation;double p1,p2;MapView mapView;BaiduMap mBaiduMap;Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);// -----------demo view config ------------SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.location);LocationResult (TextView) findViewById(R.id.textView1);LocationResult.setMovementMethod(ScrollingMovementMethod.getInstance());startLocation (Button) findViewById(R.id.addfence);mapView(MapView) findViewById(R.id.id_bmapView2);mBaiduMapmapView.getMap();startLocation.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {// TODO Auto-generated method stubmove(); }});}public void change(){//设定中心点坐标 LatLng cenpt new LatLng(30.663791,110.07281); //定义地图状态 MapStatus mMapStatus new MapStatus.Builder() .target(cenpt) .zoom(12) .build(); //定义MapStatusUpdate对象以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate MapStatusUpdateFactory.newMapStatus(mMapStatus); //改变地图状态 mBaiduMap.setMapStatus(mMapStatusUpdate);}/*** 显示请求字符串* * param str*/public void logMsg(String str) {try {if (LocationResult ! null)LocationResult.setText(str);} catch (Exception e) {e.printStackTrace();}}public void move(){// -----------location config ------------locationService ((LocationApplication) getApplication()).locationService; //获取locationservice实例建议应用中只初始化1个location实例然后使用可以参考其他示例的activity都是通过此种方式获取locationservice实例的locationService.registerListener(mListener);//注册监听int type getIntent().getIntExtra(from, 0);if (type 0) {locationService.setLocationOption(locationService.getDefaultLocationClientOption());} else if (type 1) {locationService.setLocationOption(locationService.getOption());}locationService.start();// 定位SDK// start之后会默认发起一次定位请求开发者无须判断isstart并主动调用requeststartLocation.setText(getString(R.string.stoplocation));Log.i(location,p1);if(p10){Log.i(location,p2);//设定中心点坐标 LatLng cenpt new LatLng(30,30); //定义地图状态 MapStatus mMapStatus new MapStatus.Builder() .target(cenpt) .zoom(12) .build(); //定义MapStatusUpdate对象以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate MapStatusUpdateFactory.newMapStatus(mMapStatus); //改变地图状态 mBaiduMap.setMapStatus(mMapStatusUpdate);}}Handler handlernew Handler(){public void handleMessage(android.os.Message msg) {Log.i(location,p2-------------------);//设定中心点坐标 LatLng cenpt new LatLng(p1,p2); //定义地图状态 MapStatus mMapStatus new MapStatus.Builder() .target(cenpt) .zoom(12) .build(); //定义MapStatusUpdate对象以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate MapStatusUpdateFactory.newMapStatus(mMapStatus); //改变地图状态 mBaiduMap.setMapStatus(mMapStatusUpdate);}};/**** Stop location service*/Overrideprotected void onStop() {// TODO Auto-generated method stublocationService.unregisterListener(mListener); //注销掉监听locationService.stop(); //停止定位服务super.onStop();}/*Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();// -----------location config ------------locationService ((LocationApplication) getApplication()).locationService; //获取locationservice实例建议应用中只初始化1个location实例然后使用可以参考其他示例的activity都是通过此种方式获取locationservice实例的locationService.registerListener(mListener);//注册监听int type getIntent().getIntExtra(from, 0);if (type 0) {locationService.setLocationOption(locationService.getDefaultLocationClientOption());} else if (type 1) {locationService.setLocationOption(locationService.getOption());}startLocation.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View v) {if (startLocation.getText().toString().equals(getString(R.string.startlocation))) {locationService.start();// 定位SDK// start之后会默认发起一次定位请求开发者无须判断isstart并主动调用requeststartLocation.setText(getString(R.string.stoplocation));//设定中心点坐标 LatLng cenpt new LatLng(30,30); //定义地图状态 MapStatus mMapStatus new MapStatus.Builder() .target(cenpt) .zoom(12) .build(); //定义MapStatusUpdate对象以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate MapStatusUpdateFactory.newMapStatus(mMapStatus); //改变地图状态 mBaiduMap.setMapStatus(mMapStatusUpdate);} else {locationService.stop();startLocation.setText(getString(R.string.startlocation));}}});}*//****** see copy funtion to you project* 定位结果回调重写onReceiveLocation方法可以直接拷贝如下代码到自己工程中修改**/private BDLocationListener mListener new BDLocationListener() {Overridepublic void onReceiveLocation(BDLocation location) {// TODO Auto-generated method stubif (null ! location location.getLocType() ! BDLocation.TypeServerError) {StringBuffer sb new StringBuffer(256);sb.append(time : );/*** 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来每次回调的时间* location.getTime() 是指服务端出本次结果的时间如果位置不发生变化则时间不变*/sb.append(location.getTime());sb.append(\nerror code : );sb.append(location.getLocType());sb.append(\nlatitude : );sb.append(location.getLatitude());p1location.getLatitude();Log.i(location, location.getLatitude()p1p1);sb.append(\nlontitude : );sb.append(location.getLongitude());Log.i(location, location.getLongitude());p2location.getLongitude();handler.sendEmptyMessage(0);sb.append(\nradius : );sb.append(location.getRadius());sb.append(\nCountryCode : );sb.append(location.getCountryCode());sb.append(\nCountry : );sb.append(location.getCountry());sb.append(\ncitycode : );sb.append(location.getCityCode());sb.append(\ncity : );sb.append(location.getCity());sb.append(\nDistrict : );sb.append(location.getDistrict());sb.append(\nStreet : );sb.append(location.getStreet());sb.append(\naddr : );sb.append(location.getAddrStr());sb.append(\nDescribe: );sb.append(location.getLocationDescribe());sb.append(\nDirection(not all devices have value): );sb.append(location.getDirection());sb.append(\nPoi: );if (location.getPoiList() ! null !location.getPoiList().isEmpty()) {for (int i 0; i location.getPoiList().size(); i) {Poi poi (Poi) location.getPoiList().get(i);sb.append(poi.getName() ;);}}if (location.getLocType() BDLocation.TypeGpsLocation) {// GPS定位结果sb.append(\nspeed : );sb.append(location.getSpeed());// 单位km/hsb.append(\nsatellite : );sb.append(location.getSatelliteNumber());sb.append(\nheight : );sb.append(location.getAltitude());// 单位米sb.append(\ndescribe : );sb.append(gps定位成功);} else if (location.getLocType() BDLocation.TypeNetWorkLocation) {// 网络定位结果// 运营商信息sb.append(\noperationers : );sb.append(location.getOperators());sb.append(\ndescribe : );sb.append(网络定位成功);} else if (location.getLocType() BDLocation.TypeOffLineLocation) {// 离线定位结果sb.append(\ndescribe : );sb.append(离线定位成功离线定位结果也是有效的);} else if (location.getLocType() BDLocation.TypeServerError) {sb.append(\ndescribe : );sb.append(服务端网络定位失败可以反馈IMEI号和大体定位时间到loc-bugsbaidu.com会有人追查原因);} else if (location.getLocType() BDLocation.TypeNetWorkException) {sb.append(\ndescribe : );sb.append(网络不同导致定位失败请检查网络是否通畅);} else if (location.getLocType() BDLocation.TypeCriteriaException) {sb.append(\ndescribe : );sb.append(无法获取有效定位依据导致定位失败一般是由于手机的原因处于飞行模式下一般会造成这种结果可以试着重启手机);}logMsg(sb.toString());}}};
}
主要思路是先利用百度提供的例子得到当前经纬度然后handler发送消息接收消息后当前地图中心平移到当前位置
注意百度地图版本较多以官方例子为准不然会出很多BUG
效果如下