如何在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
相关产品推荐
相关产品推荐

