Android中类间传递String失败,如何实现传值并显示地图位置
问题分析与解决方案
看起来你目前卡在两个关键点上:一是没法从SMSReceiver把短信里的经纬度传到MapsActivity,二是拿到数据后不知道怎么更新地图视图。我来一步步帮你解决这些问题:
一、先修复SMSReceiver里启动Activity的错误
BroadcastReceiver是没有Activity上下文的,直接调用startActivity()会抛出异常,必须加上FLAG_ACTIVITY_NEW_TASK标记。另外还要注意启动Intent时要用广播的上下文,而不是SMSRecevir.this。
修正后的SMSReceiver核心代码:
else if (replyPhone.equals(phonenumb)){ Intent my = new Intent(context, MapsActivity.class); // 这里要用context,不是当前Receiver的this my.putExtra("key", request); my.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须添加这个标记才能启动Activity context.startActivity(my); }
二、在MapsActivity里处理经纬度并更新地图
你已经成功接收到了传递过来的字符串mg,但还缺两步:把字符串解析成经纬度数值,然后在地图加载完成后更新视图。
1. 解析经纬度字符串
假设你的短信经纬度格式是"纬度,经度"(比如"36.36548,81.66542"),我们在地图初始化完成的onMapReady()方法里做解析和地图更新:
2. 更新地图显示逻辑
修正后的MapsActivity关键代码:
@Override public void onMapReady(GoogleMap googleMap) { gmap = googleMap; gmap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // 处理传递过来的经纬度 if (!mg.equals("a")) { // 排除默认值,确保是短信传过来的有效数据 String[] latLngArray = mg.split(","); if (latLngArray.length == 2) { try { // 把字符串转成double类型的经纬度 double lati = Double.parseDouble(latLngArray[0]); double longi = Double.parseDouble(latLngArray[1]); // 创建位置对象 LatLng carLocation = new LatLng(lati, longi); // 添加地图标记 gmap.addMarker(new MarkerOptions().position(carLocation).title("车辆位置")); // 移动相机到该位置,15是缩放级别(数值越大越近) gmap.moveCamera(CameraUpdateFactory.newLatLngZoom(carLocation, 15)); } catch (NumberFormatException e) { Log.e("MapsActivity", "经纬度解析失败:" + e.getMessage()); Toast.makeText(this, "短信里的经纬度格式不对", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "经纬度格式错误,请检查短信内容", Toast.LENGTH_SHORT).show(); } } else { // 如果没有收到短信数据,显示默认位置 LatLng defaultLoc = new LatLng(a, b); gmap.addMarker(new MarkerOptions().position(defaultLoc).title("默认位置")); gmap.moveCamera(CameraUpdateFactory.newLatLngZoom(defaultLoc, 15)); } }
三、额外的优化提醒
- 权限要配全:在
AndroidManifest.xml里加上必要权限,不然短信接收和地图功能会失效:<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> - 动态权限申请:Android 6.0及以上版本,需要在代码里动态申请
RECEIVE_SMS、SEND_SMS和ACCESS_FINE_LOCATION权限,不然广播接收器拿不到短信。 - 短信内容校验:可以在
SMSReceiver里先判断短信内容是不是符合经纬度格式,避免把无效数据传到MapsActivity里。
内容的提问来源于stack exchange,提问作者Varuna Lakshan
相关产品推荐
相关产品推荐

