You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:01:03