Android百度地图定位空指针问题解决android.os.Message com.baidu.location.g.f$d.obtainMessage(int, java.lang.Obj

本文针对百度地图SDK在特定场景下出现的偶发性空指针异常,提供了详细的解决方案。通过调整mlocationClient的停止时机,优化生命周期管理,并进行必要的非空判断,有效避免了空指针错误。

问题:

在百度地图页面(Activity为singleTask)跳转到别的页面 ,离开地图页面。偶发性空指针,具体日志信息如下:
在这里插入图片描述

解决:

1、原本我在生命周期onStop里调用的mlocationClient.stop();
把它改到在onDestroy调用

2、onDestory里面执行mBaiduMap=null;
其他地方用mBaiduMap进行非空判断

3、简单so文件是否正确(建议)

package com.ahjswy.cn.baiduservice; import android.Manifest; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.telephony.TelephonyManager; import android.util.Log; import android.widget.Toast; import androidx.annotation.Nullable; import com.ahjswy.cn.ErrorNew; import com.ahjswy.cn.app.MyApplication; import com.ahjswy.cn.app.RequestHelper; import com.ahjswy.cn.app.SystemState; import com.ahjswy.cn.service.ServiceUser; import com.ahjswy.cn.ui.BaseActivity; import com.ahjswy.cn.utils.PDH; import com.baidu.location.BDAbstractLocationListener; import com.baidu.location.BDLocation; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.tencent.map.geolocation.TencentLocation; import com.tencent.map.geolocation.TencentLocationListener; import com.tencent.map.geolocation.TencentLocationManager; import com.tencent.map.geolocation.TencentLocationRequest; import java.util.ArrayList; public class CheckPermissionsActivity extends BaseActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(mService==null){ mService = new ServiceUser(); } requestPermission(); initLoc(); } /** * Android6.0之后需要动态申请权限 */ private void requestPermission() { if (Build.VERSION.SDK_INT >= 23) { ArrayList<String> permissionsList = new ArrayList<>(); String[] permissions = { Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.WRITE_SETTINGS, Manifest.permission.READ_SYNC_SETTINGS }; for (String perm : permissions) { if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) { permissionsList.add(perm); // 进入到这里代表没有权限. } } if (!permissionsList.isEmpty()) { String[] strings = new String[permissionsList.size()]; requestPermissions(permissionsList.toArray(strings), 0); } } } /** * 初始化定位 */ private void initLoc() { initLocation(); initNotification(); mClient.enableLocInForeground(1, mNotification); mClient.start(); } private LocationClient mClient; private MyLocationListener myLocationListener; private Notification mNotification; private ServiceUser mService; /** * 初始化定位参数 */ private void initLocation() { // 创建定位客户端 mClient = new LocationClient(getApplicationContext()); myLocationListener = new MyLocationListener(); // 注册定位监听 mClient.registerLocationListener(myLocationListener); LocationClientOption mOption = new LocationClientOption(); int gpsTime= SystemState.getGpsinterval(); if(gpsTime==0){ gpsTime=10; } // 可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的 mOption.setScanSpan(1000*3*gpsTime); // 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll; mOption.setCoorType("bd09ll"); // 可选,默认false,设置是否开启Gps定位 mOption.setOpenGps(true); // 设置定位参数 mOption.setIsNeedAddress(true); //可选,是否需要地址信息,默认为不需要,即参数为false //如果开发者需要获得当前点的地址信息,此处必须为true mOption.setIsNeedLocationDescribe(true); //可选,是否需要位置描述信息,默认为不需要,即参数为false //如果开发者需要获得当前点的位置信息,此处必须为true mClient.setLocOption(mOption); } /** * 初始化前台服务 */ private void initNotification () { //设置后台定位 //android8.0及以上使用NotificationUtils if (Build.VERSION.SDK_INT >= 26) { NotificationUtils notificationUtils = new NotificationUtils(this); Notification.Builder builder = notificationUtils.getAndroidChannelNotification ("适配android 8限制后台定位功能", "正在后台定位"); mNotification = builder.build(); } else { //获取一个Notification构造器 Notification.Builder builder = new Notification.Builder(this); Intent nfIntent = new Intent(this, BaseActivity.class); builder.setContentIntent(PendingIntent. getActivity(this, 0, nfIntent, 0)) // 设置PendingIntent .setContentTitle("适配android 8限制后台定位功能") // 设置下拉列表里的标题 // .setSmallIcon(R.mipmap.ic_launcher) // 设置状态栏内的小图标 .setContentText("正在后台定位") // 设置上下文内容 .setWhen(System.currentTimeMillis()); // 设置该通知发生的时间 mNotification = builder.build(); // 获取构建好的Notification } mNotification.defaults = Notification.DEFAULT_SOUND; //设置为默认的声音 } /** * 定位信息回调 */ int i=1; class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(final BDLocation bdLocation) { TencentLocationManager mLocationManager = TencentLocationManager.getInstance(CheckPermissionsActivity.this); TencentLocationRequest request = TencentLocationRequest.create(); request.setInterval(10000); request.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_ADMIN_AREA); request.setAllowGPS(true); request.setIndoorLocationMode(true); int locMode = TencentLocationRequest.HIGH_ACCURACY_MODE; request.setLocMode(locMode); // 设置GPS优先 request.setGpsFirst(true); // TencentLocationRequest request = TencentLocationRequest.create(); request.setGpsFirst(true); mLocationManager.requestLocationUpdates(request, new TencentLocationListener() { @Override public void onLocationChanged(TencentLocation location, int resultCode, String resultDesc) { if (resultCode == TencentLocation.ERROR_OK) { // 定位成功 double latitude = location.getLatitude(); double longitude = location.getLongitude(); Log.d("TencentLocation", "定位成功 - 纬度: " + latitude + ", 经度: " + longitude); // 处理定位结果 } else { // 定位失败 Log.e("TencentLocationError", "定位失败,错误代码:" + resultCode + ",错误描述:" + resultDesc); } } @Override public void onStatusUpdate(String s, int i, String s1) { // 状态更新的回调,可以根据需要实现 Log.d("TencentLocationStatus", "状态更新:" + s + ",错误代码:" + i + ",描述:" + s1); } }); if (bdLocation == null ) { Toast.makeText(getApplicationContext(), "网络无法连接,定位失败!", Toast.LENGTH_SHORT).show(); return; } StringBuilder currentPosition = new StringBuilder(); currentPosition.append("纬度:").append(bdLocation.getLatitude()).append("\n"); currentPosition.append("经度:").append(bdLocation.getLongitude()).append("\n"); currentPosition.append("位置描述信息:").append(bdLocation.getLocationDescribe()).append("\n"); Log.d("定位数据", "handleMessage: "+currentPosition); Log.d("定位数据1", ""+i++); String addr=bdLocation.getLocationDescribe(); if(addr==null){ addr=" "; } final String addFinal=addr; // if(SystemState.getUser()!=null) { Log.d("定位数据", "onReceiveLocation: 开始"); TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String mcc = telephonyManager.getNetworkOperator().substring(0, 3); // 获取MCC String mnc = telephonyManager.getNetworkOperator().substring(3, 5); // 获取MNC Log.d("定位数据mcc", mcc); Log.d("定位数据mnc", mnc); PDH.show(new PDH.ProgressCallBack() { public void action() { Log.d("定位数据23", "1"); String isOk = mService.usr_UploadUserLocation( bdLocation.getLongitude(), bdLocation.getLatitude(), addFinal+"("+MyApplication.getInstance().getUniqueCode()+")"); // new ErrorNew().Erroradd("定位数据99 : "+bdLocation.getLongitude()+"\n"+bdLocation.getLatitude()+"\n"+addFinal+"\n"+ // "用户id:"+SystemState.getUser().getId()+"\n"+"用户名称:"+SystemState.getUser().getName()+"\n设备型号:"+ MyApplication.getInstance().getUniqueCode()); handler.sendMessage(handler.obtainMessage(0, isOk)); } }); // } } } //上传定位返回值处理 private Handler handler = new Handler() { @SuppressWarnings("unchecked") public void handleMessage(android.os.Message msg) { String localString = msg.obj.toString(); if (RequestHelper.isSuccess(localString)) { Log.d("定位数据", "onReceiveLocation: 上传定位"+localString); return; } else { Log.d("定位数据", "onReceiveLocation: 上传定位失败"+localString); } } }; } 腾讯地图的定位没有输出
08-27
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值