1.android��ͼ����Դ��
2.Android高德地图poi检索仿微信发送位置实例代码
3.百度地图基础功能-显示地图(Android 版)
android��ͼ����Դ��
在使用uniapp进行android开发时,地地图定位功能可以通过两种方式实现:一是图开直接连接手机进行测试,二是发源运行在自定义基座上。 1. 直接连接手机测试:无需特别申请高德地图的地地图key,代码中也不需要引入,图开尽管如此,发源ecshop 建材系统源码定位功能依然可以精确实现。地地图这可能是图开因为uniapp的安卓集成版本自带了高德地图支持,uni.getlocation方法就能获取定位。发源 2. 自定义基座测试则有所不同:必须在高德开放平台获取对应的地地图安卓key,这与小程序的图开key和ios的key是分开申请的。在manifest.json文件中配置是发源必要的,否则可能会出现签名不一致的地地图sfm算法 源码错误。 在定位精度上,图开uni.getlocation、发源plus.geolocation.watchPosition和小程序的amapPlugin.getRegeo方法在连接手机时表现相近,都非常精确。然而,当在自定义基座上测试时,如果未正确配置maps,可能会导致定位出现误差,尤其是在使用小程序key和amaps-wx.js时,定位精度会有米左右的偏差。 最终,定位问题的vuejs源码讲解解决在于确保在manifest.json中正确配置了appid、key以及包名。只有这样,无论是在连接手机还是自定义基座上,定位都能达到预期的精度。Android高德地图poi检索仿微信发送位置实例代码
以了解一下。
最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下:
从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item的数据就是我们定位得到的地址,下面其余的都是我们根据定位得到的经纬度通过poi周边搜索得到的地址。我们进行了如下操作:
我们点击列表的ffmepg c 源码item,中心标记会移动到该item对象的地址上面去。
我们手动移动地图的时候,中心标记的地址会发生相应的变化并且下面的列表也会发生相应的变化。
根据关键字poi搜索得到的列表,然后点击item主界面立马进行更新操作。
这里贴出主要代码,首先我们进行地图地位初始化操作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
mapView.onCreate(savedInstanceState);// 此方法必须重写
if (aMap == null) {
aMap = mapView.getMap();
// 自定义系统定位小蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
// 设置小蓝点的图标
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
fromResource(R.mipmap.ic_location_marker));// 设置小蓝点的图标
myLocationStyle.strokeColor(0x7FD9);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(0xD9);// 设置圆形的填充颜色
// myLocationStyle.anchor(int,int)//设置小蓝点的锚点
myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 设置定位监听(1)
aMap.setOnCameraChangeListener(this);//手动移动地图监听 (2)
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
//设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
aMap.setMyLocationEnabled(true);
aMap.moveCamera(CameraUpdateFactory.zoomTo(.5f));
}
//------------------------------------------添加中心标记
mMarkerOptions = new MarkerOptions();
mMarkerOptions.draggable(false);//可拖放性
mMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_tips_nearby));
mCenterMarker = aMap.addMarker(mMarkerOptions);
ViewTreeObserver vto = mapView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
mCenterMarker.setPositionByPixels(mapView.getWidth() 1, mapView.getHeight() 1);
mCenterMarker.showInfoWindow();
}
});
//---------------------------------------------初始化正反编码类 (3)
mGeocoderSearch = new GeocodeSearch(this);
mGeocoderSearch.setOnGeocodeSearchListener(this);
}
我们注意重点关注在上面的三个监听回调,1处是定位监听,有以下两个回调方法:
//-----------------地图定位回调
//激活定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
if (mlocationClient == null) {
mlocationClient = new AMapLocationClient(this);
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mlocationClient.setLocationListener(this);(4)
//设置为高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,nextdate函数源码
// 注意设置合适的定位时间的间隔(最小间隔支持为ms),并且在合适时间调用stopLocation()
// 方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mlocationClient.startLocation();
}
}
//停止定位
@Override
public void deactivate() {
mListener = null;
if (mlocationClient != null) {
mlocationClient.stopLocation();
mlocationClient.onDestroy();
}
mlocationClient = null;
}
4处的监听定位成功后会回调onLocationChanged这个方法,在这个方法里面我们可以获得定位到的经纬读,地址,显示出上面我们设置的自定义系统定位小蓝点出来等等,
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
//这个方法会循环执行
mLongitude = aMapLocation.getLongitude();//经度
mLatitude = aMapLocation.getLatitude();//纬度
cityCode = aMapLocation.getCityCode();//citycode
}
我们再来分析2处地图位置改变时回调:
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
/**这个方法很重要,虽然在上述的onLocationChanged方法我们也能获得坐标点的信息但是我们
通常在这里获得定位坐标的经纬度,获得了经纬度后我们并不能知道该坐标点的具体坐标信息,所以
需要把对应的坐标点转化为具体地址,这就是所谓的同步逆地理编码请求,和定位是黄金搭档
*/
mCurrentPoint = new LatLonPoint(cameraPosition.target.
latitude, cameraPosition.target.longitude);
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(mCurrentPoint, , GeocodeSearch.AMAP);
mGeocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
}
3处我们做的地理正反编码回调如下:
//----------------逆地址编码回调:坐标-地址
@Override
public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
if (rCode == 0) {
if (result != null result.getRegeocodeAddress() != null
result.getRegeocodeAddress().getFormatAddress() != null) {
/
*** 汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|
* 体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|zf机构及社会团体
* |科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
*/
mPoiQuery = new PoiSearch.Query("", "住宿服务|公司企业",
result.getRegeocodeAddress().getCityCode());
mPoiQuery.setPageSize();// 设置每页最多返回多少条poiitem
mPoiQuery.setPageNum(0);//设置查第一页
PoiSearch poiSearch = new PoiSearch(this, mPoiQuery);
poiSearch.setOnPoiSearchListener(this);//设置数据返回的监听器 (5)
//设置周边搜索的中心点以及区域
poiSearch.setBound(new PoiSearch.SearchBound(mCurrentPoint, , true));
poiSearch.searchPOIAsyn();//开始搜索
} else {
ToastUtil.show(mContext, R.string.no_result);
}
} else {
ToastUtil.show(mContexts, rCode);
}
}
//----------------地址编码回调:地址-坐标
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
}
我们在这儿进行了poi周边搜索操作,回调方法
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == 0) {
if (result != null result.getQuery() != null) { // 搜索poi的结果
if (result.getQuery().equals(query)) { // 是否是同一条
poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
List suggestionCities = poiResult
.getSearchSuggestionCitys();
/
*** listviw具体操作逻辑
*/
}
} else if (suggestionCities != null
suggestionCities.size() 0) {
showSuggestCity(suggestionCities);
}else {
ToastUtil.show(mContexts, "对不起,没有搜索到相关数据!");
}
}
}
@Override
public void onPoiItemSearched(PoiItem poiitem, int rcode) {
}
/
*** poi没有搜索到数据,返回一些推荐城市的信息
*/
private void showSuggestCity(List cities) {
String infomation = "推荐城市\n";
for (int i = 0; i cities.size(); i++) {
infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
+ cities.get(i).getCityCode() + "城市编码:"
+ cities.get(i).getAdCode() + "\n";
}
ToastUtil.show(this, infomation);
}
类似的含关键字的poi搜索也是类似的:
// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
mPoiQuery = new PoiSearch.Query(key, "", cityCode);
mPoiSearch = new PoiSearch(this, mPoiQuery);
mPoiQuery.setPageSize();// 设置每页最多返回多少条poiitem
mPoiQuery.setPageNum(0);//设置查第一页
mPoiSearch.setOnPoiSearchListener(this);
// 设置搜索区域为以lp点为圆心,其周围米范围
LatLonPoint lp=new LatLonPoint(latitude,longitude);
mPoiSearch.setBound(new PoiSearch.SearchBound(lp, , true));
mPoiSearch.searchPOIAsyn();//开始搜索
最后还有一个知识点就是我们点击item的时候地图自动去移动的实现,其实就是aMap.moveCamera方法去实现的,它会自动调用onCameraChangeFinish方法走的流程还是和我们手动拖动地图一样的。
复制代码 代码如下:
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(poiItem.getLatLonPoint().getLatitude(), poiItem.getLatLonPoint().getLongitude()), ));
百度地图基础功能-显示地图(Android 版)
在进行百度地图开发时,首先需要确保拥有AndroidStudio的环境,并预先安装好Jdk。在百度地图开放平台上创建应用,获取SHA1、包名和Ak是使用地图显示功能的必要步骤。登录百度地图控制台,创建应用,应用名称需自行设定,应用服务选择全选(建议),确保应用类型为“Android SDK”,正确填写SHA1和程序包名。获取SHA1和包名可以通过以下方式:在cmd控制台中使用keytool指令,获取发布版本下的SHA1值和包名。在AndroidStudio项目中找到build.gradle文件,检查applicationId是否与AndroidManifest.xml中的package值相同,不同则以applicationId为准。发布应用后,在控制台查看应用,获取对应的密钥AK。
接下来,导入相关资源包。仅需基础地图和计算工具即可实现地图显示,后续如需其他功能,可下载更高版本的资源包,并添加jar文件、.so文件以及应用混淆处理。务必进行应用混淆,避免AndroidStudio默认的地图布局文件被混淆,否则可能会导致应用运行时异常,如网络不可用等。
实现地图显示主要包括以下几个步骤:在外部添加权限声明,如网络访问权限;在布局文件中添加地图容器,即使用GoogleMap或MapView组件;初始化地图,通过重写MainActivity.java,调用百度地图SDK提供的初始化方法;运行实例,确保应用能够成功显示基础地图、实现地图缩放和方位选择等功能。
本次分享重点介绍了百度地图基础功能中的地图显示部分,包括创建应用、获取密钥、导入资源包、实现地图显示的详细步骤。下期将分享定位SDK的使用,期待与大家的交流。