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

如何在Android Studio 3.1.1中从URL获取JSON数据并在Google Maps添加标记?

嘿,我来帮你一步步搞定这个问题!在Android Studio 3.1.1里从指定URL获取JSON数据,再把坐标标记到Google Maps上,其实分几个核心步骤,我给你详细拆解:

第一步:配置必要的权限与依赖

首先得确保你的项目配置了所需的权限和库:

  • 在AndroidManifest.xml里添加权限:
    <!-- 网络请求权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 地图定位相关权限(可选,用于用户定位) -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- Google Maps服务权限 -->
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-feature android:name="android.hardware.location.gps" android:required="false" />
    
  • 在build.gradle(Module: app)里添加依赖:
    // Google Maps依赖(适配Android Studio 3.1.1的稳定版本)
    implementation 'com.google.android.gms:play-services-maps:15.0.1'
    // 网络请求库(这里用OkHttp,也可以替换成Volley)
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    
第二步:从指定URL获取JSON数据

用OkHttp做异步网络请求,避免阻塞主线程:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("https://opendata.brussels.be/api/records/1.0/search/?dataset=parkings")
        .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 请求失败的处理,比如给用户提示
        runOnUiThread(() -> Toast.makeText(MainActivity.this, "网络请求失败,请检查网络", Toast.LENGTH_SHORT).show());
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String jsonData = response.body().string();
            // 拿到JSON数据后,跳转到解析和添加标记的步骤
            parseJsonAndAddMarkers(jsonData);
        }
    }
});
第三步:解析JSON提取坐标

先理清楚目标URL返回的JSON结构:数据存在records数组里,每个record的fields.geom.coordinates就是经纬度(注意是**[经度, 纬度]**的顺序!)。用JSONObject解析:

private void parseJsonAndAddMarkers(String jsonData) {
    try {
        JSONObject rootObj = new JSONObject(jsonData);
        JSONArray recordsArray = rootObj.getJSONArray("records");

        for (int i = 0; i < recordsArray.length(); i++) {
            JSONObject recordObj = recordsArray.getJSONObject(i);
            JSONObject fieldsObj = recordObj.getJSONObject("fields");
            JSONObject geomObj = fieldsObj.getJSONObject("geom");
            JSONArray coordinates = geomObj.getJSONArray("coordinates");
            
            // 重点:JSON里是[经度, 纬度],Google Maps的LatLng需要传(纬度, 经度)
            double longitude = coordinates.getDouble(0);
            double latitude = coordinates.getDouble(1);
            
            // 必须回到主线程更新地图UI
            runOnUiThread(() -> addMarkerToMap(latitude, longitude));
        }
    } catch (JSONException e) {
        e.printStackTrace();
        runOnUiThread(() -> Toast.makeText(MainActivity.this, "JSON解析出错", Toast.LENGTH_SHORT).show());
    }
}
第四步:在Google Maps上添加标记

首先在布局文件activity_main.xml里添加MapFragment:

<fragment
    android:id="@+id/map_fragment"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后在Activity里初始化地图,并实现添加标记的方法:

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 初始化MapFragment
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map_fragment);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    // 先定位到布鲁塞尔区域,方便查看所有停车场标记
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.8503, 4.3517), 12));
    
    // 这里调用网络请求方法,比如 fetchParkingData();
}

private void addMarkerToMap(double latitude, double longitude) {
    if (mMap != null) {
        LatLng parkingLocation = new LatLng(latitude, longitude);
        mMap.addMarker(new MarkerOptions()
                .position(parkingLocation)
                .title("停车场"));
    }
}
几个容易踩的坑
  • 坐标顺序别搞反:目标JSON返回的是[经度, 纬度],而Google Maps的LatLng构造器需要传(纬度, 经度),搞反了标记会跑到完全错误的位置!
  • 线程切换:网络请求和JSON解析不能在主线程执行,但更新地图UI必须在主线程,所以一定要用runOnUiThread或者Handler切换线程。
  • 动态权限:如果你的APP目标SDK是23+,需要动态申请ACCESS_FINE_LOCATION权限,否则地图可能无法正常加载或定位。
  • 版本适配:Android Studio 3.1.1建议用15.x系列的play-services-maps,太高的版本可能会出现编译兼容性问题。

内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:27:54