Android 高德地图黑屏定位,Android Fragment集成高德地图黑屏的问题解决方案
官方给的3.0Map的集成api说了:
MapView 是 Android View 类的一个子类,它可以帮助您在 Android View 中放置地图,它是应用程序和窗口部件的基本构建类。MapView 作为地图的容器,通过 AMap 对象显示地图。使用 MapView 类,必须重载 Activity 生命周期的所有方法,有 onCreate(),onDestroy(),onResume(),onPause(),onSaveInstanceState()。
另外,如果是在Fragment中集成MapView的话,首先需要将你自己写的Fragment继承SupportMapFragment类,然后同样需要重载所有的生命周期方法。区别在于:
Fragment的onCreate 方法再onCreateView方法之前调用,而Fragment的视图是在onCreateView中初始化的,所以这里需要将MapView的onCreatef(Bundle)方法移到onCreateView方法中进行初始化。
但是,我前期做的时候犯了一个错误,MapView的其他生命周期方法调用位置为都没改,结果app首次进入的时候,高德地图是正常加载的,但是退出后重新进入,app会一直处于黑屏的位置。
后来发现是因为MapView.onDestroy方法调用不对,应该移到Fragment的onDestroyView中,修改后,问题解决。
只能说对Fragment的了解还不是很充足,官方对Fragment中的调用区别也没有明确说明出来,浪费了一天时间。
最后附上源码:
public class MapFragment extends SupportMapFragment implements
AMapLocationListener, LocationSource {
private String TAG = this.getClass().getSimpleName();
private int fragmentId;
private MapView mMapView;
private AMap mAmap;
// 声明AMapLocationClient类对象
private AMapLocationClient mLocationClient;
private AMapLocationClientOption mLocationOption;
// 声明定位回调监听器
public AMapLocationListener mLocationListener;
private AMapLocation mMyLocationPoint;
// 我的位置监听器
private OnLocationChangedListener mLocationChangeListener = null;
private View mRoot;
// private
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mRoot = inflater.inflate(R.layout.fragment_friends, container,
false);
mMapView = (MapView) mRoot.findViewById(R.id.amap);
mMapView.onCreate(savedInstanceState);
initMap();
Logs.d(TAG, "onCreateView");
return mRoot;
}
private void initMap() {
if (mAmap == null) {
mAmap = mMapView.getMap();
initMyLocation();
}
}
/**
* 初始化定位服务
*/
private void initLocation() {
mLocationClient = new AMapLocationClient(getActivity());
mLocationClient.setLocationListener(this);
// 初始化定位参数
mLocationOption = new AMapLocationClientOption();
// 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
// 设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
// 设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
// 设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
// 设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
// 给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
// 启动定位
mLocationClient.startLocation();
}
/**
* 初始化我的定位
*/
private void initMyLocation() {
mAmap.setLocationSource(this);
mAmap.getUiSettings().setMyLocationButtonEnabled(true);
mAmap.setMyLocationEnabled(true);
mAmap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);
mAmap.getUiSettings().setLogoPosition(
AMapOptions.LOGO_POSITION_BOTTOM_LEFT);// logo位置
mAmap.getUiSettings().setScaleControlsEnabled(true);// 标尺开关
mAmap.getUiSettings().setCompassEnabled(true);// 指南针开关
Log.d(TAG,
"max = " + mAmap.getMaxZoomLevel() + "min = "
+ mAmap.getMinZoomLevel());
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
mMapView.onPause();
if(mLocationClient!=null){
mLocationClient.stopLocation();//ֹͣ��λ
}
deactivate();
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
mMapView.onResume();
if(mLocationClient!=null){
mLocationClient.startLocation();
}
mAmap.moveCamera(CameraUpdateFactory.zoomTo(14));
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle arg0) {
// TODO Auto-generated method stub
super.onSaveInstanceState(arg0);
mMapView.onSaveInstanceState(arg0);
}
@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
if(mLocationClient!=null){
mLocationClient.onDestroy();
}
mMapView.onDestroy();
}
@Override
public void deactivate() {
Log.d(TAG, "deactivate");
mLocationChangeListener = null;
if (mLocationClient != null) {
mLocationClient.stopLocation();
mLocationClient.onDestroy();
mLocationClient = null;
}
}
@Override
public void activate(OnLocationChangedListener listener) {
Log.d(TAG, "activate");
mLocationChangeListener = listener;
if (mLocationClient == null) {
initLocation();
}
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
Log.d(TAG, "onLocationChanged");
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
// 定位成功回调信息,设置相关消息
amapLocation.getLocationType();// 获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();// 获取经度
amapLocation.getLongitude();// 获取纬度
amapLocation.getAccuracy();// 获取精度信息
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);// 定位时间
amapLocation.getAddress();// 地址,如果option中设置isNeedAddress为false,则没有此结果
amapLocation.getCountry();// 国家信息
amapLocation.getProvince();// 省信息
amapLocation.getCity();// 城市信息
amapLocation.getDistrict();// 城区信息
amapLocation.getRoad();// 街道信息
amapLocation.getCityCode();// 城市编码
amapLocation.getAdCode();// 地区编码
mMyLocationPoint = amapLocation;
mLocationChangeListener.onLocationChanged(mMyLocationPoint);
} else {
// 显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError",
"location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
}
Android 高德地图黑屏定位,Android Fragment集成高德地图黑屏的问题解决方案相关推荐
- 解决高德地图锁屏黑屏定位不更新,高德地图绘制定位轨迹,高德定位判断定位停留点,高德地图将所有坐标绘制在可视区域内
本文章主要介绍 高德定位锁屏黑屏定位不更新的问题. 实现流程是:程序开始阶段正常执行定位,注册监听锁屏监听,唤醒cpu监听,当锁屏 广播每2秒发起一起单次定位唤醒.源码如下: package net. ...
- android 百度地图3.0定位,Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器...
新功能添加: 第一,定位功能:第二,與方向傳感器結合,通過旋轉手機進行道路的方向確認. 1.初次啟動定位 /** * 定位的客戶端 */ privateLocationClient mLocation ...
- 计算机显示适配器禁用了电脑黑屏,Win10电脑禁用集成显卡后黑屏如何解决_Win10系统禁用集成显卡后黑屏解决方案...
许多用户都喜欢使用双显卡,有时候为了获得更好的性能要使用独立显卡,但是每次要切换可能有点麻烦,所以有win10系统用户想要禁用集成显卡,可是不少用户在禁用集成显卡后电脑出现黑屏了,这该怎么办呢,本教程 ...
- 【QA】集成高德地图SDK闪退问题
集成高德地图SDK闪退问题 昨天集成高德地图SDK,地图显示正常,但是点击返回键退出地图的时候,程序闪退,排查发现销毁地图时调用,mapView.onDestroy() 闪退,不调用的话内存溢出,这. ...
- html5 geolocation 百度地图,html5 geolocation配合百度地图api实现定位
1.了解html5 geolocation HTML5 Geolocation(地理定位)用于定位用户的位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的.=> 使用 ...
- cad图形如何导入到奥维地图_【详细教程】奥维地图上查看项目的线路图或平面图...
我们新到一个工地项目,一般都需要知道道路的走向,或者项目的所在位置,这个时候我们一般使用测量仪器将相关点位测量出来以进行查看.但是这种方法耗时较长.效率较低. 那如何提高效率呢? 这里我们就使用到了奥 ...
- android 百度定位开启后fragment 不显示,解决Android百度地图MapView在ViewPager中Fragment切换黑屏问题...
百度地图切换界面出现黑屏原因是地图退出释放内存时渲染出现bug导致.因为是百度地图本身内部bug.所以我们无法从本质上去修复这个bug android:id="@ id/dynamics_m ...
- Android 集成高德地图——当前定位,添加图标,画路线,设置显示中心位置,比例,地图刷新位置监听,判断GPS开启,去打开GPS
/*** 判断定位服务是否开启** @param* @return true 表示开启*/ public static boolean isLocationEnabled(Context contex ...
- android使用高德地图SDK获取定位信息
注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...
最新文章
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
- PHP的mysqli_fetch_all
- Content-Disposition 响应头,设置文件在浏览器打开还是下载
- TensorFlow 2.0深度强化学习指南
- YoLo 实践(1)
- C++基础与深度解析第零章:C++基础笔记
- C11中gets()的函数被删除
- c#目录以及子目录下图片批量缩放,像素不变,图像大小改变
- oracle sha2,Oracle11.2.0.1在AMD CPU 64位硬件,32位操作系统下的BUG 8670579
- MongoDB 在windows shell环境下的基本操作和命令的使用示例(四)
- mysql服务器相互作用的协议_以下哪个不是与mysql服务器相互作用的通讯协议
- oppo包名_常用APP(apk)对应包名总结(持续更新...)
- 安装 Silverlight 5/silverlight4 出错的解决方法
- 教你如何把书本上的字快速弄到电脑上
- 学习笔记之30个常用的maven命令
- 美国专利客体适格性判断标准浅析
- 电商项目5:商品模块
- 学术论文常用网址,自己收藏和分享给大家
- 茂名天源石化等一批项目开工 广东5大炼化基地发展重点确定
热门文章
- 苹果 WWDC 2019 全记录:iPadOS独立、SwiftUI、Project Catalyst
- Nvidia 的Kal-El Tegra将五核合一
- java求亲密数,怎么写更好更快?
- QString自动补全
- php fpm工作原理,phpfpm工作原理是什么?
- NFT Insider #62:The Sandbox宣布与狮门影业达成合作,红杉资本继续扩大Web3领域投资
- 为什么阿里巴巴禁止使用 Executors 创建线程池,而是通过 ThreadPoolExecutor 方式?...
- 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较
- 记录一下,为什么QQ复制整个文件夹后,仍然没有聊天记录
- MOVS,LODS,CMPS,SCAS,STOS