package com.amap.map3d.demo;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Point;import android.net.ConnectivityManager;import android.os.Bundle;import android.util.Log;import android.widget.Toast;import com.amap.api.fence.GeoFence;import com.amap.api.fence.GeoFenceClient;import com.amap.api.fence.GeoFenceListener;import com.amap.api.location.AMapLocation;import com.amap.api.location.AMapLocationClient;import com.amap.api.location.AMapLocationClientOption;import com.amap.api.location.AMapLocationListener;import com.amap.api.location.DPoint;import com.amap.api.maps.AMap;import com.amap.api.maps.MapView;import com.amap.api.maps.model.BitmapDescriptorFactory;import com.amap.api.maps.model.CameraPosition;import com.amap.api.maps.model.CircleOptions;import com.amap.api.maps.model.LatLng;import com.amap.api.maps.model.Marker;import com.amap.api.maps.model.MarkerOptions;import com.amap.api.maps.model.MyLocationStyle;import org.jetbrains.annotations.Nullable;import java.util.List;/** * Created by PVer on 2018/4/9. */public class DingweiActivity extends Activity implements AMapLocationListener, GeoFenceListener {    private AMapLocationClient aMapLocationClient;    private AMapLocationClientOption locationClientOption;    private AMap aMap;    private MapView mapView;    private MyBroadcastReceiver mBReceiver;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_map);        mapView = (MapView) findViewById(R.id.map);        mapView.onCreate(savedInstanceState);        init();        showLocationIcon();        createMark();        create();//围栏初始化 //注册监听事件        mGeoFenceClient = new GeoFenceClient(getApplicationContext());        mGeoFenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN| GeoFenceClient.GEOFENCE_OUT| GeoFenceClient.GEOFENCE_STAYED);        mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);//接受定位广播        IntentFilter filter = new IntentFilter(                ConnectivityManager.CONNECTIVITY_ACTION);        filter.addAction(GEOFENCE_BROADCAST_ACTION);        mBReceiver = new MyBroadcastReceiver();        registerReceiver(mBReceiver, filter);    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态        mapView.onSaveInstanceState(outState);    }    //---------------todo  定位代码---------------------------------------------------------------------    public void init() {        aMap = mapView.getMap();        aMapLocationClient = new AMapLocationClient(this);        locationClientOption = new AMapLocationClientOption();        //设置返回地址信息,默认为true        locationClientOption.setNeedAddress(true);//设置定位监听//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式        locationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位间隔,单位毫秒,默认为2000ms        locationClientOption.setInterval(2000);        aMapLocationClient.setLocationListener(DingweiActivity.this);//定位监听 获取定位信息onLocationChanged()        aMapLocationClient.setLocationOption(locationClientOption);        aMapLocationClient.startLocation();    }    @Override    public void onLocationChanged(AMapLocation aMapLocation) {        StringBuffer sb = new StringBuffer();        if (aMapLocation != null) {            if (aMapLocation.getErrorCode() == 0) {                sb.append("定位成功" + "\n");                sb.append("定位类型: " + aMapLocation.getLocationType() + "\n");                sb.append("经    度    : " + aMapLocation.getLongitude() + "\n");                sb.append("纬    度    : " + aMapLocation.getLatitude() + "\n");                sb.append("精    度    : " + aMapLocation.getAccuracy() + "米" + "\n");                sb.append("提供者    : " + aMapLocation.getProvider() + "\n");                sb.append("速    度    : " + aMapLocation.getSpeed() + "米/秒" + "\n");                sb.append("角    度    : " + aMapLocation.getBearing() + "\n");                // 获取当前提供定位服务的卫星个数                sb.append("星    数    : " + aMapLocation.getSatellites() + "\n");                sb.append("国    家    : " + aMapLocation.getCountry() + "\n");                sb.append("省            : " + aMapLocation.getProvince() + "\n");                sb.append("市            : " + aMapLocation.getCity() + "\n");                sb.append("城市编码 : " + aMapLocation.getCityCode() + "\n");                sb.append("区            : " + aMapLocation.getDistrict() + "\n");                sb.append("区域 码   : " + aMapLocation.getAdCode() + "\n");                sb.append("地    址    : " + aMapLocation.getAddress() + "\n");                sb.append("兴趣点    : " + aMapLocation.getPoiName() + "\n");                //定位完成的时间      //              sb.append("定位时间: " + Utils.formatUTC(aMapLocation.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n");                //Log.e("tag", sb.toString());            }        }    }    //todo------------定位图标与map  的关联-----------------------------------------    private MyLocationStyle myLocationStyle;    public void showLocationIcon() {        myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。        myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位模式 不跟随   默认情况下跟随        aMap.setMyLocationStyle(myLocationStyle);  //图片与map 相互关联        aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。        aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。    }    //todo -----------------創建圍欄创建围栏  并监听 围栏事件--------    private GeoFenceClient mGeoFenceClient;    public void showWeiLan(double v1, double v2) {        //创建自定义 围栏   圆形//创建一个中心点坐标        DPoint centerPoint = new DPoint(v1, v2);        mGeoFenceClient.addGeoFence(centerPoint, 300f, "1");        //围栏监听信息        mGeoFenceClient.setGeoFenceListener(this);        Log.e("tag", "============围栏300==================1");    }    //绘制面    public void circle(double v1, double v2) {        LatLng latLng = new LatLng(v1, v2);        aMap.addCircle(new CircleOptions().center(latLng)                .radius(300).strokeColor(Const.STROKE_COLOR)                .fillColor(Const.FILL_COLOR).strokeWidth(Const.STROKE_WIDTH));        Log.e("tag", "============圈圈300==================2");    }    //点击地图任意一个地方创建围栏    public void create() {        aMap.setOnMapClickListener(new AMap.OnMapClickListener() {            @Override            public void onMapClick(LatLng latLng) {                Log.e("经纬度", latLng.latitude + "/////" + latLng.longitude);                circle(latLng.latitude, latLng.longitude);                showWeiLan(latLng.latitude, latLng.longitude);            }        });    }    //围栏监听信息    @Override    public void onGeoFenceCreateFinished(List list, int i, String s) {        if (i == GeoFence.ADDGEOFENCE_SUCCESS) {//判断围栏是否创建成功            //geoFenceList就是已经添加的围栏列表            //    Toast.makeText(DingweiActivity.this, "yy", Toast.LENGTH_SHORT).show();            Log.e("ee", "创建围栏成功");            //创建并设置PendingIntent  发送广播        } else {            //geoFenceList就是已经添加的围栏列表            Log.e("ee", "创建围栏失敗");        }    }    //todo -------------------------------------------------------------------    //定义接收广播的action字符串    public static final String GEOFENCE_BROADCAST_ACTION = "com.location.apis.geofencedemo.broadcast";    class MyBroadcastReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {                //解析广播内容                Bundle bundle = intent.getExtras();                //获取当前有触发的围栏对象:                GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE);                Toast.makeText(context, fence.getStatus() + "-----------", Toast.LENGTH_SHORT).show();                int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);                StringBuffer sb = new StringBuffer();                switch (status) {                    case GeoFence.STATUS_LOCFAIL:                        sb.append("定位失败");                        break;                    case GeoFence.STATUS_IN:                        sb.append("进入围栏 ");                        Toast.makeText(context, "enter围栏", Toast.LENGTH_SHORT).show();                        Log.e("tttt", "进入围栏");                        break;                    case GeoFence.STATUS_OUT:                        sb.append("离开围栏 ");                        Toast.makeText(context, "离开围栏", Toast.LENGTH_SHORT).show();                        Log.e("tttt", "离开围栏");                        break;                    case GeoFence.STATUS_STAYED:                        sb.append("停留在围栏内 ");                        Log.e("tttt", "停留围栏");                        Toast.makeText(context, "停留围栏", Toast.LENGTH_SHORT).show();                        break;                    default:                        break;                }            }        }    }    /**     * 添加mark     */    public void createMark() {        //map  地图添加   监听mark     必须的        aMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() {            @Override            public void onMapLoaded() {                addMarkersToMap();            }        });        //拖动地图  获取地图位置设置地图状态的监听接口。        aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {            @Override            public void onCameraChange(CameraPosition cameraPosition) {                Log.e("AAPP_CHANGE", cameraPosition.toString());            }            @Override            public void onCameraChangeFinish(CameraPosition cameraPosition) {                Log.e("AAPP_FINISH", cameraPosition.toString());            }        });// 对amap添加移动地图事件监听器    }    /**     * 在地图上添加marker     */    private void addMarkersToMap() {        addMarkerInScreenCenter();    }    /**     * 在屏幕中心添加一个Marker     */    /**     * 可视区域的位置(CameraPosition)     * 

