android 打飞机游戏 源码下载
import com.pic.SpriteCmd.MainState;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.media.MediaPlayer;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class PictureView extends View implements Runnable,SensorEventListener{private Context context;private int scrWidth;//屏幕的宽度private int scrHeight;//屏幕的高度private int MainTime = 0; //主计时器private Bitmap imgBackground = null;//背景图片private Bitmap imgBackground2 = null;private ButtonUtil ButtonStart = null;//开始按钮private ButtonUtil ButtonHelp = null;//帮助按钮private ButtonUtil ButtonScore = null;private ButtonUtil ButtonDetail = null;private Bitmap imgStart = null;//开始按钮对应的图片private Bitmap imgHelp = null;//帮助按钮对应的图片private Bitmap imgScore = null;private Bitmap imgDetail = null;private ButtonUtil ButtonFirst = null;//选关界面第一关对应按钮private ButtonUtil ButtonSecond = null;//选关界面第二关对应按钮private Bitmap imgFirst = null;//第一关对应图片private Bitmap imgSecond = null;//第二关对应图片private Bitmap imgHelpDisplay = null;//帮助图片private Bitmap imgScoreDisplay = null;//高分图片private Bitmap imgDetailDisplay = null;private ButtonUtil ButtonReturn = null;//返回按钮private Bitmap imgReturn = null;//返回按钮对应图片private ButtonUtil ButtonSound = null;//声音开关按钮private Bitmap imgSoundOn = null;//开声音对应图片private Bitmap imgSoundOff = null;//关声音对应图片private Boolean is_SoundOn = true;//声音是否开private Boolean is_LeverUp = false;//是否过关private int DeadEnemyCnt = 0;//敌人死亡计数器 当死亡敌人个数达到某个数时 过关private int LeverCnt = 0;//过关界面的计数器private static MediaPlayer mediaPlayer = null;//声音播放对象public enum GameState//游戏状态{GAMESTATE_MENU, //菜单GAMESTATE_LEVELGUIDE, //关数提示,显示第一关,第二关 。。GAMESTATE_HELP, GAMESTATE_SCORE,GAMESTATE_DETAIL,GAMESTATE_GAME, //游戏}public GameState GameState; // 游戏状态public static final int STAR_NUM = 30;public SpriteCmd rgSpriteCmd = new SpriteCmd();////主角SpriteCmd类对象实例化public SpriteCmd rgCmdStar[] = new SpriteCmd[30];//星星对象public SpriteCmd rgBulletCmd[] = new SpriteCmd[20];//主角子弹对象public SpriteCmd rgEnemy1Cmd = new SpriteCmd();//敌人1的SpriteCmd类对象public SpriteCmd rgEnemy2Cmd = new SpriteCmd();//敌人2对象public SpriteCmd rgEnemy3Cmd = new SpriteCmd();//敌人3对象public SpriteCmd rgEnemy4Cmd = new SpriteCmd();public SpriteCmd rgEnemy5Cmd = new SpriteCmd();public SpriteCmd rgBombCmds[] = new SpriteCmd[5];//敌人死亡时候爆炸的对象private int LeverNum;//关数计数器public Bitmap imgPlane;//主角飞机对应图片public Bitmap imgStar;//星星对应图片public Bitmap imgBullet;//子弹图片public Bitmap imgEnemy1;//敌人1对应图片public Bitmap imgEnemy2;//敌人2对象图片public Bitmap imgEnemy3;public Bitmap imgEnemy4;public Bitmap imgEnemy5;public Bitmap imgBomb; //炸弹对应图片public Bitmap imgPassLerver;//过关图片public SpriteCmd rgGameover = new SpriteCmd();public Bitmap imgBloodBg;//血量框图片public Bitmap imgBlood;//血量图片public boolean IsRightKeyRealess = true;//右键是否释放public boolean IsLeftKeyRealess = true;//左键是否释放public boolean IsUpKeyRealess = true;//上键是否释放public boolean IsDownKeyRealess = true;//下键是否释放private SensorManager sm;//传感器管理器private Sensor sensor;//重力传感器对象public float x_sensor = 0;//重力传感器x方向的位置偏移public float y_sensor = 0;//重力传感器y方向的位置偏移public float z_sensor = 0;//重力传感器z方向的位置偏移public SpriteCmd rgBackground1 = new SpriteCmd();//背景对象1public SpriteCmd rgBackground2 = new SpriteCmd();//背景对象2public SpriteCmd rgLerver = new SpriteCmd();//“恭喜过关”对象public SpriteCmd rgBloodBg = new SpriteCmd();//“血量框”对象public SpriteCmd rgBlood = new SpriteCmd();//“血量”对象public boolean Is_exit = false;//是否退出游戏public PictureView(Context context){ super(context);//调用父类的构造方法 MainTime = 0; // 主计时清零 sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// 得到一个重力传感器实例 sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME); new Thread(this).start(); //启动线程 通过start()方法找到run()方法 this.context = context; Is_exit = false; }public void TurnToMenu()//进入菜单{imgBackground =((BitmapDrawable)getResources().getDrawable(R.drawable.bg1)).getBitmap();//背景图片if (imgStart == null){imgStart = ((BitmapDrawable)getResources().getDrawable(R.drawable.start)).getBitmap();//“开始游戏”的图片}if (imgHelp == null){imgHelp = ((BitmapDrawable)getResources().getDrawable(R.drawable.help)).getBitmap();//“游戏帮助”的图片}if (imgScore == null){imgScore = ((BitmapDrawable)getResources().getDrawable(R.drawable.score)).getBitmap();//“高分”的图}if (imgDetail == null){imgDetail = ((BitmapDrawable)getResources().getDrawable(R.drawable.detail)).getBitmap();//“信息”的图}if (imgReturn == null){imgReturn = ((BitmapDrawable)getResources().getDrawable(R.drawable.back)).getBitmap();//“返回”的图片}ButtonStart = new ButtonUtil(imgStart,(scrWidth - imgStart.getWidth())/2,100);//把“开始游戏”的图片与按钮绑定ButtonHelp = new ButtonUtil(imgHelp,(scrWidth - imgHelp.getWidth())/2,200);ButtonScore = new ButtonUtil(imgScore,(scrWidth - imgScore.getWidth())/2,300);ButtonDetail = new ButtonUtil(imgDetail,(scrWidth - imgDetail.getWidth())/2,400);ButtonReturn = new ButtonUtil(imgReturn,scrWidth - imgReturn.getWidth() - 10,scrHeight - 50);//把“返回”的图片与按钮绑定GameState = GameState.GAMESTATE_MENU; //状态转换成菜单状态}public void TurnToLeverGuide()//进入选关{ReleaseImage(imgBackground);imgBackground =((BitmapDrawable)getResources().getDrawable(R.drawable.bg2)).getBitmap();//背景图片if (imgFirst == null){imgFirst = ((BitmapDrawable)getResources().getDrawable(R.drawable.firstlever)).getBitmap();//“第1关”的图片}if (imgSecond == null){imgSecond = ((BitmapDrawable)getResources().getDrawable(R.drawable.secondlever)).getBitmap();//“第2关”的图片}ButtonFirst = new ButtonUtil(imgFirst,(scrWidth - imgFirst.getWidth())/2,150);ButtonSecond = new ButtonUtil(imgSecond,(scrWidth - imgSecond.getWidth())/2,300);GameState = GameState.GAMESTATE_LEVELGUIDE;}public void TurnToHelp()//进入帮助{if (imgHelpDisplay == null){imgHelpDisplay = ((BitmapDrawable)getResources().getDrawable(R.drawable.helpdisplay)).getBitmap();}GameState = GameState.GAMESTATE_HELP;}public void TurnToScore()//进入高分榜{if (imgScoreDisplay == null){TextView a=new TextView(context);a.setText("a");//imgScoreDisplay = ((BitmapDrawable)getResources().getDrawable(R.drawable.scoredisplay)).getBitmap();}GameState = GameState.GAMESTATE_SCORE;}public void TurnToDetail()//进入信息{if (imgDetailDisplay == null){imgDetailDisplay = ((BitmapDrawable)getResources().getDrawable(R.drawable.detaildisplay)).getBitmap();}GameState = GameState.GAMESTATE_DETAIL;}public void TurnToGame()//进入游戏{ LoadResource();InitLever();//GameState = GameState.GAMESTATE_GAME;//////////为背景图定义了SpriteCmd类的两个对象,为背景图设定两个位置同时画出来//// rgBackground1.x = 0;rgBackground1.y = -scrHeight;rgBackground1.unLayer = 0;rgBackground1.unWidth = scrWidth; //背景图的宽度设为全屏rgBackground1.unHeight = scrHeight;//背景图的宽度设为全屏rgBackground2.x = 0;rgBackground2.y = 0;rgBackground2.unLayer = 0;rgBackground2.unWidth = scrWidth;//背景图的宽度设为全屏rgBackground2.unHeight = scrHeight; //背景图的宽度设为全屏///////////////////////////////////////////////////////////// imgSoundOn =((BitmapDrawable)getResources().getDrawable(R.drawable.bgsoundon)).getBitmap();imgSoundOff =((BitmapDrawable)getResources().getDrawable(R.drawable.bgsoundoff)).getBitmap();ButtonSound = new ButtonUtil(imgSoundOn,10,scrHeight - 20);rgLerver.unWidth = 200;rgLerver.unHeight = 40;rgLerver.unLayer = 255;rgGameover.unWidth = 200;rgGameover.unHeight = 40;rgGameover.unLayer = 255;rgBloodBg.unWidth = 100;rgBloodBg.unHeight = 32;rgBloodBg.unLayer = 0;rgBloodBg.x = 0;rgBloodBg.y = 0;rgBlood.unWidth = 96;rgBlood.unHeight = 14;rgBlood.unLayer = 0;rgBlood.x = rgBloodBg.x;rgBlood.y = rgBloodBg.y 10;mediaPlayer = MediaPlayer.create(context, R.raw.game); mediaPlayer.start(); mediaPlayer.setLooping(true);is_LeverUp = false;}void InitLever(){int i;switch (LeverNum) {case 1: //第一关rgSpriteCmd.unWidth = 36;rgSpriteCmd.unHeight = 34;rgSpriteCmd.x = (scrWidth - rgSpriteCmd.unWidth)/2;rgSpriteCmd.y = scrHeight - rgSpriteCmd.unHeight;rgSpriteCmd.unLayer = 0;rgSpriteCmd.unSpriteIndex = 0;rgSpriteCmd.CurrentState = MainState.enSTAND;rgSpriteCmd.WalkCount = 0;rgSpriteCmd.IsHurt = false;rgSpriteCmd.IsLeftStop = false;rgSpriteCmd.IsRight = false;rgSpriteCmd.IsTopStop = false;rgSpriteCmd.IsDownStop = false;//敌人初始化rgEnemy1Cmd.unWidth = 35;rgEnemy1Cmd.unHeight = 30;rgEnemy1Cmd.unLayer = 255;rgEnemy3Cmd.unWidth = 35;rgEnemy3Cmd.unHeight = 30;rgEnemy3Cmd.unLayer = 255;rgEnemy3Cmd.IsRight = false;rgEnemy4Cmd.unWidth = 35;rgEnemy4Cmd.unHeight = 30;rgEnemy4Cmd.unLayer = 255;rgEnemy4Cmd.IsRight = false;break;case 2: //第二关rgSpriteCmd.unWidth = 36;rgSpriteCmd.unHeight = 34;rgSpriteCmd.x = (scrWidth - rgSpriteCmd.unWidth)/4;rgSpriteCmd.y = scrHeight - rgSpriteCmd.unHeight;rgSpriteCmd.unLayer = 0;rgSpriteCmd.unSpriteIndex = 0;rgSpriteCmd.CurrentState = MainState.enSTAND;rgSpriteCmd.WalkCount = 0;rgSpriteCmd.IsHurt = false;rgSpriteCmd.IsLeftStop = false;rgSpriteCmd.IsRight = false;rgSpriteCmd.IsTopStop = false;rgSpriteCmd.IsDownStop = false;//敌人初始化rgEnemy1Cmd.unWidth = 35;rgEnemy1Cmd.unHeight = 30;rgEnemy1Cmd.unLayer = 255;rgEnemy2Cmd.unWidth = 35;rgEnemy2Cmd.unHeight = 30;rgEnemy2Cmd.unLayer = 255;rgEnemy3Cmd.unWidth = 35;rgEnemy3Cmd.unHeight = 30;rgEnemy3Cmd.unLayer = 255;rgEnemy3Cmd.IsRight = false;rgEnemy4Cmd.unWidth = 35;rgEnemy4Cmd.unHeight = 30;rgEnemy4Cmd.unLayer = 255;rgEnemy5Cmd.unWidth = 35;rgEnemy5Cmd.unHeight = 30;rgEnemy5Cmd.unLayer = 255;rgEnemy5Cmd.IsRight = false;break;default:break;}////星星的初始化///////////////////////////////for (i = 0; i < STAR_NUM; i = 1){rgCmdStar[i] = new SpriteCmd();//每颗星星都实例化SpriteCmd类对象}for (i = 0; i < STAR_NUM; i = 2) //偶数个星星的图片索引值为0{rgCmdStar[i].unSpriteIndex = 0;}for (i = 1; i < STAR_NUM; i = 2) //基数个星星的图片索引值为1{rgCmdStar[i].unSpriteIndex = 1;}for (i = 0; i < STAR_NUM; i ){rgCmdStar[i].unWidth = 3; //每颗星星图片的宽度和高度rgCmdStar[i].unHeight = 3;rgCmdStar[i].x = scrWidth/STAR_NUM*i 10;//每颗星星图片绘制在屏幕上的位置rgCmdStar[i].y = scrHeight/STAR_NUM*i;} //////////////每颗子弹实例化SpriteCmd类对象,初始化////////for(i=0;i scrHeight) {//到达地图下边界rgSpriteCmd.IsDownStop = true;rgSpriteCmd.y = scrHeight - rgSpriteCmd.unHeight;}else {rgSpriteCmd.IsDownStop = false;}////主机与敌机的碰撞判断及处理///////////////////////////////if ((CheckHitEnemy(rgSpriteCmd, rgEnemy1Cmd) || CheckHitEnemy(rgSpriteCmd, rgEnemy2Cmd)|| CheckHitEnemy(rgSpriteCmd, rgEnemy3Cmd)) || CheckHitEnemy(rgSpriteCmd, rgEnemy4Cmd)|| CheckHitEnemy(rgSpriteCmd, rgEnemy5Cmd)&& !rgSpriteCmd.IsHurt) {rgSpriteCmd.CurrentState = MainState.enHURT;rgSpriteCmd.ProtectCount = 18;rgSpriteCmd.IsHurt = true;rgBlood.unWidth -= 19;if (rgBlood.unWidth < 0) {rgBlood.unWidth = 96;}}/////主机子弹与敌机1的碰撞////////////////////////////////for(i=0;i -1 && y_sensor < 1) {rgSpriteCmd.CurrentState = MainState.enSTAND;}else {rgSpriteCmd.unSpriteIndex = 0;rgSpriteCmd.y = 10;}}else if (rgSpriteCmd.CurrentState == MainState.enHURT) {rgSpriteCmd.unSpriteIndex = MainTime%2 - 1; rgSpriteCmd.ProtectCount--;if (rgSpriteCmd.ProtectCount == 0) {rgSpriteCmd.CurrentState = MainState.enSTAND;rgSpriteCmd.IsHurt = false;}}} ///////把图片画成全屏///////////////////////////////////////////public void DisplayImage(Canvas canvas, Bitmap bitmap,int width, int height){ if(bitmap!=null) { Rect scrRect = new Rect(); //绘制区域在屏幕上的矩形范围 scrRect.left = 0; //绘制区域左上角顶点在屏幕上的x坐标 scrRect.top = 0; //绘制区域左上角顶点在屏幕上的y坐标 scrRect.right = scrWidth;//width; //绘制区域右下角顶点在屏幕上的x坐标 scrRect.bottom = scrHeight;//height; //绘制区域右下角顶点在屏幕上的y坐标 Rect imgRect = new Rect(); //绘制区域在图片上的矩形范围 imgRect.left = 0; //绘制区域左上角顶点距离图片左上角的x坐标 imgRect.top = 0; //绘制区域左上角顶点距离图片左上角的y坐标 imgRect.right = 0 width; //绘制区域右下角顶点距离图片左上角的x坐标 imgRect.bottom = 0 height; //绘制区域右下角顶点距离图片左上角的y坐标 canvas.drawBitmap(bitmap, imgRect, scrRect, null); //绘制图片 } }/////////////////////////////////////////////////////////////////////////// ////////画精灵(相对于屏幕的相对位置)//////////////////////public void DrawSprites(Canvas canvas, Bitmap bitmap, SpriteCmd spriteCmd){if (spriteCmd.unLayer != 255) {DisplayImage(canvas, bitmap, //要画的图片spriteCmd.x, //图片左上角画在屏幕上的x位置spriteCmd.y, //图片左上角画在屏幕上的y位置spriteCmd.unWidth, //图片的宽度spriteCmd.unHeight, //图片的高度0, //要画的图片在整个图片中的x方向位置spriteCmd.unSpriteIndex * spriteCmd.unHeight); //要画的图片在整个图片中的y方向位置}}//画图片//参数依次为画布Canvas对象,位图对象,在屏幕上的x坐标,在屏幕上的y坐标,//绘制的宽度,绘制的高度,在图片上的x坐标,在图片上的y坐标public void DisplayImage(Canvas canvas, Bitmap bitmap, int scrX, int scrY, int width, int height, int imgX, int imgY){if(bitmap!=null){Rect scrRect = new Rect(); //绘制区域在屏幕上的矩形范围scrRect.left = scrX; //绘制区域左上角顶点在屏幕上的x坐标scrRect.top = scrY; //绘制区域左上角顶点在屏幕上的y坐标scrRect.right = scrX width; //绘制区域右下角顶点在屏幕上的x坐标scrRect.bottom = scrY height; //绘制区域右下角顶点在屏幕上的y坐标Rect imgRect = new Rect(); //绘制区域在图片上的矩形范围imgRect.left = imgX; //绘制区域左上角顶点距离图片左上角的x坐标imgRect.top = imgY; //绘制区域左上角顶点距离图片左上角的y坐标imgRect.right = imgX width; //绘制区域右下角顶点距离图片左上角的x坐标imgRect.bottom = imgY height; //绘制区域右下角顶点距离图片左上角的y坐标canvas.drawBitmap(bitmap, imgRect, scrRect, null); //绘制图片}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////触屏事件////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////public boolean onTouchEvent(MotionEvent event){switch (event.getAction()){case MotionEvent.ACTION_DOWN: // 当触摸到屏幕IsRightKeyRealess = false;IsLeftKeyRealess = false;IsUpKeyRealess = false;IsDownKeyRealess = false;switch (GameState){case GAMESTATE_MENU:onTouchEventInMenu(event); // 菜单界面的触屏事件处理break;case GAMESTATE_LEVELGUIDE:onTouchEventLeverGuide(event);// 选关界面的触屏事件处理break;case GAMESTATE_HELP:onTouchEventHelp(event);// 帮助界面的触屏事件处理break;case GAMESTATE_SCORE:onTouchEventScore(event);// 分数界面的触屏事件处理break;case GAMESTATE_DETAIL:onTouchEventHelp(event);// 信息界面的触屏事件处理break;case GAMESTATE_GAME:onTouchEventInGame(event);// 游戏界面的触屏事件处理break;default:break;}return true;case MotionEvent.ACTION_UP:// 当手抬起,离开屏幕IsRightKeyRealess = true;IsLeftKeyRealess = true;IsUpKeyRealess = true;IsDownKeyRealess = true;return true;default:break;} return super.onTouchEvent(event);}public void onTouchEventInMenu(MotionEvent event)// 菜单界面的触屏事件处理{float x, y;x = event.getX();y = event.getY();if (ButtonStart.isClick(x, y)) {TurnToLeverGuide();}else if (ButtonHelp.isClick(x, y)) {TurnToHelp();}else if (ButtonScore.isClick(x, y)) {TurnToScore();}else if (ButtonDetail.isClick(x, y)) {TurnToDetail();}else if (ButtonReturn.isClick(x, y)) {Is_exit = true;CloseGame();}}public void onTouchEventLeverGuide(MotionEvent event)// 选关界面的触屏事件处理{float x, y;x = event.getX();y = event.getY();if (ButtonReturn.isClick(x, y)) {TurnToMenu();}else if (ButtonFirst.isClick(x, y)) {LeverNum = 1;TurnToGame();}else if (ButtonSecond.isClick(x, y)) {LeverNum = 2;TurnToGame();}}public void onTouchEventHelp(MotionEvent event)// 帮助界面的触屏事件处理{float x, y;x = event.getX();y = event.getY();if (ButtonReturn.isClick(x, y)) {TurnToMenu();}}public void onTouchEventScore(MotionEvent event)// 帮助界面的触屏事件处理{float x, y;x = event.getX();y = event.getY();if (ButtonReturn.isClick(x, y)) {TurnToMenu();}}public void onTouchEventInGame(MotionEvent event)// 游戏界面的触屏事件处理{float x, y;x = event.getX();y = event.getY();//////处理返回键/////////////////////////////// if (ButtonReturn.isClick(x, y)) {TurnToMenu();mediaPlayer.pause();}/////////////////////////////////////////// ///////////////声音处理///////////////////////////else if(ButtonSound.isClick(x, y)){if (is_SoundOn) {ButtonSound.setButtonPic(imgSoundOff);is_SoundOn = false;mediaPlayer.pause();}else {ButtonSound.setButtonPic(imgSoundOn);is_SoundOn = true; mediaPlayer.start(); mediaPlayer.setLooping(true);}}/////////////////////////////////////////////////////////////////根据触摸点的位置判断主角飞机的运动状态////////////////////if ((x- rgSpriteCmd.x - rgSpriteCmd.unWidth/2) > (y - rgSpriteCmd.y - rgSpriteCmd.unHeight / 2)&& (x- rgSpriteCmd.x - rgSpriteCmd.unWidth/2) > -(y - rgSpriteCmd.y - rgSpriteCmd.unHeight / 2)&& !rgSpriteCmd.IsRigtStop && rgSpriteCmd.CurrentState != MainState.enHURT &&!ButtonSound.isClick(x, y)){rgSpriteCmd.CurrentState = MainState.enWALKRIGHT;//向右走}else if ((x - rgSpriteCmd.x - rgSpriteCmd.unWidth / 2 < (y - rgSpriteCmd.y - rgSpriteCmd.unHeight / 2)) && (x- rgSpriteCmd.x - rgSpriteCmd.unWidth/2) < -(y - rgSpriteCmd.y - rgSpriteCmd.unHeight / 2)&& !rgSpriteCmd.IsLeftStop && rgSpriteCmd.CurrentState != MainState.enHURT &&!ButtonSound.isClick(x, y)){rgSpriteCmd.CurrentState = MainState.enWALKLEFT;//向左走}else if ((y - rgSpriteCmd.y - rgSpriteCmd.unHeight / 2) = (x - rgSpriteCmd.x - rgSpriteCmd.unWidth / 2) && (y - rgSpriteCmd.y - rgSpriteCmd.unHeight / 2) >= -(x - rgSpriteCmd.x - rgSpriteCmd.unWidth / 2)&& !rgSpriteCmd.IsDownStop && rgSpriteCmd.CurrentState != MainState.enHURT &&!ButtonSound.isClick(x, y)){rgSpriteCmd.CurrentState = MainState.enWALKDOWN;//向下走}}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public Boolean CheckHitEnemy(SpriteCmd Cmd,SpriteCmd SpCmd) {if (Cmd.unLayer!=255 && SpCmd.unLayer != 255) {if (Cmd.x Cmd.unWidth > SpCmd.x && Cmd.x < SpCmd.x SpCmd.unWidth && Cmd.y Cmd.unHeight > SpCmd.y && Cmd.y < SpCmd.y SpCmd.unHeight) {return true;}} return false;}/////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}public void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubx_sensor = event.values[0]; // 手机横向翻滚// x>0 说明当前手机左翻 x0 说明当前手机下翻 y0 手机屏幕朝上 z
- 2015-07-02下载
- 积分:1
android 百度地图轨迹 源码下载(百度地图v3.7.0)
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 bitmapList = new ArrayList(); 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 pts = new ArrayList(); 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 "" radarNearbyResult.infoList.get(0).distance "" radarNearbyResult.infoList.get(0).pt "" 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 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 // "longitude:" mBaiduMap.getLocationData().longitude // "direction:" 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("error code : "); sb.append(location.getLocType()); sb.append("latitude : "); sb.append(location.getLatitude()); sb.append("lontitude : "); sb.append(location.getLongitude()); sb.append("radius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 sb.append("speed : "); sb.append(location.getSpeed());// 单位:公里每小时 sb.append("satellite : "); sb.append(location.getSatelliteNumber()); sb.append("height : "); sb.append(location.getAltitude());// 单位:米 sb.append("direction : "); sb.append(location.getDirection());// 单位度 sb.append("addr : "); sb.append(location.getAddrStr()); sb.append("describe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 sb.append("addr : "); sb.append(location.getAddrStr()); //运营商信息 sb.append("operationers : "); sb.append(location.getOperators()); sb.append("describe : "); sb.append("网络定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 sb.append("describe : "); sb.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("describe : "); sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("describe : "); sb.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("describe : "); sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.append("locationdescribe : "); sb.append(location.getLocationDescribe());// 位置语义化信息,结果类似于“在北京天安门附近” List list = location.getPoiList();// POI数据 if (list != null) { sb.append("poilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("poi= : "); sb.append(p.getId() " " p.getName() " " p.getRank()); } } Log.i(TAG, sb.toString()); } }} 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 bitmapList = new ArrayList(); 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 pts = new ArrayList(); 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 "" radarNearbyResult.infoList.get(0).distance "" radarNearbyResult.infoList.get(0).pt "" 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 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 // "longitude:" mBaiduMap.getLocationData().longitude // "direction:" 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("error code : "); sb.append(location.getLocType()); sb.append("latitude : "); sb.append(location.getLatitude()); sb.append("lontitude : "); sb.append(location.getLongitude()); sb.append("radius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 sb.append("speed : "); sb.append(location.getSpeed());// 单位:公里每小时 sb.append("satellite : "); sb.append(location.getSatelliteNumber()); sb.append("height : "); sb.append(location.getAltitude());// 单位:米 sb.append("direction : "); sb.append(location.getDirection());// 单位度 sb.append("addr : "); sb.append(location.getAddrStr()); sb.append("describe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 sb.append("addr : "); sb.append(location.getAddrStr()); //运营商信息 sb.append("operationers : "); sb.append(location.getOperators()); sb.append("describe : "); sb.append("网络定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 sb.append("describe : "); sb.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("describe : "); sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("describe : "); sb.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("describe : "); sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.append("locationdescribe : "); sb.append(location.getLocationDescribe());// 位置语义化信息,结果类似于“在北京天安门附近” List list = location.getPoiList();// POI数据 if (list != null) { sb.append("poilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("poi= : "); sb.append(p.getId() " " p.getName() " " p.getRank()); } } Log.i(TAG, sb.toString()); } } } 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 bitmapList = new ArrayList(); 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 pts = new ArrayList(); 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 "" radarNearbyResult.infoList.get(0).distance "" radarNearbyResult.infoList.get(0).pt "" 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 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 // "longitude:" mBaiduMap.getLocationData().longitude // "direction:" 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("error code : "); sb.append(location.getLocType()); sb.append("latitude : "); sb.append(location.getLatitude()); sb.append("lontitude : "); sb.append(location.getLongitude()); sb.append("radius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 sb.append("speed : "); sb.append(location.getSpeed());// 单位:公里每小时 sb.append("satellite : "); sb.append(location.getSatelliteNumber()); sb.append("height : "); sb.append(location.getAltitude());// 单位:米 sb.append("direction : "); sb.append(location.getDirection());// 单位度 sb.append("addr : "); sb.append(location.getAddrStr()); sb.append("describe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 sb.append("addr : "); sb.append(location.getAddrStr()); //运营商信息 sb.append("operationers : "); sb.append(location.getOperators()); sb.append("describe : "); sb.append("网络定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 sb.append("describe : "); sb.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("describe : "); sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("describe : "); sb.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("describe : "); sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.append("locationdescribe : "); sb.append(location.getLocationDescribe());// 位置语义化信息,结果类似于“在北京天安门附近” List list = location.getPoiList();// POI数据 if (list != null) { sb.append("poilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("poi= : "); sb.append(p.getId() " " p.getName() " " p.getRank()); } } Log.i(TAG, sb.toString()); } }}
- 2016-11-09下载
- 积分:1