寅时Android SDK是一套基于Android 4.3 及以上版本设备的应用程序接口。您可以使用该套SDK开发适用于Android系统移动设备的室内地图和室内定位类的应用,通过调用该SDK接口,您可以轻松的访问寅时的地图数据和定位服务,构建功能丰富、交互类强的Android应用。
使用须知:您需在申请key,创建应用后,才可以使用寅时Android SDK。
在您使用寅时Android SDK之前,请先阅读政策规范。
第一步:将jar包复制到工程目录的s目录下
第二步:将下载的so库文件夹放到s目录下
第一步:将jar包复制到app目录的s目录下,并且将jar添加到gradle中,在app>gradle>dependencies中出现该jar包的引用
第二步:将下载的so库文件夹放到s目录下
```
-keep class com.innsmap.InnsMap.** {*;}
-dontwarn com.innsmap.InnsMap.**
```
保证INNS地图类不被混淆,否则会出现不可用的异常
<application
<meta-data
android:name="com.innsmap.InnsMap.SDKKEY"
android:value="开发者申请的 key" />
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
public class MainActivity extends Activity
{
private INNSMapView mInnsMap;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
INNSMapSDK.init(getApplicationContext());
setContentView(R.layout.home_main);
}
}
注意:使用SDK各功能组件之前都需要调用
SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中
另外该方法需要请求网络验证,若init失败,SDK所有功能将不能使用
<com.innsmap.InnsMap.INNSMapView
android:id="@+id/inns_map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
public class MainActivity extends Activity {
private INNSMapView mInnsMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 注意该方法要再setContentView方法之前实现
INNSMapSDK.init(getApplicationContext());
setContentView(R.layout.home_main);
// 获取地图控件引用
mInnsMap = (INNSMapView) findViewById(R.id.inns_map);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy()
mInnsMap.onDestroy();
}
}
(1)// 加载一张inns的地图
mInnsMap.loadMap("地图的buildingId", "地图的floorId", new NetMapLoadListener() {
@Override
public void onSuccess() {
// 加载inns室内地图成功,界面自动绘制该地图
}
@Override
public void onFail(String msg) {
// 加载失败,返回失败原因
}
});
(1)// 将地图的中心移动到某点
float x = 10.3f; // 需要移动到的点x坐标,单位:m
float y = 23.1f; // 需要移动到的点y坐标,单位:m
mInnsMap.translateToCenter(x, y);
// 查看地图是否响应手势
boolean isDrag = mInnsMap.isResponseDrag()
//设置地图是否响应平移手势
mInnsMap.responseDrag(boolean isDrag)
//查看地图是否响应旋转手势
boolean isRotate = mInnsMap.isResponseRotate()
//设置地图是否响应旋转手势
mInnsMap.responseRotate(boolean isRotate)
//查看地图是否响应缩放手势
boolean isScale = mInnsMap.isResponseScale()
//设置地图是否响应缩放手势
mInnsMap.responseScale(boolean isScale)
//查看地图是否响应双指下滑手势
boolean isSlideDown = mInnsMap.isResponseSlideDown()
//设置地图是否响应双指下滑手势
mInnsMap.responseSlideDown(boolean isSlideDown)
//查看地图是否响应点击事件
boolean isClick = mInnsMap.isResponseClick()
//设置地图是否响应点击事件
mInnsMap.responseClick(boolean isClick)
//查看地图是否响应长按事件
boolean isLongPress = mInnsMap.isResponseLongPress()
//设置地图是否响应长按事件
mInnsMap.responseLongPress(boolean isLongPress)
(1)// 基础地图的点击事件
mInnsMap.setOnINNSMapClickListener(new OnINNSMapClickListener() {
@Override
public void onMapClick(float x, float y) {
// x,y的单位均为米(室内地图的实际坐标单位,非view的像素)
}
});
(2)// 基础地图的长按事件
mInnsMap.setOnINNSMapLongPressListener(new OnINNSMapLongPressListener() {
@Override
public void onMapLongPress(float x, float y) {
// x,y的单位均为米(室内地图的实际坐标单位,非view的像素)
}
});
(3)// 基础地图的触摸事件
mInnsMap.setOnMapTouchListener(new OnMapTouchListener() {
@Override
public void onTouch(MotionEvent event) {
}
});
// 设置POI是否可以手动点击地图拾取,拾取后POI会高亮
mInnsMap.setPoiClick(true); // 可以拾取
mInnsMap.setPoiClick(false); // 不能拾取(默认状态)
// 设置手动点击地图拾取POI的监听
mInnsMap.setPoiClickListener(new POIClickListener() {
@Override
public void onPOIClick(POI poi) {
// 回调被拾取的那个POI
}
});
// POI的属性
public class POI {
private int id; // 唯一标识
private String label; // poi名称
private PointF f; // 标识的中心点
private int poiType; // 大类
private int poiStypeId; // 小类
}
// 获取当前地图上的所有POI
List<POI< poiList = mInnsMap.getAllPOI();
// 设置一个拾取的POI,会取消之前拾取的POI
int poiId = 1;
mInnsMap.setHighLightPOI(poiId);
// 设置多个拾取的POI,会取消之前拾取的POI
List<Integer< poiIdList = new ArrayList<Integer<();
poiIdList.add(1); // 添加需要拾取的poiId
poiIdList.add(2);
poiIdList.add(3);
mInnsMap.setHighLightPOI(poiIdList);
// 取消所有拾取的POI
mInnsMap.cancelHighLightPOI();
// 显示需要展示的公共设施,其它的公共设置会隐藏,传入空集合会隐藏所有
List<Integer< facilitiesIdList = new ArrayList<Integer<();
facilitiesIdList.add(1); // 添加需要展示的公共设施id
facilitiesIdList.add(2);
facilitiesIdList.add(3);
mInnsMap.setShowFacilities(facilitiesIdList);
// 显示所有的公共设置
mInnsMap.showAllFacilities();
// 设置公共设施的拾取监听
mInnsMap.setFacilityOnclickListener(new FacilityClickListener() {
@Override
public void onClick(FacilityBean facilityBean) {
// 回调拾取的公共设施
}
}
)
// 点覆盖物的基本属性
PointOverlayer pointOverlayer = new PointOverlayer();
// 设置覆盖物的位置,x,y单位:m
pointOverlayer.setPointF(new PointF(10, 20));
pointOverlayer.setColor(0xffff0000); // 设置颜色
pointOverlayer.setRadius(10); // 设置点的直径
// 点集覆盖物的基本属性
PointGroupOverlayer pointGroupOverlayer = new PointGroupOverlayer();
// 设置覆盖物的位置,x,y单位:m
pointGroupOverlayer.setPointFList(List<PointF< pointFList); //设置覆盖物点集
pointGroupOverlayer.setPointFList(List<PointF< pointFList, int filter); //设置覆盖物点集以及筛选半径
pointGroupOverlayer.setColor(0xffff0000); // 设置颜色
pointGroupOverlayer.setRadius(10); // 设置点的直径
//文字覆盖物的基本属性
TextOverlayer textOverLayer = new TextOverLayer();
textOverLayer.setDesc("文字内容");
textOverLayer.setColor(0xffff0000); // 设置颜色
textOverLayer.setSize(size); // 设置字体大小
textOverLayer.setPointF(new PointF(10, 10)); // 单位:m
// 线覆盖物的基本属性
LineOverlayer lineOverlayer = new LineOverlayer();
List<PointF< loPointList = new ArrayList<PointF<();
loPointList.add(new PointF(10, 10)); // 单位:m
loPointList.add(new PointF(20, 10));
loPointList.add(new PointF(30, 30));
lineOverlayer.setPointFList(loPointList); //构造折线各点,至少需要2个点
lineOverlayer.setWidth(5); // 线的宽度,单位:px 像素
lineOverlayer.setLineColor(0xffff0000); // 设置颜色
// 图片覆盖物的基本属性
BitmapOverlayer bitmapOverlayer = new BitmapOverlayer();
bitmapOverlayer.setPointF(new PointF(10, 10)); // 单位:m
BitmapInformation bmpOverlayer = BitmapInformationFactory.fromResource(R.drawable.ic_launcher);
bitmapOverlayer.icon(bmpOverlayer); // 放入图形
bitmapOverlayer.setTitle("文字标题"); //设置图片标题
bitmapOverlayer.setTitleSize(size); // 设置标题字体大小
bitmapOverlayer.setTitleColor(0xffff0000); // 设置标题颜色
//多边形覆盖物
PolygonOverlayer polygonOverlayer = new PolygonOverlayer();
List<PointF< poPointList = new ArrayList<PointF<();
poPointList.add(new PointF(10, 10)); // 单位:m
poPointList.add(new PointF(20, 10));
poPointList.add(new PointF(30, 30));
polygonOverlayer.setPointFList(poPointList); //构造多边形定点,至少需要3个点
polygonOverlayer.setWidth(5); // 线的宽度,单位:px 像素
polygonOverlayer.setLineColor(0xffff0000); // 设置颜色
polygonOverlayer.setFillColor(0xffff0000); // 设置填充颜色
polygonOverlayer.setDesc("文字描述"); // 设置文字描述
polygonOverlayer.setTextSize(size); // 设置文字大小
polygonOverlayer.setTextColor(0xffffffff); // 设置文字颜色
polygonOverlayer.setTextPointF(new PointF(15, 15)); // 设置文字颜色
//圆形覆盖物
CircleOverlayer circleOverlayer = new CircleOverlayer();
circleOverlayer.setPointF(new PointF(10, 20));
circleOverlayer.setColor(0xffff0000); // 设置填充颜色
circleOverlayer.setRadius(10); // 设置圆的直径 单位:m
circleOverlayer.setLineColor(0xffff0000); // 设置边线颜色
circleOverlayer.setLineWidth(5); // 边线的宽度,单位:px 像素
//气泡覆盖物
BubbleWindow bubbleWindow = new BubbleWindow();
bubbleWindow.setContext("文字内容"); // 使用默认样式并设置文字内容
bubbleWindow.setPointF(new PointF(10, 10)); // 单位: m
bubbleWindow.setxOffset(50); // 设置x轴偏移量 正数向右,负数向左
bubbleWindow.setyOffset(50); // 设置y轴偏移量 正数向下,负数向上
bubbleWindow.setTextSize(size); // 使用默认样式并设置文字大小
bubbleWindow.setTextColor(0xffff0000); // 使用默认样式并设置文字颜色
bubbleWindow.setView(view); // 使用自定义样式
bubbleWindow.setBitmapDescriptor(bitmap); // 使用自定义样式
//所有覆盖物的共有属性
overlayer.setLayer(10); // 设置覆盖物分层
overlayer.setTag(10); // 设置覆盖物分类 提供于开发者使用
overlayer.isResponseListener(); // 当前覆盖物是否响应点击事件
overlayer.setResponseListener(true); // 设置当前覆盖物响应点击事件
overlayer.setResponseListener(false); // 设置当前覆盖物不响应点击事件
// 所有覆盖的共有事件监听,点击
pointOverlayer.setClickListener(new OverlayerClickListener() {
@Override
public void onClick(Overlayer overlayer) {
// 返回点击的overlayer,可根据overlayer的id判断是哪个覆盖物
// 并且可以转型为传入的对应覆盖物获取其属性
}
});
// 所有覆盖的共有事件监听,长按
pointOverlayer.setLongPressListener(new OverlayerLongPressListener() {
@Override
public void onLongPress(Overlayer overlayer) {
// 返回点击的overlayer,可根据overlayer的id判断是哪个覆盖物
// 并且可以转型为传入的对应覆盖物获取其属性
}
});
// 设置是否响应覆盖物的监听事件
mInnsMap.setResponseOverlayListener(true); // 响应点击,长按等监听(默认状态)
mInnsMap.setResponseOverlayListener(false);// 不响应点击,长按等监听
// 添加一个覆盖物
mInnsMap.addOverlayer(lineOverlayer);
// 添加多个覆盖物
List<Overlayer< overlayers = new ArrayList<Overlayer<();
overlayers.add(pointOverlayer);
overlayers.add(lineOverlayer);
overlayers.add(bitmapOverlayer);
mInnsMap.addOverlayer(overlayers);
// 移除一个覆盖物
mInnsMap.removeOverlayer(lineOverlayer);
// 移除多个覆盖物
mInnsMap.removeOverlayer(overlayers);
// 移除所有覆盖物
mInnsMap.removeAllOverlayer();
//查看是否隐藏重叠覆盖物
mInnsMap.isSiftOverlay();
//设置是否需要重叠隐藏,默认隐藏.根据覆盖物的tag属性进行筛选
mInnsMap.setSiftOverlay(true); //隐藏重叠的覆盖物
mInnsMap.setSiftOverlay(false);//不隐藏重叠的覆盖物
// 显示路径
List<List<PointF>> serchPath = null; // 这里是通过寻径接口获取到的路径
mInnsMap.showSearchPath(serchPath);
// 取消路径的显示
mInnsMap.cancelSearchPath();
// 绘制定位点,并开启箭头指示方向
PointF loaction = null; // 这里是通过定位接口获取到的数据
mInnsMap.setPositionPoint(loaction);
// 取消定位点的显示
mInnsMap.cancelPositionPoint();
// 获取指北针是否显示
mInnsMap.isCompassShow();
// 设置指北针位置的2种方式,并让其显示
// 1.SDK提供了左上,左下,右上,右下4种
mInnsMap.setCompass(CompassType.LeftTop);
// 2.自定义指北针边框,单位:px像素
mInnsMap.setCompass(10.3f, 22.4f);
// 取消指北针的显示
mInnsMap.cancelCompass();
// 设置一张自定义的指北针图片
Bitmap decodeResource = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
mInnsMap.setCompassBitmap(decodeResource);
(1)获取当前view的截图
// 获取当前view的截图
mInnsMap.getCurrentMap(new OnMapBitmapListeners() {
@Override
public void onBitmap(Bitmap bitmap) {
}
});
// 将地图上的点转为该view的像素点
// x 地图上的x坐标
// y 地图上的y坐标
PointF pointF = mInnsMap.map2Px(10.3f, 22.4f);
// 将view上的像素点转为地图上的坐标
// x 相对于view左上角的x坐标
// y 相对于view左上角的y坐标
PointF pointF = mInnsMap.px2Map(10.3f, 22.4f);
//获取当前地图相对正北的旋转角度
float rotate = mInnsMap.getCurrentRotateDegrees();
//获取当前地图的缩放比例
float zoom = mInnsMap.getCurrentZoom();
//设置当前地图的相对正北的旋转角度
mInnsMap.setRotateDegrees(10.3f);
//获取地图是否为3D模式
mInnsMap.is3DMap();
//设置地图是否为3D模式
mInnsMap.setIs3DMap(boolean is3DMap);
// 获取当前app授权过楼宇的所有城市
INNSMapSDKResource.getAccreditCity(new NetAccreditCityListener() {
@Override
public void onSuccess(List<NetAccreditCityBean> list) {
// 成功
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetAccreditCityBean {
private int cityId; // 城市id
private String cityName; // 城市名称
private String cityPinYin; // 拼音
private float longitude; // 经度
private float latitude; // 纬度
}
// 获取某个国家,某个城市下的所有楼宇
int countryId = 86; // 国家id,86表示中国
int cityId = 103; // 需要查询的城市id
INNSMapSDKResource.getCityBuilding(countryId, cityId, new NetCityBuildingListener() {
@Override
public void onSuccess(List<NetCityBuildingBean> list) {
// 成功
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetCityBuildingBean {
private String buildingId; // 楼宇id
private String buildingName; // 楼宇名称
private String loge; // 楼宇logo的url
private float longitude; // 经度
private float latitude; // 纬度
}
// 获取某个楼宇的详情,包括有多少楼层、楼层数、名称等
INNSMapSDKResource.getBuildingDetail("地图的buildingId", new NetBuildingDetailListener() {
@Override
public void onSuccess(NetBuildingDetailBean buildingDetail) {
// 成功
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetBuildingDetailBean {
private String buildingId; // 楼宇的id
private int floorCount; // 楼层的总数
private String defaultFloor; // 默认显示的层数id
private String buildingName; // 楼宇的名称
private String buildingAddress; // 楼宇的地址
private String buildingProvince; // 省份
private String buildingCity; // 市
private String buildingCounty; // 县
private List<NetBuildingDetailFloorBean> overgroundList; // 地面上楼层的集合
private List<NetBuildingDetailFloorBean> undergroundList; // 地下楼层的集合
}
public class NetBuildingDetailFloorBean {
private String floorName; // 楼层的名称
private int floorNum; // 楼层号
private String floorId; // 楼层的id
}
SDK 提供了路径查询功能。
// 同楼宇下,相同楼层,或者不同楼层的路径查询
String buildingId = "需要查询路径的楼宇id";
String floorIdStart = "起始点的楼层id";
int poiIdStart = 1; // 起始点的poiId,此参数与pointStart,只能使用其中一个,会优先使用此参数,如果不用此参数,传0
PointF pointStart = new PointF(10, 20); // 起始点的坐标,单位:m
String floorIdEnd = "结束点的楼层id";
int poiIdEnd = 2; // 结束点的poiId,此参数与pointEnd,只能使用其中一个,会优先使用此参数,如果不用此参数,传0
PointF pointEnd = new PointF(30, 10); // 结束点的坐标,单位:m
INNSMapSDKResource.searchPath(buildingId, floorIdStart, poiIdStart, pointStart, floorIdEnd, poiIdEnd, pointEnd, new NetPathSearchListener() {
@Override
public void onSuccess(Map<String, List<List<PointF>>> map) {
// 这里返回的是一个map,key为floorId,value为路径的参数
// 在当界面面绘制寻径结果,如:
List<List<PointF>> searchValue = map.get("currentFloorId");
mInnsMap.showSearchPath(searchValue);
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
// POI详情查询
int poiId = 199; // 需要查询详情的poiId
INNSMapSDKResource.getPoiDetail("地图的buildingId", "地图的buildingId", poiId, new NetPoiDetailListener() {
@Override
public void onSuccess(NetPoiDetailBean poiDetail) {
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetPoiDetailBean {
private String poiName; // poi的名称
private String poiTel; // poi的电话
private String poiLogoUrl; // poi中log的url
private String poiRemark; // poi的备注
private String poiAddress; // poi的地址
private String poiIntro; // poi的简介
private String poiBigType; // poi的大类名称
private String poiSmallType; // poi的小类名称
}
// 楼宇范围内搜索POI
String searchName = "肯德基"; // 需要搜索的内容
INNSMapSDKResource.searchPoiInBuilding("地图的buildingId", searchName, new NetPoiSearchListener() {
@Override
public void onSuccess(List<NetPoiPropBean> list) {
// 成功返回的集合
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetPoiPropBean {
private int poiId; // poi的id
private String poiName; // poi的名称
private String buildingId; // 楼宇的id
private String buildingName; // 楼宇的名称
private String floorId; // 楼层的id
private String floorName; // 楼层的名称
private int floorNum;// 楼层
private String photoPath; // POI图片的路径
private PointF point; // POI的中心点
}
// 城市范围内搜索POI
int cityId = 103; // 需要搜索的城市id
String searchName2 = "耐克";
INNSMapSDKResource.searchPoiInCity(cityId, searchName2, new NetPoiSearchListener() {
@Override
public void onSuccess(List<NetPoiPropBean> list) {
// 成功返回的集合
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetPoiPropBean {
private int poiId; // poi的id
private String poiName; // poi的名称
private String buildingId; // 楼宇的id
private String buildingName; // 楼宇的名称
private String floorId; // 楼层的id
private String floorName; // 楼层的名称
private int floorNum;// 楼层
private String photoPath; // POI图片的路径
private PointF point; // POI的中心点
}
// 获取某个城市下所有的POI分类情况
int cityId2 = 103; // 需要搜索的城市id
INNSMapSDKResource.getPoiType(cityId2, new NetPoiTypeListener() {
@Override
public void onSuccess(List<NetPoiBigType> list) {
// 成功返回的集合
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetPoiBigType {
private String bigTypeName; // poi大类的名称
private List<String> smallTypeList; // 该poi大类下所有小类名称的集合
}
// 获取某种类型的所有公共设施
int type2 = 1; // 需要获取的公共设施类型
//1卫生间 2楼梯 4电梯 5出入口 6扶梯 31:吸烟区;32;收银台33:服务台;34:atm;36:问讯处;37:饮水处;
INNSMapSDKResource.getTypeFacilities("地图的buildingId", "地图的floorId", type2, new NetIdPointListener() {
@Override
public void onSuccess(List<NetIdPointBean> list) {
// 成功返回的集合
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetSurroundingBean {
private int id; // 公共设施的id
private float length; // 与传入点的距离
private PointF f; // 改poi的中心点
}
// 生成一个分享位置的信息,给开发者使用
int style = 1; // 位置的类型 1:定位点 2:标记点
float x = 13; // x坐标,单位:m
float y = 32; // y坐标,单位:m
String desc = "我要分享的话是……";
INNSMapSDKResource.getShareInfo("地图的buildingId", "地图的floorId", style, x, y, desc, new NetShareInfoListener() {
@Override
public void onSuccess(NetShareInfo info) {
// 成功返回分享的信息
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetShareInfo {
private long timestamp; // 时间戳
private String title; // 生成的标题 如:“浙江省桐乡市乌镇石佛南路18号 乌镇枕水度假酒店”
private String desc; // 自定义的描述
private String imageUrl; // 图片的url
private String link; // 点击进入的链接
}
// 共享位置功能,通过传入userId的集合,获取想知道的数据位置(如果传入userId正在使用定位)
List userIds = new ArrayList();
userIds.add("userId_1"); // 添加想知道位置的userId
userIds.add("userId_2");
userIds.add("userId_3");
INNSMapSDKResource.shareLocation(userIds, new NetShareLocationListener() {
@Override
public void onSuccess(List list) {
// 成功,返回当前有结果的userId位置集合
}
@Override
public void onFail(String msg) {
// 失败原因
}
});
public class NetShareLocation {
private String userId; // userId
private String buildingId; // 楼宇id
private String floorId; // 楼层id
private float x; // x坐标
private float y; // y坐标
}
// 获取SDK的基本信息
String version = INNSMapSDK.getSDKVersion();
// 获取SDK的用户userId,只能在SDK初始化完成后调用,否则返回"";
String userId = INNSMapSDK.getUserId();
INNSMap Android SDK中的定位相关API为Android移动端应用提供一套简单易用的定位服务接。利用三角定位、WIFI纹模拟、地磁以及蓝牙等,提供1-3m高精度的室内定位服务。通过使用INNSMAP SDK,开发者可以轻松为应用程序实现智能、精准、高效的定位功能。
import com.innsmap.InnsMap.INNSMapLocationClient;
import com.innsmap.InnsMap.location.bean.INNSMapLocation;
import com.innsmap.InnsMap.location.listener.INNSMapLocationListener;
此处需要注意:LocationClient类必须在主线程中声明,需要Context类型的参数。
public INNSMapLocationClient mINNSMapLocationClient;
public INNSMapLocationListener mINNSMapLocationListener;
public void onCreate(){
mINNSMapLocationClient = new INNSMapLocationClient();
mINNSMapLocationListener = new MyINNSMapLocationListener();
mINNSMapLocationClient.setINNSMapLocationListener(mINNSMapLocationListener);
}
INNSMapLocationClient类是定位核心类,具体方法详解参考类。
INNSMapLocationListener为结果监听接口,异步获取定位结果,实现如下:
public class MyINNSMapLocationListener implements INNSMapLocationListener{
@Override
public void onReceiveLocation(INNSMapLocation mInnsLocation) {
//mInnsLocation 定位成功返回定位结果实体类
//mInnsLocation. getBuildingId(); 获取楼宇id
//mInnsLocation.getFloorId(); 获取楼层id
//mInnsLocation.getX(); 获取x坐标
//mInnsLocation.getY(); 获取y坐标
}
@Override
public void onFail(String errMessage) {
//errMessage 定位失败返回错误信息
}
}
INNSMapLocation类,封装了定位SDK的定位结果,在INNSMapLocationListener的onReceiveLocation方法中获取。通过该类用位置对应的楼宇id、楼层id、坐标信息。具体方法请参考参考类。
开启:
mINNSMapLocationClient.start();
start:启动定位SDK。
stop:关闭定位SDK。调用start之后只需要等待定位结果自动回调即可。
(1)、sdk初始化成功后使用相关定位API
(2)、支持4.3及以上版本
(3)、使用定位必须打开蓝牙和wifi,SDK中未提供打开wifi和蓝牙的方法,开发者需自己处理
(4)、Android 6.0中引入了动态权限获取机制(Runtime Permission),sdk初始化会读取手机IMEI,失败会导致sdk初始化失败,在未获取到定位权限情况,无法进行有效定位。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT < 23) {
// Android 6.0 之前无需运行时权限申请
} else {
// 先检测权限 目前SDK只需2个危险权限
int p1 = TestActivity.this.checkSelfPermission(Manifest.permission.READ_PHONE_STATE);
int p2 = TestActivity.this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);
// 只要有任一权限没通过,则申请
if (p1 != PackageManager.PERMISSION_GRANTED || p2 != PackageManager.PERMISSION_GRANTED ) {
this.requestPermissions(PERMISSIONS, //SDK所需权限数组
PERMISSION_RESULT_CODE); //SDK权限申请处理结果返回码
} else {
// 已经拥有权限了
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
// 申请权限被拒绝,则退出程序。
if (grantResults[0] != PackageManager.PERMISSION_GRANTED ||
grantResults[1] != PackageManager.PERMISSION_GRANTED) {
this.finish();
} else if (requestCode == PERMISSION_RESULT_CODE) {
// SDK所需权限被允许
}
}