* 可视区域的位置由以下属性组成: *

* 目的地(target) * 缩放级别(zoom) * 方向(bearing) * 倾斜角度(tilt) *

* 屏幕当前可视区域的位置可以通过 AMap.getCameraPosition() 方法获取。 * 目的地(target) * 屏幕中心marker 跳动 *

* 该mark 始终在屏幕的中心点 不跟随地图的移动而移动 因此在监听地图拖动监听事件时获取地理位置 也要进行中心点的判断 *

* getCameraPosition() 和 aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {} CameraPosition 一致 */ Marker screenMarker = null; private void addMarkerInScreenCenter() { LatLng latLng = aMap.getCameraPosition().target;// 目的地(target) 缩放级别(zoom) 方向(bearing) 倾斜角度(tilt) Point screenPosition = aMap.getProjection().toScreenLocation(latLng); screenMarker = aMap.addMarker(new MarkerOptions() .anchor(0.5f, 0.5f) .icon(BitmapDescriptorFactory.fromResource(R.drawable.purple_pin))); //设置Marker在屏幕上,不跟随地图移动 screenMarker.setPositionByPixels(screenPosition.x, screenPosition.y); } //通过Mark 所在的坐标点 获取 坐标获取 poi/* public void getPoi() { PoiSearch poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(locationMarker.getPosition().latitude, locationMarker.getPosition().longitude), 1000));//设置周边搜索的中心点以及半径 }*/ @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图 mapView.onDestroy(); aMapLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。 unregisterReceiver(mBReceiver); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图 mapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制 mapView.onPause(); }}如图 :当创建 围栏所在的区域范围内包含自己所在的定点坐标 会提示 已经进入围栏 反之离开围栏

Android 高德地图 定位+围栏_第1张图片
Android 高德地图 定位+围栏_第2张图片

代码传送https://download.csdn.net/download/bxllove/10340794

更多相关文章

  1. RotateAnimation 设置旋转中心点、不停顿
  2. 高德地图自定义点聚合样式Android
  3. 百度地图android开发资料
  4. Android百度地图——路径规划(驾车、步行和公交线路搜索)
  5. Android引路蜂地图开发包
  6. 根据百度地图API得到坐标和地址并在地图上显示
  7. android百度地图 覆盖物弹出层效果
  8. Android使用百度地图SDK获得当前设备位置所在的省、市(系列1)
  9. android 百度地图轨迹回放

随机推荐

  1. USB Accessory
  2. Android模拟键盘和键盘监听的一些调研
  3. 【MarsChen】D03_Say_Hello_to_Android
  4. android 进度条的样式
  5. Android(安卓)UI框架概览
  6. android ndk (3)
  7. 【转】关于Android的.so文件你所需要知道
  8. Android(安卓)底部导航栏的两种实现(附源
  9. android屏幕适配详解
  10. android MediaPlayer 架构介绍