第三方SDK:百度地图(二)定位 + 鹰眼轨迹
#1 基础地图 + 基础定位#
可以看到地图的界面。
如图:
Menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"tools:context="com.cqc.baidumapdemo02.MainActivity" ><itemandroid:id="@+id/menu_normal"android:showAsAction="never"android:title="普通图"/><itemandroid:id="@+id/menu_satellite"android:showAsAction="never"android:title="卫星图"/><itemandroid:id="@+id/menu_none"android:showAsAction="never"android:title="空白图"/><itemandroid:id="@+id/menu_traffic"android:showAsAction="never"android:title="交通图"/><itemandroid:id="@+id/menu_mylocation"android:showAsAction="never"android:title="定位我的位置"/><itemandroid:id="@+id/menu_location_normal"android:showAsAction="never"android:title="普通模式"/><itemandroid:id="@+id/menu_location_follow"android:showAsAction="never"android:title="跟随模式"/><itemandroid:id="@+id/menu_location_compass"android:showAsAction="never"android:title="罗盘模式"/></menu>
MainActivity.java
package com.imooc.baidumap;import java.util.List;import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
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.BaiduMap.OnMapClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.imooc.baidumap.MyOrientationListener.OnOrientationListener;public class MainActivity extends Activity
{private MapView mMapView;private BaiduMap mBaiduMap;private Context context;// 定位相关private LocationClient mLocationClient;private MyLocationListener mLocationListener;private boolean isFirstIn = true;private double mLatitude;private double mLongtitude;// 自定义定位图标private BitmapDescriptor mIconLocation;private MyOrientationListener myOrientationListener;private float mCurrentX;private LocationMode mLocationMode;// 覆盖物相关private BitmapDescriptor mMarker;private RelativeLayout mMarkerLy;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// requestWindowFeature(Window.FEATURE_NO_TITLE);// 在使用SDK各组件之前初始化context信息,传入ApplicationContext// 注意该方法要再setContentView方法之前实现
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY,
// WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);this.context = this;initView();// 初始化定位initLocation();initMarker();mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener(){@Overridepublic boolean onMarkerClick(Marker marker){Bundle extraInfo = marker.getExtraInfo();Info info = (Info) extraInfo.getSerializable("info");ImageView iv = (ImageView) mMarkerLy.findViewById(R.id.id_info_img);TextView distance = (TextView) mMarkerLy.findViewById(R.id.id_info_distance);TextView name = (TextView) mMarkerLy.findViewById(R.id.id_info_name);TextView zan = (TextView) mMarkerLy.findViewById(R.id.id_info_zan);iv.setImageResource(info.getImgId());distance.setText(info.getDistance());name.setText(info.getName());zan.setText(info.getZan() + "");InfoWindow infoWindow;TextView tv = new TextView(context);tv.setBackgroundResource(R.drawable.location_tips);tv.setPadding(30, 20, 30, 50);tv.setText(info.getName());tv.setTextColor(Color.parseColor("#ffffff"));final LatLng latLng = marker.getPosition();Point p = mBaiduMap.getProjection().toScreenLocation(latLng);p.y -= 47;LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);infoWindow = new InfoWindow(tv, ll,new OnInfoWindowClickListener(){@Overridepublic void onInfoWindowClick(){mBaiduMap.hideInfoWindow();}});mBaiduMap.showInfoWindow(infoWindow);mMarkerLy.setVisibility(View.VISIBLE);return true;}});mBaiduMap.setOnMapClickListener(new OnMapClickListener(){@Overridepublic boolean onMapPoiClick(MapPoi arg0){return false;}@Overridepublic void onMapClick(LatLng arg0){mMarkerLy.setVisibility(View.GONE);mBaiduMap.hideInfoWindow();}});}private void initMarker(){mMarker = BitmapDescriptorFactory.fromResource(R.drawable.maker);mMarkerLy = (RelativeLayout) findViewById(R.id.id_maker_ly);}private void initLocation(){mLocationMode = LocationMode.NORMAL;mLocationClient = new LocationClient(this);mLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(mLocationListener);LocationClientOption option = new LocationClientOption();option.setCoorType("bd09ll");option.setIsNeedAddress(true);option.setOpenGps(true);option.setScanSpan(1000);mLocationClient.setLocOption(option);// 初始化图标mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);myOrientationListener = new MyOrientationListener(context);myOrientationListener.setOnOrientationListener(new OnOrientationListener(){@Overridepublic void onOrientationChanged(float x){mCurrentX = x;}});}private void initView(){mMapView = (MapView) findViewById(R.id.id_bmapView);mBaiduMap = mMapView.getMap();MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);mBaiduMap.setMapStatus(msu);}@Overrideprotected void onResume(){super.onResume();// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onStart(){super.onStart();// 开启定位mBaiduMap.setMyLocationEnabled(true);if (!mLocationClient.isStarted())mLocationClient.start();// 开启方向传感器myOrientationListener.start();}@Overrideprotected void onPause(){super.onPause();// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onPause();}@Overrideprotected void onStop(){super.onStop();// 停止定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();// 停止方向传感器myOrientationListener.stop();}@Overrideprotected void onDestroy(){super.onDestroy();// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}@Overridepublic boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item){switch (item.getItemId()){case R.id.id_map_common:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.id_map_site:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case R.id.id_map_traffic:if (mBaiduMap.isTrafficEnabled()){mBaiduMap.setTrafficEnabled(false);item.setTitle("实时交通(off)");} else{mBaiduMap.setTrafficEnabled(true);item.setTitle("实时交通(on)");}break;case R.id.id_map_location:centerToMyLocation();break;case R.id.id_map_mode_common:mLocationMode = LocationMode.NORMAL;break;case R.id.id_map_mode_following:mLocationMode = LocationMode.FOLLOWING;break;case R.id.id_map_mode_compass:mLocationMode = LocationMode.COMPASS;break;case R.id.id_add_overlay:addOverlays(Info.infos);break;default:break;}return super.onOptionsItemSelected(item);}/*** 添加覆盖物* * @param infos*/private void addOverlays(List<Info> infos){mBaiduMap.clear();LatLng latLng = null;Marker marker = null;OverlayOptions options;for (Info info : infos){// 经纬度latLng = new LatLng(info.getLatitude(), info.getLongitude());// 图标options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);marker = (Marker) mBaiduMap.addOverlay(options);Bundle arg0 = new Bundle();arg0.putSerializable("info", info);marker.setExtraInfo(arg0);}MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.setMapStatus(msu);}/*** 定位到我的位置*/private void centerToMyLocation(){LatLng latLng = new LatLng(mLatitude, mLongtitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);}private class MyLocationListener implements BDLocationListener{@Overridepublic void onReceiveLocation(BDLocation location){MyLocationData data = new MyLocationData.Builder()//.direction(mCurrentX)//.accuracy(location.getRadius())//.latitude(location.getLatitude())//.longitude(location.getLongitude())//.build();mBaiduMap.setMyLocationData(data);// 设置自定义图标MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, mIconLocation);mBaiduMap.setMyLocationConfigeration(config);// 更新经纬度mLatitude = location.getLatitude();mLongtitude = location.getLongitude();if (isFirstIn){LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);isFirstIn = false;Toast.makeText(context, location.getAddrStr(),Toast.LENGTH_SHORT).show();}}}}
2 只使用基础定位
copy 基础定位 文档即可。http://lbsyun.baidu.com/index.php?title=android-locsdk
注意:只是实现基础定位功能,是不需要在application中声明context的!!!!
步骤:
1 获取密钥:key
2 环境配置
3 获取位置1 创建LocationClient 和 BDLocationListener对象2 给LocationClient 对象设置参数,和注册监听3 开启定位
1 获取密钥:key
这个再讲了,见百度地图(一):HelloBaiDuMap,或者官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key
2 环境配置
步骤:
1 先下载基础定位SDK
2 配置jar+so文件
3 配置AndoridManifest.xml(网络权限 + 定位service + 定位key)
先下载基础定位:
只需要下载这一个即可,不需要其他的,不需要基础地图(这次只定位,不看图)
配置jar+so文件
将jar文件放入libs文件夹中,在project结构中,src/main下创建jniLibs文件夹,将各架构下的so文件放入其中。见下图:
配置AndoridManifest.xml(网络权限 + 定位service + 定位key)
网络权限:
<!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET"/><!-- SD卡读取权限,用户写入离线定位数据--><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
声明定位service:
<!--声明定位service--><service
android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service>
有的版本指定service,所以要看清下载的sdk+demo,最好复制demo的
<service
android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"><intent-filter><action android:name="com.baidu.location.service_v2.2"></action></intent-filter>
</service>
定位key:
<!--百度地图:定位功能key: tpiB1a5OmkkFz4ZYSRyByp9bqHYjML4D--><meta-data
android:name="com.baidu.lbsapi.API_KEY"android:value="tpiB1a5OmkkFz4ZYSRyByp9bqHYjML4D"/>
3 获取位置
步骤:
1 创建LocationClient对象
2 设置参数
3 设置监听(可以在监听中获取地址)
创建LocationClient对象
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
设置参数
private void initLocation() {LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系int span = 0;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要mLocationClient.setLocOption(option);}
设置监听(可以在监听中获取地址)
public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//Receive LocationStringBuffer sb = new StringBuffer(256);sb.append("time : ");sb.append(location.getTime());sb.append("\nerror code : ");sb.append(location.getLocType());sb.append("\nlatitude : ");sb.append(location.getLatitude());sb.append("\nlontitude : ");sb.append(location.getLongitude());sb.append("\nradius : ");sb.append(location.getRadius());if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果sb.append("\nspeed : ");sb.append(location.getSpeed());// 单位:公里每小时sb.append("\nsatellite : ");sb.append(location.getSatelliteNumber());sb.append("\nheight : ");sb.append(location.getAltitude());// 单位:米sb.append("\ndirection : ");sb.append(location.getDirection());// 单位度sb.append("\naddr : ");sb.append(location.getAddrStr());sb.append("\ndescribe : ");sb.append("gps定位成功");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果sb.append("\naddr : ");sb.append(location.getAddrStr());//运营商信息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-bugs@baidu.com,会有人追查原因");} else if (location.getLocType() == BDLocation.TypeNetWorkException) {sb.append("\ndescribe : ");sb.append("网络不同导致定位失败,请检查网络是否通畅");} else if (location.getLocType() == BDLocation.TypeCriteriaException) {sb.append("\ndescribe : ");sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");}sb.append("\nlocationdescribe : ");sb.append(location.getLocationDescribe());// 位置语义化信息List<Poi> list = location.getPoiList();// POI数据if (list != null) {sb.append("\npoilist size = : ");sb.append(list.size());for (Poi p : list) {sb.append("\npoi= : ");sb.append(p.getId() + " " + p.getName() + " " + p.getRank());}}//获取定位信息Log.i("BaiduLocationApiDem", sb.toString());//获取位置信息Log.i("BaiduLocationApiDem", location.getAddrStr());}}
开启定位
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener(myListener); //注册监听函数
initLocation();//设置参数
mLocationClient.start();
没有调用initLocation()方法时,打印的log为:
调用initLocation()方法时,打印的log为:
注意:按照百度基本定位SDK文档说明,定位用的一个API_key是不可以对应多个包名的,但我在实际测试中发现定位的一个key,可以对应多个包名(各位可以尝试修改本demo的applicationId,会发现log仍然有地址)。但是仅限定位,基本地图就不可以。
源码:
源码下载:https://github.com/s1168805219/jichudingwei
每隔10秒定位一次,并获取定位信息
只是多了一个条件:“每隔10秒定位一次”,这次放在了service中,其他都一样.下图是每隔10秒的定位数据,10秒有点短,但基本获取到了数据,也基本是间隔10秒。
public class LocationService extends Service {private int seconds = 10;public LocationClient mLocationClient = null;public BDLocationListener myListener = new MyLocationListener();private Timer timer;private TimerTask mTask;@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();mLocationClient = new LocationClient(LocationService.this); //声明LocationClient类mLocationClient.registerLocationListener(myListener); //注册监听函数initLocation();//设置参数mLocationClient.start();//以上代码是copy官网文档//设置1秒后,每个seconds秒定位一次,定位信息log中有打印timer = new Timer();timer.schedule(task, 1000,seconds * 1000);//1秒后,每个seconds秒定位一次。}TimerTask task = new TimerTask() {@Overridepublic void run() {mLocationClient.start();mLocationClient.requestLocation();}};@Overridepublic void onDestroy() {super.onDestroy();timer.cancel();mLocationClient.unRegisterLocationListener(myListener);}//这个方法是copy官网文档private void initLocation() {LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系int span = 0;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要mLocationClient.setLocOption(option);}public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {//Receive LocationStringBuffer sb = new StringBuffer(256);sb.append("time : ");sb.append(location.getTime());sb.append("\nerror code : ");sb.append(location.getLocType());sb.append("\nlatitude : ");sb.append(location.getLatitude());sb.append("\nlontitude : ");sb.append(location.getLongitude());sb.append("\nradius : ");sb.append(location.getRadius());if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果sb.append("\nspeed : ");sb.append(location.getSpeed());// 单位:公里每小时sb.append("\nsatellite : ");sb.append(location.getSatelliteNumber());sb.append("\nheight : ");sb.append(location.getAltitude());// 单位:米sb.append("\ndirection : ");sb.append(location.getDirection());// 单位度sb.append("\naddr : ");sb.append(location.getAddrStr());sb.append("\ndescribe : ");sb.append("gps定位成功");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果sb.append("\naddr : ");sb.append(location.getAddrStr());//运营商信息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-bugs@baidu.com,会有人追查原因");} else if (location.getLocType() == BDLocation.TypeNetWorkException) {sb.append("\ndescribe : ");sb.append("网络不同导致定位失败,请检查网络是否通畅");} else if (location.getLocType() == BDLocation.TypeCriteriaException) {sb.append("\ndescribe : ");sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");}sb.append("\nlocationdescribe : ");sb.append(location.getLocationDescribe());// 位置语义化信息List<Poi> list = location.getPoiList();// POI数据if (list != null) {sb.append("\npoilist size = : ");sb.append(list.size());for (Poi p : list) {sb.append("\npoi= : ");sb.append(p.getId() + " " + p.getName() + " " + p.getRank());}}
// Log.i("BaiduLocationApiDem", sb.toString());//以上代码是copy官网文档mLocationClient.stop();Log.i("BaiduLocationApiDem", "LocationService--" + location.getAddrStr() + "errorCode=" + location.getLocType());}}
}
源码:https://git.oschina.net/BaiDuMapSDK/DingWei03
prodName
相关博文
重拾百度定位之踩坑篇
定位问题
开手机热点:,请求不到我们的服务器(刷新没有返回运单信息),应该是网络不行,也就无法发送坐标。
经纬度是0:表示没有获取到经纬度坐标,默认值都是:Double.MIN_VALUE,也就是0
可能是没开GPS,也可能是没给位置权限
GPS定位的情况下会出现这种情况:有经度和纬度,但是位置描述信息为null,出现的次数比较少
网络定位的情况下三者都有。
locationTime不变的情况
来自:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=87314&highlight=%E6%97%B6%E9%97%B4%E7%9B%B8%E5%90%8C
百度定位官方Demo也有说明:
鹰眼轨迹
比较简单,看着官方文档就可以完成,下面放2中图。
官方文档:鹰眼轨迹
鹰眼轨迹需要servie_id。
BDLocation各属性
BDLocation location
名称 | 说明 | 值 |
---|---|---|
getTime() | 服务端出本次结果的时间,如果位置不发生变化,则时间不变 | |
getLocType() | 定位类型 | |
getLocTypeDescription() | 定位类型说明 | |
getLatitude() | 纬度 | |
getLongitude() | 经度 | |
getRadius() | 半径 | |
getCountryCode() | 国家码 | |
getCountry() | 国家名称 | |
getCityCode() | 城市编码 | |
getCity() | 城市 | |
getDistrict() | 区 | |
getStreet() | 街道 | |
getAddrStr() | 地址信息 | |
getUserIndoorState() | 用户室内外判断结果 | |
getDirection() | 方向 | |
getLocationDescribe() | 位置语义化信息 |
if (null != location && location.getLocType() != BDLocation.TypeServerError) {StringBuffer sb = new StringBuffer(256);sb.append("time : ");/*** 时间也可以使用systemClock.elapsedRealtime()方法 获取的是自从开机以来,每次回调的时间;* location.getTime() 是指服务端出本次结果的时间,如果位置不发生变化,则时间不变*/sb.append(location.getTime());sb.append("\nlocType : ");// 定位类型sb.append(location.getLocType());sb.append("\nlocType description : ");// *****对应的定位类型说明*****sb.append(location.getLocTypeDescription());sb.append("\nlatitude : ");// 纬度sb.append(location.getLatitude());sb.append("\nlontitude : ");// 经度sb.append(location.getLongitude());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("\nUserIndoorState: ");// *****返回用户室内外判断结果*****sb.append(location.getUserIndoorState());sb.append("\nDirection(not all devices have value): ");sb.append(location.getDirection());// 方向sb.append("\nlocationdescribe: ");sb.append(location.getLocationDescribe());// 位置语义化信息sb.append("\nPoi: ");// POI信息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("\ngps status : ");sb.append(location.getGpsAccuracyStatus());// *****gps质量判断*****sb.append("\ndescribe : ");sb.append("gps定位成功");} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果// 运营商信息if (location.hasAltitude()) {// *****如果有海拔高度*****sb.append("\nheight : ");sb.append(location.getAltitude());// 单位:米}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-bugs@baidu.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());Log.d(TAG, "地址:" + location.getAddrStr());
}
官方基础定位demo
Demo: https://git.oschina.net/BaiDuMapSDK/baidulocdemo
创建类
LocationService
,在Application中创建LocationService
对象,在需要定位的activity中注册监听和开启定位。
LocationService
LocationService
不是Service
,就是一个工具类。
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信息,默认收集mOption.setIsNeedAltitude(false);//可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用}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();}}}public boolean requestHotSpotState(){return client.requestHotSpotState();}
}
LocationApplication
public class LocationApplication extends Application {public LocationService locationService;@Overridepublic void onCreate() {super.onCreate();locationService = new LocationService(getApplicationContext()); }
}
在Activity中使用
public class LocationActivity extends Activity {private LocationService locationService;private Button startLocation;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.location);}@Overrideprotected void onStop() {locationService.unregisterListener(mListener); //注销掉监听locationService.stop(); //停止定位服务super.onStop();}@Overrideprotected void onStart() {super.onStart();//获取locationservice实例,建议应用中只初始化1个location实例,然后使用,可以参考其他示例的activity,都是通过此种方式获取locationservice实例的locationService = ((LocationApplication) getApplication()).locationService;locationService.registerListener(mListener);startLocation.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {locationService.start();startLocation.setText(getString(R.string.stoplocation)); }});}/******* 定位结果回调,重写onReceiveLocation方法,可以直接拷贝如下代码到自己工程中修改**/private BDLocationListener mListener = new BDLocationListener() {@Overridepublic void onReceiveLocation(BDLocation location) {// TODO Auto-generated method stubif (null != location && location.getLocType() != BDLocation.TypeServerError) {...}}public void onConnectHotSpotMessage(String s, int i) {}};
}
定位的功能模块
百度定位官方Demo实现的功能:
- 判断当前是wifi还是移动热点
- 位置震动提醒
判断当前是wifi还是移动热点
类型:
LocationClient.CONNECT_HOT_SPOT_FALSE:0,不是移动热点
LocationClient.CONNECT_HOT_SPOT_TRUE:1,是移动热点
LocationClient.CONNECT_HOT_SPOT_UNKNOWN:-1,连接状态未知
先要设置请求热点类型
client.requestHotSpotState();
在回调中判断
class MyLocationListener implements BDLocationListener{@Overridepublic void onConnectHotSpotMessage(String connectWifiMac, int hotSpotState) {String resT;if(hotSpotState == 0){resText = "不是移动, wifi:"+connectWifiMac;} else if(hotSpotState == 1){resText = "是wifi热点, wifi:"+connectWifiMac;} else if (hotSpotState == -1){resText = "未连接wifi";}res.setText(resText);}@Overridepublic void onReceiveLocation(BDLocation arg0) {// TODO Auto-generated method stub}}
位置提醒
先获取震动的类Vibrator`
Vibrator mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);
注册位置提醒监听即可。
NotifyLister mNotifyLister = new NotifyLister();
mLocationClient.registerNotify(mNotifyLister);
public class NotifyLister extends BDNotifyListener{public void onNotify(BDLocation mlocation, float distance){mVibrator.vibrate(1000);//振动提醒已到设定位置附近}
}
同时在位置监听中还需要设置提醒点的坐标
public class NotiftLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {longtitude = location.getLongitude();latitude = location.getLatitude();notifyHandler.sendEmptyMessage(0);}public void onConnectHotSpotMessage(String s, int i){ }
}
(为什么要在Handler中处理?)
private Handler notifyHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mNotifyLister.SetNotifyLocation(latitude,longtitude, 3000,mLocationClient.getLocOption().getCoorType());//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)}
};
关闭提醒
mLocationClient.removeNotifyEvent(mNotifyLister);
第三方SDK:百度地图(二)定位 + 鹰眼轨迹相关推荐
- Android使用第三方SDK——百度地图
Android使用第三方SDK--百度地图 第一次用百度地图是在去年的8月中旬吧,当时是参加一个比赛,老师要求使用地图,然后就是百度,各种视频网站一顿搜啊(当时Android还没入门,就知道CV),最 ...
- 百度地图:定位,轨迹,白板,加载崩溃,定位到非洲
这两天道长在弄百度地图,开发中也遇到了一些问题,在这里和大家分享一下(额,主要是记录一下,省的下次又忘了) 一.准备 百度地图密钥申请 百度地图SDK下载 如果需要以前版本的SDK,请点这里的传送门 ...
- HTML5--地理定位与第三方工具百度地图的应用
前言: 看到了很多技术大牛和相关博客,很少关于HTML5的地理定位的描述,不知道他们是不愿意提及还是使用的少的原因,我个人按一点点经验总结了两方面原因: 第一.服务商方面的原因,因为HTML5的定位是 ...
- 利用百度地图Android定位SDK获取经纬度
环境的搭建(参考上一次的文章) 百度地图Android定位SDK的使用 2.在Android studio里设计程序来获取经纬度 界面布局activity_main.xml文件的源代码: <?x ...
- Flutter对接第三方高德地图+百度地图基础定位实现
Flutter对接第三方高德地图+百度地图基础定位实现 原创:@As.Kai 博客地址:https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助,点赞点赞点赞~ 高德 ...
- android hud sdk,Android HUD SDK | 百度地图API SDK
简介 为了给用户提供更安全优质的服务,LBS开放平台针对Android平台的SDK产品引入Key认证机制,用户在使用之前需要先申请配置Key,并在程序相应位置填写您的Key. Key机制:每个Key仅 ...
- 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)
使用最新版本的百度地图需要注意的几个地方: 1.libs文件夹下要有android-support-v4.jar.baidumapapi_v2_1_0.jar.locSDK_3.1.jar三个jar包 ...
- Android百度地图之定位图层
来自:http://blog.csdn.net/u010142437/article/details/11577077 在使用百度地图结合GPS进行定位一文中,我们已经介绍了利用GPS结合百度地图进行 ...
- 百度地图android自定义文字,Android SDK | 百度地图API SDK
什么是百度地图Android SDK? 百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口, 您可以通过该接口实现丰富的LBS功能: 地图:提供地图(2D.3 ...
最新文章
- flask学习笔记之blueprint
- 求正负数交互序列的和的MFC版
- java 线程的几种状态(转载)
- JAVA基础:Hibernate外键关联与HQL语法
- SAP 产品 UI 里的容器组件的概念和开发概述
- adobe audition cs6 能打开mpcm文件吗?_PR竟然有手机版的了?Adobe正式推出Premiere Rush版(内含安装包)!...
- 使用Servlet和Bootstrap上传Ajax文件
- windows和linux没有启动选择,重装Windows后,LILO启动选单不见了,无法进入Linux系统怎么办...
- 数据挖掘学习笔记 5 线性回归知识及预测糖尿病实例
- AngularJS-源码阅读(八.二)
- Atitit word结构化提取考试试题读取 poi读取word nlp aiprj 目录 1.1. 结构化后数据	1 1.2. 文字读取	1 1.3. 图片读取	1 1.4. Doc的表格读取 /
- java中md5校验工具,java实现MD5文件校验
- html制作个人简历
- Aspen ONE Suite 11.0 软件下载及其安装教程
- 获取计算机显示屏高度,CSS 使用calc()获取当前可视屏幕高度
- 驱动程序在 /Device/Harddisk0/D 上检测到控制器错误
- linux ubuntu bionic,如何升级Ubuntu到18.04 LTS Bionic Beaver
- 5、基于51单片智能手环设计心率计蓝牙app计步器温湿度设计
- 让你最快速地改善代码质量的 20 条编程规范
- 将阿拉伯数字转换成中文大写金额的形式
热门文章
- FCC Lifeline项目现已帮助美国低收入家庭接入高速互联网
- 设计一款给爸爸妈妈用的手机
- WordPress快速增加百度收录,加快网站内容抓取
- Clock skew detected. Your build may be incomplete
- 苹果6性能测试软件,5款iPhone升级iOS13.6性能测试:运行速度有所提升?
- 复杂业务下,我们为何选择Akka作为异步通信框架?
- python为自己龟蜗速更新的小说生成词云
- 微信公众号对接电影网站,回复名称推送电影
- 仿酒仙网品牌活动动画效果 (鼠标移上 图片平移)
- CA EXPO会议参会小记(组图)