官方给的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集成高德地图黑屏的问题解决方案相关推荐

  1. 解决高德地图锁屏黑屏定位不更新,高德地图绘制定位轨迹,高德定位判断定位停留点,高德地图将所有坐标绘制在可视区域内

    本文章主要介绍 高德定位锁屏黑屏定位不更新的问题. 实现流程是:程序开始阶段正常执行定位,注册监听锁屏监听,唤醒cpu监听,当锁屏 广播每2秒发起一起单次定位唤醒.源码如下: package net. ...

  2. android 百度地图3.0定位,Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向傳感器...

    新功能添加: 第一,定位功能:第二,與方向傳感器結合,通過旋轉手機進行道路的方向確認. 1.初次啟動定位 /** * 定位的客戶端 */ privateLocationClient mLocation ...

  3. 计算机显示适配器禁用了电脑黑屏,Win10电脑禁用集成显卡后黑屏如何解决_Win10系统禁用集成显卡后黑屏解决方案...

    许多用户都喜欢使用双显卡,有时候为了获得更好的性能要使用独立显卡,但是每次要切换可能有点麻烦,所以有win10系统用户想要禁用集成显卡,可是不少用户在禁用集成显卡后电脑出现黑屏了,这该怎么办呢,本教程 ...

  4. 【QA】集成高德地图SDK闪退问题

    集成高德地图SDK闪退问题 昨天集成高德地图SDK,地图显示正常,但是点击返回键退出地图的时候,程序闪退,排查发现销毁地图时调用,mapView.onDestroy() 闪退,不调用的话内存溢出,这. ...

  5. html5 geolocation 百度地图,html5 geolocation配合百度地图api实现定位

    1.了解html5 geolocation HTML5 Geolocation(地理定位)用于定位用户的位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的.=> 使用 ...

  6. cad图形如何导入到奥维地图_【详细教程】奥维地图上查看项目的线路图或平面图...

    我们新到一个工地项目,一般都需要知道道路的走向,或者项目的所在位置,这个时候我们一般使用测量仪器将相关点位测量出来以进行查看.但是这种方法耗时较长.效率较低. 那如何提高效率呢? 这里我们就使用到了奥 ...

  7. android 百度定位开启后fragment 不显示,解决Android百度地图MapView在ViewPager中Fragment切换黑屏问题...

    百度地图切换界面出现黑屏原因是地图退出释放内存时渲染出现bug导致.因为是百度地图本身内部bug.所以我们无法从本质上去修复这个bug android:id="@ id/dynamics_m ...

  8. Android 集成高德地图——当前定位,添加图标,画路线,设置显示中心位置,比例,地图刷新位置监听,判断GPS开启,去打开GPS

    /*** 判断定位服务是否开启** @param* @return true 表示开启*/ public static boolean isLocationEnabled(Context contex ...

  9. android使用高德地图SDK获取定位信息

    注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...

最新文章

  1. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
  2. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
  3. PHP的mysqli_fetch_all
  4. Content-Disposition 响应头,设置文件在浏览器打开还是下载
  5. TensorFlow 2.0深度强化学习指南
  6. YoLo 实践(1)
  7. C++基础与深度解析第零章:C++基础笔记
  8. C11中gets()的函数被删除
  9. c#目录以及子目录下图片批量缩放,像素不变,图像大小改变
  10. oracle sha2,Oracle11.2.0.1在AMD CPU 64位硬件,32位操作系统下的BUG 8670579
  11. MongoDB 在windows shell环境下的基本操作和命令的使用示例(四)
  12. mysql服务器相互作用的协议_以下哪个不是与mysql服务器相互作用的通讯协议
  13. oppo包名_常用APP(apk)对应包名总结(持续更新...)
  14. 安装 Silverlight 5/silverlight4 出错的解决方法
  15. 教你如何把书本上的字快速弄到电脑上
  16. 学习笔记之30个常用的maven命令
  17. 美国专利客体适格性判断标准浅析
  18. 电商项目5:商品模块
  19. 学术论文常用网址,自己收藏和分享给大家
  20. 茂名天源石化等一批项目开工 广东5大炼化基地发展重点确定

热门文章

  1. 苹果 WWDC 2019 全记录:iPadOS独立、SwiftUI、Project Catalyst
  2. Nvidia 的Kal-El Tegra将五核合一
  3. java求亲密数,怎么写更好更快?
  4. QString自动补全
  5. php fpm工作原理,phpfpm工作原理是什么?
  6. NFT Insider #62:The Sandbox宣布与狮门影业达成合作,红杉资本继续扩大Web3领域投资
  7. 为什么阿里巴巴禁止使用 Executors 创建线程池,而是通过 ThreadPoolExecutor 方式?...
  8. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较
  9. 记录一下,为什么QQ复制整个文件夹后,仍然没有聊天记录
  10. MOVS,LODS,CMPS,SCAS,STOS