資源簡介
package com.dyk.baidumapwork;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
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.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
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.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.radar.RadarNearbyResult;
import com.baidu.mapapi.radar.RadarNearbySearchOption;
import com.baidu.mapapi.radar.RadarSearchError;
import com.baidu.mapapi.radar.RadarSearchListener;
import com.baidu.mapapi.radar.RadarSearchManager;
import com.baidu.mapapi.radar.RadarUploadInfo;
import com.baidu.trace.LBSTraceClient;
import com.baidu.trace.OnEntityListener;
import com.baidu.trace.OnGeoFenceListener;
import com.baidu.trace.OnStartTraceListener;
import com.baidu.trace.OnStopTraceListener;
import com.baidu.trace.OnTrackListener;
import com.baidu.trace.Trace;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends Activity implements View.OnClickListener, RadarSearchListener {
private static final String TAG = "BaiduMap";
//周邊雷達相關
private MapView mMapView;
private BaiduMap mBaiduMap;
private Marker markerA;
private RadarSearchManager mManager;
// 定位相關
private BitmapDescriptor mCurrentMarker;
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
private boolean isFirstGetLocation = true;
// 方向感應器相關
private OrientationSensor mOrientationSensor;
/**
* 傳感器方向
*/
private float driection = 0;
//鷹眼軌跡相關
private LBSTraceClient client;
private Trace trace;
/**
* 鷹眼服務ID
*/
private long serviceId = 112700L;
/**
* 地理圍欄監聽器
*/
private OnGeoFenceListener geoFenceListener;
/**
* 圍欄ID
*/
private int fenceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// 初始化周邊雷達
// mManager = RadarSearchManager.getInstance();
// 實例化軌跡服務客戶端
client = new LBSTraceClient(getApplicationContext());
createFence();
initView();
initClick();
// testOverlay();
// testGeometryOverlay();
// testTextOverlay();
// testGroundOverlay();
// testLocation();
}
private void initView() {
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
}
private void initClick() {
findViewById(R.id.map_common).setOnClickListener(this);
findViewById(R.id.map_satelite).setOnClickListener(this);
findViewById(R.id.map_blank).setOnClickListener(this);
findViewById(R.id.map_traffic).setOnClickListener(this);
findViewById(R.id.map_heat).setOnClickListener(this);
findViewById(R.id.map_radar).setOnClickListener(this);
findViewById(R.id.map_startLocation).setOnClickListener(this);
findViewById(R.id.map_startTrace).setOnClickListener(this);
findViewById(R.id.map_stopTrace).setOnClickListener(this);
findViewById(R.id.map_findLocationAtTime).setOnClickListener(this);
findViewById(R.id.map_findLocationOnHistory).setOnClickListener(this);
findViewById(R.id.map_findFenceAtTime).setOnClickListener(this);
findViewById(R.id.map_findFenceAtHistry).setOnClickListener(this);
}
/**
* 覆蓋物
*/
private void testOverlay() {
LatLng point = new LatLng(39.963175, 116.400244);
// 通過marker的icons設置一組圖片,再通過period設置多少幀刷新一次圖片資源
ArrayList<BitmapDescriptor> bitmapList = new ArrayList<BitmapDescriptor>();
BitmapDescriptor bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
BitmapDescriptor bitmapB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
BitmapDescriptor bitmapC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);
BitmapDescriptor bitmapD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);
BitmapDescriptor bitmapE = BitmapDescriptorFactory.fromResource(R.drawable.icon_marke);
bitmapList.add(bitmapA);
bitmapList.add(bitmapB);
bitmapList.add(bitmapC);
bitmapList.add(bitmapD);
bitmapList.add(bitmapE);
OverlayOptions options = new MarkerOptions()
.position(point) //位置
.icons(bitmapList) // 圖標
.period(10) // 刷新幀數
.zIndex(9)// 顯示層級
.alpha(0.5f) //透明度
.draggable(true);// 支持拖拽
markerA = (Marker) (mBaiduMap.addOverlay(options));// 在地圖上添加marker并顯示
// 點擊marker
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker.remove();
return true;
}
});
}
/**
* 幾何覆蓋物
*/
private void testGeometryOverlay() {
//定義多邊形的五個頂點
LatLng pt1 = new LatLng(39.93923, 116.357428);
LatLng pt2 = new LatLng(39.91923, 116.327428);
LatLng pt3 = new LatLng(39.89923, 116.347428);
LatLng pt4 = new LatLng(39.89923, 116.367428);
LatLng pt5 = new LatLng(39.91923, 116.387428);
List<LatLng> pts = new ArrayList<LatLng>();
pts.add(pt1);
pts.add(pt2);
pts.add(pt3);
pts.add(pt4);
pts.add(pt5);
//構建用戶繪制多邊形的Option對象
OverlayOptions polygonOption = new PolygonOptions()
.points(pts)
.stroke(new Stroke(5, 0xAA00FF00))
.fillColor(0xAAFFFF00);
//在地圖上添加多邊形Option,用于顯示
mBaiduMap.addOverlay(polygonOption);
}
/**
* 文字覆蓋物
*/
private void testTextOverlay() {
LatLng text = new LatLng(39.86923, 116.397428);
OverlayOptions options = new TextOptions()
.bgColor(0xAAFFFF00)
.fontSize(24)
.fontColor(0xFFFF00FF)
.text("文字覆蓋物測試")
.rotate(-45) // 旋轉角度
.position(text);
mBaiduMap.addOverlay(options);
}
/**
* 地形圖圖層(GroundOverlay),又可叫做圖片圖層
*/
private void testGroundOverlay() {
//定義Ground的顯示地理范圍
LatLng southwest = new LatLng(39.92235, 116.380338);
LatLng northeast = new LatLng(39.947246, 116.414977);
LatLngBounds bounds = new LatLngBounds.Builder()
.include(northeast)
.include(southwest)
.build();
//定義Ground顯示的圖片
BitmapDescriptor bdGround = BitmapDescriptorFactory
.fromResource(R.drawable.ground_overlay);
//定義Ground覆蓋物選項
OverlayOptions ooGround = new GroundOverlayOptions()
.positionFromBounds(bounds)
.image(bdGround)
.transparency(0.8f);// 透明度
//在地圖中添加Ground覆蓋物
mBaiduMap.addOverlay(ooGround);
}
/**
* 周邊雷達信息上傳
*/
private void testRadarInfoUpload() {
// 周邊雷達設置監聽
mManager.addNearbyInfoListener(this);
//周邊雷達設置用戶身份標識,id為空默認是設備標識
mManager.setUserID("123");
//上傳位置
RadarUploadInfo info = new RadarUploadInfo();
LatLng pt = new LatLng(39.963175, 116.400244);
info.comments = "備注";
info.pt = pt;
mManager.uploadInfoRequest(info);
}
/**
* 雷達周邊位置檢索
*/
private void testRadarLocationSearch() {
// 自己的位置
LatLng pt = new LatLng(39.963175, 116.400244);
RadarNearbySearchOption option = new RadarNearbySearchOption()
.centerPt(pt)
.pageNum(0)
.radius(2 * 1000);
// 發起查詢請求
mManager.nearbyInfoRequest(option);
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理
mMapView.onDestroy();
if (mManager != null) {
//移除監聽
mManager.removeNearbyInfoListener(this);
//清除用戶信息
// mManager.clearUserInfo();
//釋放資源
mManager.destroy();
mManager = null;
}
if (mLocationClient != null && mLocationClient.isStarted()) {
mLocationClient.stop();
}
if (mBaiduMap.isMyLocationEnabled()) {
// 當不需要定位圖層時關閉定位圖層
mBaiduMap.setMyLocationEnabled(false);
}
//反注冊OrientationSensor
if (mOrientationSensor != null) {
mOrientationSensor.stop();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 普通地圖
case R.id.map_common:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
// 衛星地圖
case R.id.map_satelite:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
// 空白地圖
case R.id.map_blank:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
break;
// 交通圖
case R.id.map_traffic:
if (mBaiduMap.isTrafficEnabled()) {
mBaiduMap.setTrafficEnabled(false);
} else {
mBaiduMap.setTrafficEnabled(true);
}
break;
// 熱力圖
case R.id.map_heat:
if (mBaiduMap.isBaiduHeatMapEnabled()) {
mBaiduMap.setBaiduHeatMapEnabled(false);
} else {
mBaiduMap.setBaiduHeatMapEnabled(true);
}
break;
// 周邊檢索
case R.id.map_radar:
testRadarInfoUpload();
testRadarLocationSearch();
break;
// 開始定位
case R.id.map_startLocation:
mOrientationSensor = new OrientationSensor(this);
mOrientationSensor.start();
mLocationClient.start();
break;
// 開始鷹眼軌跡追蹤
case R.id.map_startTrace:
startTrace();
break;
// 關閉鷹眼軌跡追蹤
case R.id.map_stopTrace:
stopTrace();
break;
// 鷹眼查詢實時位置
case R.id.map_findLocationAtTime:
findLocationAtTime();
break;
// 鷹眼查詢歷史軌跡
case R.id.map_findLocationOnHistory:
findLocationOnHistory();
break;
// 圍欄查詢實時狀態
case R.id.map_findFenceAtTime:
// 異步創建Fence 所以應該正規應該使用handlder
findFenceAtTime();
break;
// 圍欄歷史報警信息
case R.id.map_findFenceAtHistry:
findFenceOnHistory();
break;
}
}
@Override
public void onGetNearbyInfoList(RadarNearbyResult radarNearbyResult, RadarSearchError radarSearchError) {
if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
Toast.makeText(MainActivity.this, "查詢周邊成功", Toast.LENGTH_LONG).show();
Log.i(TAG, radarNearbyResult.infoList.get(0).userID "\n"
radarNearbyResult.infoList.get(0).distance "\n"
radarNearbyResult.infoList.get(0).pt "\n"
radarNearbyResult.infoList.get(0).timeStamp);
} else {
Toast.makeText(MainActivity.this, "查詢周邊失敗", Toast.LENGTH_LONG).show();
Log.i(TAG, "查詢錯誤:" radarSearchError.toString());
}
}
@Override
public void onGetUploadState(RadarSearchError radarSearchError) {
if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
//上傳成功
Toast.makeText(MainActivity.this, "單次上傳位置成功", Toast.LENGTH_LONG).show();
} else {
//上傳失敗
Toast.makeText(MainActivity.this, "單次上傳位置失敗", Toast.LENGTH_LONG).show();
Log.i(TAG, "上傳錯誤:" radarSearchError.toString());
}
}
@Override
public void onGetClearInfoState(RadarSearchError radarSearchError) {
if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
//清除成功
Toast.makeText(MainActivity.this, "清除位置成功", Toast.LENGTH_LONG).show();
} else {
//清除失敗
Toast.makeText(MainActivity.this, "清除位置失敗", Toast.LENGTH_LONG).show();
}
}
/**
* 定位結合方向傳感器
*/
private void testLocation() {
mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類
mLocationClient.registerLocationListener(myListener); //注冊監聽函數
/**
* 高精度定位模式:這種定位模式下,會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果;
* 低功耗定位模式:這種定位模式下,不會使用GPS,只會使用網絡定位(Wi-Fi和基站定位);
* 僅用設備定位模式:這種定位模式下,不需要連接網絡,只使用GPS進行定位,這種模式下不支持室內環境的定位。
*/
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
option.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果坐標系
int span = 1000;
option.setScanSpan(span);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
option.setOpenGps(true);//可選,默認false,設置是否使用gps
option.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(true);//可選,默認false,設置是否收集CRASH信息,默認收集
option.setEnableSimulateGps(false);//可選,默認false,設置是否需要過濾gps仿真結果,默認需要
mLocationClient.setLocOption(option);
}
/**
* 開始鷹眼軌跡追蹤
*/
private void startTrace() {
// entity標識(監聽后臺顯示的名字)
String entityName = "test";
// 軌跡服務類型(0 : 不上傳位置數據,也不接收報警信息; 1 : 不上傳位置數據,但接收報警信息;
// 2 : 上傳位置數據,且接收報警信息)
int traceType = 2;
//實例化軌跡服務
trace = new Trace(getApplicationContext(), serviceId, entityName, traceType);
// 實例化開啟軌跡服務回調接口
OnStartTraceListener startTraceListener = new OnStartTraceListener() {
// 開啟軌跡服務回調接口(arg0 : 消息編碼,arg1 : 消息內容,詳情查看類參考)
@Override
public void onTraceCallback(int arg0, String arg1) {
Log.i(TAG, "onTraceCallback" "arg0 = " arg0 " arg1 = " arg1);
}
// 軌跡服務推送接口(用于接收服務端推送消息,arg0 : 消息類型,arg1 : 消息內容,詳情查看類參考)
@Override
public void onTracePushCallback(byte arg0, String arg1) {
Log.i(TAG, "onTracePushCallback" "arg0 = " arg0 " arg1 = " arg1);
}
};
// 位置采集周期
int gatherInterval = 10;
// 打包周期
int packInterval = 60;
// 設置協議類型,0為http,1為https
int protocoType = 0;
// 設置位置采集和打包周期
client.setInterval(gatherInterval, packInterval);
// 設置協議
client.setProtocolType(protocoType);
// 開啟軌跡服務
client.startTrace(trace, startTraceListener);
}
/**
* 測試數據
*/
private Map getMap() {
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
return map;
}
/**
* 結束鷹眼軌跡追蹤
*/
private void stopTrace() {
// 實例化停止軌跡服務回調接口
OnStopTraceListener stopTraceListener = new OnStopTraceListener() {
// 軌跡服務停止成功
@Override
public void onStopTraceSuccess() {
Log.i(TAG, "onStopTraceSuccess");
}
// 軌跡服務停止失敗(arg0 : 錯誤編碼,arg1 : 消息內容,詳情查看類參考)
@Override
public void onStopTraceFailed(int arg0, String arg1) {
Log.i(TAG, "onStopTraceFailed" "arg0 = " arg0 " arg1 = " arg1);
}
};
//停止軌跡服務
client.stopTrace(trace, stopTraceListener);
}
/**
* 鷹眼查詢實時位置
*/
private void findLocationAtTime() {
//entity標識列表(多個entityName,以英文逗號"," 分割)
String entityNames = "test";
//檢索條件(格式為 : "key1=value1,key2=value2,.....")
String columnKey = "";
//返回結果的類型(0 : 返回全部結果,1 : 只返回entityName的列表)
int returnType = 0;
//活躍時間,UNIX時間戳(指定該字段時,返回從該時間點之后仍有位置變動的entity的實時點集合)
int activeTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
//分頁大小
int pageSize = 1000;
//分頁索引
int pageIndex = 1;
//Entity監聽器
OnEntityListener entityListener = new OnEntityListener() {
// 查詢失敗回調接口
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "onRequestFailedCallback" "arg0 = " arg0);
}
// 查詢entity回調接口,返回查詢結果列表
@Override
public void onQueryEntityListCallback(String arg0) {
Log.i(TAG, "onQueryEntityListCallback" " arg0 = " arg0);
}
};
//查詢實時軌跡
client.queryEntityList(serviceId, entityNames, columnKey, returnType, activeTime, pageSize,
pageIndex, entityListener);
}
/**
* 鷹眼查詢歷史軌跡
*/
private void findLocationOnHistory() {
//entity標識
String entityName = "test";
//是否返回精簡的結果(0 : 將只返回經緯度,1 : 將返回經緯度及其他屬性信息)
int simpleReturn = 1;
//開始時間(Unix時間戳)
int startTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
//結束時間(Unix時間戳)
int endTime = (int) (System.currentTimeMillis() / 1000);
//分頁大小
int pageSize = 1000;
//分頁索引
int pageIndex = 1;
//軌跡查詢監聽器
OnTrackListener trackListener = new OnTrackListener() {
//請求失敗回調接口
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "onRequestFailedCallback" "arg0 = " arg0);
}
// 查詢歷史軌跡回調接口
@Override
public void onQueryHistoryTrackCallback(String arg0) {
Log.i(TAG, "onQueryHistoryTrackCallback" "arg0 = " arg0);
}
};
//查詢歷史軌跡
client.queryHistoryTrack(serviceId, entityName, simpleReturn, startTime, endTime,
pageSize, pageIndex, trackListener);
}
/**
* 創建圍欄
*/
private void createFence() {
geoFenceListener = new OnGeoFenceListener() {
//請求失敗回調接口
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "geoFence請求失敗 :" "arg0 = " arg0);
}
//創建圓形圍欄回調接口
@Override
public void onCreateCircularFenceCallback(String arg0) {
Log.i(TAG, "創建圓形圍欄回調接口消息 : " "arg0 = " arg0);
JSONObject dataJson = null;
try {
dataJson = new JSONObject(arg0);
int status = dataJson.getInt("status");
if (0 == status) {
fenceId = dataJson.getInt("fence_id");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
//更新圓形圍欄回調接口
@Override
public void onUpdateCircularFenceCallback(String arg0) {
Log.i(TAG, "更新圓形圍欄回調接口消息 :" "arg0 = " arg0);
}
//延遲報警回調接口
@Override
public void onDelayAlarmCallback(String arg0) {
Log.i(TAG, "延遲報警回調接口消息 :" "arg0 = " arg0);
}
//刪除圍欄回調接口
@Override
public void onDeleteFenceCallback(String arg0) {
Log.i(TAG, "刪除圍欄回調接口消息 :" "arg0 = " arg0);
}
//查詢圍欄列表回調接口
@Override
public void onQueryFenceListCallback(String arg0) {
Log.i(TAG, "查詢圍欄列表回調接口消息 : " "arg0 = " arg0);
}
//查詢歷史報警回調接口
@Override
public void onQueryHistoryAlarmCallback(String arg0) {
Log.i(TAG, "查詢歷史報警回調接口消息 : " "arg0 = " arg0);
}
//查詢監控對象狀態回調接口
@Override
public void onQueryMonitoredStatusCallback(String arg0) {
Log.i(TAG, "查詢監控對象狀態回調接口消息 : " "arg0 = " arg0);
}
};
//創建者(entity標識)
String creator = "test";
//圍欄名稱
String fenceName = "school";
//圍欄描述
String fenceDesc = "學校";
//監控對象列表(多個entityName,以英文逗號"," 分割)
String monitoredPersons = "test";
//觀察者列表(多個entityName,以英文逗號"," 分割)
String observers = "test";
//生效時間列表
String validTimes = "";
//生效周期
int validCycle = 4;
//圍欄生效日期
String validDate = "";
//生效日期列表
String validDays = "";
//坐標類型 (1:GPS經緯度,2:國測局經緯度,3:百度經緯度)
int coordType = 3;
//圍欄圓心(圓心位置, 格式 : "經度,緯度")
String center = "120.2126083541,30.245619808604";
//圍欄半徑(單位 : 米)
double radius = 500;
//報警條件(1:進入時觸發提醒,2:離開時觸發提醒,3:進入離開均觸發提醒)
int alarmCondition = 3;
//創建圓形地理圍欄
client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons,
observers,validTimes, validCycle, validDate, validDays, coordType, center, radius,
alarmCondition, geoFenceListener);
}
/** 圍欄查詢實時狀態 */
private void findFenceAtTime() {
if (fenceId != 0) {
//監控對象列表(多個entityName,以英文逗號"," 分割)
String monitoredPersons = "test";
//查詢實時狀態
client.queryMonitoredStatus(serviceId, fenceId, monitoredPersons, geoFenceListener);
}
}
/** 圍欄歷史報警信息 */
private void findFenceOnHistory() {
if (fenceId != 0) {
//監控對象列表(多個entityName,以英文逗號"," 分割)
String monitoredPersons = "test";
//開始時間(unix時間戳)
int beginTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
//結束時間(unix時間戳)
int endTime = (int) (System.currentTimeMillis() / 1000);
//查詢歷史報警信息
client.queryFenceHistoryAlarmInfo(serviceId, fenceId, monitoredPersons, beginTime, endTime,
geoFenceListener);
}
}
/**
* 接收定位信息
*/
private class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//mapview 銷毀后不在處理新接收的位置
if (location == null || mBaiduMap == null) {
return;
}
getLocationInfo(location);
// 開啟定位圖層
mBaiduMap.setMyLocationEnabled(true);
// 構造定位數據
mOrientationSensor.setOrientationListener(new OrientationSensor.OrientationSensorListener() {
@Override
public void getOrientation(float x) {
driection = x;
}
});
final MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(driection)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
Log.i(TAG, "driection=" driection);
// 設置定位數據
mBaiduMap.setMyLocationData(locData);
if (isFirstGetLocation) {
isFirstGetLocation = false;
// 獲取經緯度
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
// 設置地圖中心點以及縮放級別
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 15);
mBaiduMap.animateMapStatus(mapStatusUpdate);
}
// Log.i(TAG, "latitude:" mBaiduMap.getLocationData().latitude
// "\nlongitude:" mBaiduMap.getLocationData().longitude
// "\ndirection:" mBaiduMap.getLocationData().direction);
// 設置定位圖層的配置(定位模式,是否允許方向信息,用戶自定義定位圖標)
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.location_pic);
MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL,
true, mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(config);
}
private void getLocationInfo(BDLocation location) {
//Receive Location
StringBuffer 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(TAG, sb.toString());
}
}
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
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.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
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.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.radar.RadarNearbyResult;
import com.baidu.mapapi.radar.RadarNearbySearchOption;
import com.baidu.mapapi.radar.RadarSearchError;
import com.baidu.mapapi.radar.RadarSearchListener;
import com.baidu.mapapi.radar.RadarSearchManager;
import com.baidu.mapapi.radar.RadarUploadInfo;
import com.baidu.trace.LBSTraceClient;
import com.baidu.trace.OnEntityListener;
import com.baidu.trace.OnGeoFenceListener;
import com.baidu.trace.OnStartTraceListener;
import com.baidu.trace.OnStopTraceListener;
import com.baidu.trace.OnTrackListener;
import com.baidu.trace.Trace;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends Activity implements View.OnClickListener, RadarSearchListener {
private static final String TAG = "BaiduMap";
//周邊雷達相關
private MapView mMapView;
private BaiduMap mBaiduMap;
private Marker markerA;
private RadarSearchManager mManager;
// 定位相關
private BitmapDescriptor mCurrentMarker;
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
private boolean isFirstGetLocation = true;
// 方向感應器相關
private OrientationSensor mOrientationSensor;
/**
* 傳感器方向
*/
private float driection = 0;
//鷹眼軌跡相關
private LBSTraceClient client;
private Trace trace;
/**
* 鷹眼服務ID
*/
private long serviceId = 112700L;
/**
* 地理圍欄監聽器
*/
private OnGeoFenceListener geoFenceListener;
/**
* 圍欄ID
*/
private int fenceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// 初始化周邊雷達
// mManager = RadarSearchManager.getInstance();
// 實例化軌跡服務客戶端
client = new LBSTraceClient(getApplicationContext());
createFence();
initView();
initClick();
// testOverlay();
// testGeometryOverlay();
// testTextOverlay();
// testGroundOverlay();
// testLocation();
}
private void initView() {
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
}
private void initClick() {
findViewById(R.id.map_common).setOnClickListener(this);
findViewById(R.id.map_satelite).setOnClickListener(this);
findViewById(R.id.map_blank).setOnClickListener(this);
findViewById(R.id.map_traffic).setOnClickListener(this);
findViewById(R.id.map_heat).setOnClickListener(this);
findViewById(R.id.map_radar).setOnClickListener(this);
findViewById(R.id.map_startLocation).setOnClickListener(this);
findViewById(R.id.map_startTrace).setOnClickListener(this);
findViewById(R.id.map_stopTrace).setOnClickListener(this);
findViewById(R.id.map_findLocationAtTime).setOnClickListener(this);
findViewById(R.id.map_findLocationOnHistory).setOnClickListener(this);
findViewById(R.id.map_findFenceAtTime).setOnClickListener(this);
findViewById(R.id.map_findFenceAtHistry).setOnClickListener(this);
}
/**
* 覆蓋物
*/
private void testOverlay() {
LatLng point = new LatLng(39.963175, 116.400244);
// 通過marker的icons設置一組圖片,再通過period設置多少幀刷新一次圖片資源
ArrayList<BitmapDescriptor> bitmapList = new ArrayList<BitmapDescriptor>();
BitmapDescriptor bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
BitmapDescriptor bitmapB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
BitmapDescriptor bitmapC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);
BitmapDescriptor bitmapD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);
BitmapDescriptor bitmapE = BitmapDescriptorFactory.fromResource(R.drawable.icon_marke);
bitmapList.add(bitmapA);
bitmapList.add(bitmapB);
bitmapList.add(bitmapC);
bitmapList.add(bitmapD);
bitmapList.add(bitmapE);
OverlayOptions options = new MarkerOptions()
.position(point) //位置
.icons(bitmapList) // 圖標
.period(10) // 刷新幀數
.zIndex(9)// 顯示層級
.alpha(0.5f) //透明度
.draggable(true);// 支持拖拽
markerA = (Marker) (mBaiduMap.addOverlay(options));// 在地圖上添加marker并顯示
// 點擊marker
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker.remove();
return true;
}
});
}
/**
* 幾何覆蓋物
*/
private void testGeometryOverlay() {
//定義多邊形的五個頂點
LatLng pt1 = new LatLng(39.93923, 116.357428);
LatLng pt2 = new LatLng(39.91923, 116.327428);
LatLng pt3 = new LatLng(39.89923, 116.347428);
LatLng pt4 = new LatLng(39.89923, 116.367428);
LatLng pt5 = new LatLng(39.91923, 116.387428);
List<LatLng> pts = new ArrayList<LatLng>();
pts.add(pt1);
pts.add(pt2);
pts.add(pt3);
pts.add(pt4);
pts.add(pt5);
//構建用戶繪制多邊形的Option對象
OverlayOptions polygonOption = new PolygonOptions()
.points(pts)
.stroke(new Stroke(5, 0xAA00FF00))
.fillColor(0xAAFFFF00);
//在地圖上添加多邊形Option,用于顯示
mBaiduMap.addOverlay(polygonOption);
}
/**
* 文字覆蓋物
*/
private void testTextOverlay() {
LatLng text = new LatLng(39.86923, 116.397428);
OverlayOptions options = new TextOptions()
.bgColor(0xAAFFFF00)
.fontSize(24)
.fontColor(0xFFFF00FF)
.text("文字覆蓋物測試")
.rotate(-45) // 旋轉角度
.position(text);
mBaiduMap.addOverlay(options);
}
/**
* 地形圖圖層(GroundOverlay),又可叫做圖片圖層
*/
private void testGroundOverlay() {
//定義Ground的顯示地理范圍
LatLng southwest = new LatLng(39.92235, 116.380338);
LatLng northeast = new LatLng(39.947246, 116.414977);
LatLngBounds bounds = new LatLngBounds.Builder()
.include(northeast)
.include(southwest)
.build();
//定義Ground顯示的圖片
BitmapDescriptor bdGround = BitmapDescriptorFactory
.fromResource(R.drawable.ground_overlay);
//定義Ground覆蓋物選項
OverlayOptions ooGround = new GroundOverlayOptions()
.positionFromBounds(bounds)
.image(bdGround)
.transparency(0.8f);// 透明度
//在地圖中添加Ground覆蓋物
mBaiduMap.addOverlay(ooGround);
}
/**
* 周邊雷達信息上傳
*/
private void testRadarInfoUpload() {
// 周邊雷達設置監聽
mManager.addNearbyInfoListener(this);
//周邊雷達設置用戶身份標識,id為空默認是設備標識
mManager.setUserID("123");
//上傳位置
RadarUploadInfo info = new RadarUploadInfo();
LatLng pt = new LatLng(39.963175, 116.400244);
info.comments = "備注";
info.pt = pt;
mManager.uploadInfoRequest(info);
}
/**
* 雷達周邊位置檢索
*/
private void testRadarLocationSearch() {
// 自己的位置
LatLng pt = new LatLng(39.963175, 116.400244);
RadarNearbySearchOption option = new RadarNearbySearchOption()
.centerPt(pt)
.pageNum(0)
.radius(2 * 1000);
// 發起查詢請求
mManager.nearbyInfoRequest(option);
}
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命周期管理
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命周期管理
mMapView.onDestroy();
if (mManager != null) {
//移除監聽
mManager.removeNearbyInfoListener(this);
//清除用戶信息
// mManager.clearUserInfo();
//釋放資源
mManager.destroy();
mManager = null;
}
if (mLocationClient != null && mLocationClient.isStarted()) {
mLocationClient.stop();
}
if (mBaiduMap.isMyLocationEnabled()) {
// 當不需要定位圖層時關閉定位圖層
mBaiduMap.setMyLocationEnabled(false);
}
//反注冊OrientationSensor
if (mOrientationSensor != null) {
mOrientationSensor.stop();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 普通地圖
case R.id.map_common:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
// 衛星地圖
case R.id.map_satelite:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
// 空白地圖
case R.id.map_blank:
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
break;
// 交通圖
case R.id.map_traffic:
if (mBaiduMap.isTrafficEnabled()) {
mBaiduMap.setTrafficEnabled(false);
} else {
mBaiduMap.setTrafficEnabled(true);
}
break;
// 熱力圖
case R.id.map_heat:
if (mBaiduMap.isBaiduHeatMapEnabled()) {
mBaiduMap.setBaiduHeatMapEnabled(false);
} else {
mBaiduMap.setBaiduHeatMapEnabled(true);
}
break;
// 周邊檢索
case R.id.map_radar:
testRadarInfoUpload();
testRadarLocationSearch();
break;
// 開始定位
case R.id.map_startLocation:
mOrientationSensor = new OrientationSensor(this);
mOrientationSensor.start();
mLocationClient.start();
break;
// 開始鷹眼軌跡追蹤
case R.id.map_startTrace:
startTrace();
break;
// 關閉鷹眼軌跡追蹤
case R.id.map_stopTrace:
stopTrace();
break;
// 鷹眼查詢實時位置
case R.id.map_findLocationAtTime:
findLocationAtTime();
break;
// 鷹眼查詢歷史軌跡
case R.id.map_findLocationOnHistory:
findLocationOnHistory();
break;
// 圍欄查詢實時狀態
case R.id.map_findFenceAtTime:
// 異步創建Fence 所以應該正規應該使用handlder
findFenceAtTime();
break;
// 圍欄歷史報警信息
case R.id.map_findFenceAtHistry:
findFenceOnHistory();
break;
}
}
@Override
public void onGetNearbyInfoList(RadarNearbyResult radarNearbyResult, RadarSearchError radarSearchError) {
if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
Toast.makeText(MainActivity.this, "查詢周邊成功", Toast.LENGTH_LONG).show();
Log.i(TAG, radarNearbyResult.infoList.get(0).userID "\n"
radarNearbyResult.infoList.get(0).distance "\n"
radarNearbyResult.infoList.get(0).pt "\n"
radarNearbyResult.infoList.get(0).timeStamp);
} else {
Toast.makeText(MainActivity.this, "查詢周邊失敗", Toast.LENGTH_LONG).show();
Log.i(TAG, "查詢錯誤:" radarSearchError.toString());
}
}
@Override
public void onGetUploadState(RadarSearchError radarSearchError) {
if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
//上傳成功
Toast.makeText(MainActivity.this, "單次上傳位置成功", Toast.LENGTH_LONG).show();
} else {
//上傳失敗
Toast.makeText(MainActivity.this, "單次上傳位置失敗", Toast.LENGTH_LONG).show();
Log.i(TAG, "上傳錯誤:" radarSearchError.toString());
}
}
@Override
public void onGetClearInfoState(RadarSearchError radarSearchError) {
if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
//清除成功
Toast.makeText(MainActivity.this, "清除位置成功", Toast.LENGTH_LONG).show();
} else {
//清除失敗
Toast.makeText(MainActivity.this, "清除位置失敗", Toast.LENGTH_LONG).show();
}
}
/**
* 定位結合方向傳感器
*/
private void testLocation() {
mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類
mLocationClient.registerLocationListener(myListener); //注冊監聽函數
/**
* 高精度定位模式:這種定位模式下,會同時使用網絡定位和GPS定位,優先返回最高精度的定位結果;
* 低功耗定位模式:這種定位模式下,不會使用GPS,只會使用網絡定位(Wi-Fi和基站定位);
* 僅用設備定位模式:這種定位模式下,不需要連接網絡,只使用GPS進行定位,這種模式下不支持室內環境的定位。
*/
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
option.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果坐標系
int span = 1000;
option.setScanSpan(span);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
option.setOpenGps(true);//可選,默認false,設置是否使用gps
option.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(true);//可選,默認false,設置是否收集CRASH信息,默認收集
option.setEnableSimulateGps(false);//可選,默認false,設置是否需要過濾gps仿真結果,默認需要
mLocationClient.setLocOption(option);
}
/**
* 開始鷹眼軌跡追蹤
*/
private void startTrace() {
// entity標識(監聽后臺顯示的名字)
String entityName = "test";
// 軌跡服務類型(0 : 不上傳位置數據,也不接收報警信息; 1 : 不上傳位置數據,但接收報警信息;
// 2 : 上傳位置數據,且接收報警信息)
int traceType = 2;
//實例化軌跡服務
trace = new Trace(getApplicationContext(), serviceId, entityName, traceType);
// 實例化開啟軌跡服務回調接口
OnStartTraceListener startTraceListener = new OnStartTraceListener() {
// 開啟軌跡服務回調接口(arg0 : 消息編碼,arg1 : 消息內容,詳情查看類參考)
@Override
public void onTraceCallback(int arg0, String arg1) {
Log.i(TAG, "onTraceCallback" "arg0 = " arg0 " arg1 = " arg1);
}
// 軌跡服務推送接口(用于接收服務端推送消息,arg0 : 消息類型,arg1 : 消息內容,詳情查看類參考)
@Override
public void onTracePushCallback(byte arg0, String arg1) {
Log.i(TAG, "onTracePushCallback" "arg0 = " arg0 " arg1 = " arg1);
}
};
// 位置采集周期
int gatherInterval = 10;
// 打包周期
int packInterval = 60;
// 設置協議類型,0為http,1為https
int protocoType = 0;
// 設置位置采集和打包周期
client.setInterval(gatherInterval, packInterval);
// 設置協議
client.setProtocolType(protocoType);
// 開啟軌跡服務
client.startTrace(trace, startTraceListener);
}
/**
* 測試數據
*/
private Map getMap() {
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
return map;
}
/**
* 結束鷹眼軌跡追蹤
*/
private void stopTrace() {
// 實例化停止軌跡服務回調接口
OnStopTraceListener stopTraceListener = new OnStopTraceListener() {
// 軌跡服務停止成功
@Override
public void onStopTraceSuccess() {
Log.i(TAG, "onStopTraceSuccess");
}
// 軌跡服務停止失敗(arg0 : 錯誤編碼,arg1 : 消息內容,詳情查看類參考)
@Override
public void onStopTraceFailed(int arg0, String arg1) {
Log.i(TAG, "onStopTraceFailed" "arg0 = " arg0 " arg1 = " arg1);
}
};
//停止軌跡服務
client.stopTrace(trace, stopTraceListener);
}
/**
* 鷹眼查詢實時位置
*/
private void findLocationAtTime() {
//entity標識列表(多個entityName,以英文逗號"," 分割)
String entityNames = "test";
//檢索條件(格式為 : "key1=value1,key2=value2,.....")
String columnKey = "";
//返回結果的類型(0 : 返回全部結果,1 : 只返回entityName的列表)
int returnType = 0;
//活躍時間,UNIX時間戳(指定該字段時,返回從該時間點之后仍有位置變動的entity的實時點集合)
int activeTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
//分頁大小
int pageSize = 1000;
//分頁索引
int pageIndex = 1;
//Entity監聽器
OnEntityListener entityListener = new OnEntityListener() {
// 查詢失敗回調接口
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "onRequestFailedCallback" "arg0 = " arg0);
}
// 查詢entity回調接口,返回查詢結果列表
@Override
public void onQueryEntityListCallback(String arg0) {
Log.i(TAG, "onQueryEntityListCallback" " arg0 = " arg0);
}
};
//查詢實時軌跡
client.queryEntityList(serviceId, entityNames, columnKey, returnType, activeTime, pageSize,
pageIndex, entityListener);
}
/**
* 鷹眼查詢歷史軌跡
*/
private void findLocationOnHistory() {
//entity標識
String entityName = "test";
//是否返回精簡的結果(0 : 將只返回經緯度,1 : 將返回經緯度及其他屬性信息)
int simpleReturn = 1;
//開始時間(Unix時間戳)
int startTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
//結束時間(Unix時間戳)
int endTime = (int) (System.currentTimeMillis() / 1000);
//分頁大小
int pageSize = 1000;
//分頁索引
int pageIndex = 1;
//軌跡查詢監聽器
OnTrackListener trackListener = new OnTrackListener() {
//請求失敗回調接口
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "onRequestFailedCallback" "arg0 = " arg0);
}
// 查詢歷史軌跡回調接口
@Override
public void onQueryHistoryTrackCallback(String arg0) {
Log.i(TAG, "onQueryHistoryTrackCallback" "arg0 = " arg0);
}
};
//查詢歷史軌跡
client.queryHistoryTrack(serviceId, entityName, simpleReturn, startTime, endTime,
pageSize, pageIndex, trackListener);
}
/**
* 創建圍欄
*/
private void createFence() {
geoFenceListener = new OnGeoFenceListener() {
//請求失敗回調接口
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "geoFence請求失敗 :" "arg0 = " arg0);
}
//創建圓形圍欄回調接口
@Override
public void onCreateCircularFenceCallback(String arg0) {
Log.i(TAG, "創建圓形圍欄回調接口消息 : " "arg0 = " arg0);
JSONObject dataJson = null;
try {
dataJson = new JSONObject(arg0);
int status = dataJson.getInt("status");
if (0 == status) {
fenceId = dataJson.getInt("fence_id");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
//更新圓形圍欄回調接口
@Override
public void onUpdateCircularFenceCallback(String arg0) {
Log.i(TAG, "更新圓形圍欄回調接口消息 :" "arg0 = " arg0);
}
//延遲報警回調接口
@Override
public void onDelayAlarmCallback(String arg0) {
Log.i(TAG, "延遲報警回調接口消息 :" "arg0 = " arg0);
}
//刪除圍欄回調接口
@Override
public void onDeleteFenceCallback(String arg0) {
Log.i(TAG, "刪除圍欄回調接口消息 :" "arg0 = " arg0);
}
//查詢圍欄列表回調接口
@Override
public void onQueryFenceListCallback(String arg0) {
Log.i(TAG, "查詢圍欄列表回調接口消息 : " "arg0 = " arg0);
}
//查詢歷史報警回調接口
@Override
public void onQueryHistoryAlarmCallback(String arg0) {
Log.i(TAG, "查詢歷史報警回調接口消息 : " "arg0 = " arg0);
}
//查詢監控對象狀態回調接口
@Override
public void onQueryMonitoredStatusCallback(String arg0) {
Log.i(TAG, "查詢監控對象狀態回調接口消息 : " "arg0 = " arg0);
}
};
//創建者(entity標識)
String creator = "test";
//圍欄名稱
String fenceName = "school";
//圍欄描述
String fenceDesc = "學校";
//監控對象列表(多個entityName,以英文逗號"," 分割)
String monitoredPersons = "test";
//觀察者列表(多個entityName,以英文逗號"," 分割)
String observers = "test";
//生效時間列表
String validTimes = "";
//生效周期
int validCycle = 4;
//圍欄生效日期
String validDate = "";
//生效日期列表
String validDays = "";
//坐標類型 (1:GPS經緯度,2:國測局經緯度,3:百度經緯度)
int coordType = 3;
//圍欄圓心(圓心位置, 格式 : "經度,緯度")
String center = "120.2126083541,30.245619808604";
//圍欄半徑(單位 : 米)
double radius = 500;
//報警條件(1:進入時觸發提醒,2:離開時觸發提醒,3:進入離開均觸發提醒)
int alarmCondition = 3;
//創建圓形地理圍欄
client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons,
observers,validTimes, validCycle, validDate, validDays, coordType, center, radius,
alarmCondition, geoFenceListener);
}
/** 圍欄查詢實時狀態 */
private void findFenceAtTime() {
if (fenceId != 0) {
//監控對象列表(多個entityName,以英文逗號"," 分割)
String monitoredPersons = "test";
//查詢實時狀態
client.queryMonitoredStatus(serviceId, fenceId, monitoredPersons, geoFenceListener);
}
}
/** 圍欄歷史報警信息 */
private void findFenceOnHistory() {
if (fenceId != 0) {
//監控對象列表(多個entityName,以英文逗號"," 分割)
String monitoredPersons = "test";
//開始時間(unix時間戳)
int beginTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
//結束時間(unix時間戳)
int endTime = (int) (System.currentTimeMillis() / 1000);
//查詢歷史報警信息
client.queryFenceHistoryAlarmInfo(serviceId, fenceId, monitoredPersons, beginTime, endTime,
geoFenceListener);
}
}
/**
* 接收定位信息
*/
private class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//mapview 銷毀后不在處理新接收的位置
if (location == null || mBaiduMap == null) {
return;
}
getLocationInfo(location);
// 開啟定位圖層
mBaiduMap.setMyLocationEnabled(true);
// 構造定位數據
mOrientationSensor.setOrientationListener(new OrientationSensor.OrientationSensorListener() {
@Override
public void getOrientation(float x) {
driection = x;
}
});
final MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(driection)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
Log.i(TAG, "driection=" driection);
// 設置定位數據
mBaiduMap.setMyLocationData(locData);
if (isFirstGetLocation) {
isFirstGetLocation = false;
// 獲取經緯度
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
// 設置地圖中心點以及縮放級別
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 15);
mBaiduMap.animateMapStatus(mapStatusUpdate);
}
// Log.i(TAG, "latitude:" mBaiduMap.getLocationData().latitude
// "\nlongitude:" mBaiduMap.getLocationData().longitude
// "\ndirection:" mBaiduMap.getLocationData().direction);
// 設置定位圖層的配置(定位模式,是否允許方向信息,用戶自定義定位圖標)
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.location_pic);
MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL,
true, mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(config);
}
private void getLocationInfo(BDLocation location) {
//Receive Location
StringBuffer 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(TAG, sb.toString());
}
}
}
package com.dyk.baidumapwork;
代碼片段和文件信息