Android使用高德和风天气Sdk获取定位实况天气数据(二) 您所在的位置:网站首页 获取定位数据 Android使用高德和风天气Sdk获取定位实况天气数据(二)

Android使用高德和风天气Sdk获取定位实况天气数据(二)

2024-02-15 08:31| 来源: 网络整理| 查看: 265

Android使用高德和风天气Sdk获取定位实况天气数据(二) 先看一下效果关于实现第一步,引用高德api与和风天气第二步,修改AndroidManifest.xml第三步,修改activity_main.xml第四步,修改MainActivity.java

先看一下效果

在这里插入图片描述

关于

首先我们需要需要申请高德开发者,获取key,这个我在Android使用高德地图api实现基础定位(来实现获取到定位位置的经纬度)有具体的介绍使用,我们还需要一个和风天气的天气Androidsdk用于获取天气以及和风天气webapi来根据经纬度获取城市的详细信息来获取到城市码,毕竟和风天气根据城市码来获取相应的天气。 这里我晒一下和风天气的应用: 在这里插入图片描述 这两个是必须的哦。 关于和风天气图片的加载用的是glide加载框架。

实现 第一步,引用高德api与和风天气

关于和风天气sdk的下载可以到和风天气开发者里下载,应该是v3.1版本的,或者参考我的Android和风天气sdk 关于ButterKnife如果想使用的话引用参考Android使用ButterKnife与和风天气sdk或者是在oncreate中获取实例。 在项目的build.gradle中添加如下:

//使用okhttp请求网络 implementation 'com.squareup.okhttp3:okhttp:3.9.0' implementation 'com.google.code.gson:gson:2.6.2' //使用glide加载天气图片 implementation 'com.github.bumptech.glide:glide:4.2.0' //高德定位及3D地图 implementation 'com.amap.api:3dmap:latest.integration' implementation 'com.amap.api:location:latest.integration' 第二步,修改AndroidManifest.xml

在application内部添加如下:

//开发者申请的key 第三步,修改activity_main.xml 第四步,修改MainActivity.java package com.example.weathertest; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.provider.Settings; import android.util.Log; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationClient; import com.amap.api.location.AMapLocationClientOption; import com.amap.api.location.AMapLocationListener; import com.bumptech.glide.Glide; import com.google.gson.Gson; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.List; import butterknife.BindView; import butterknife.BindViews; import butterknife.ButterKnife; import interfaces.heweather.com.interfacesmodule.bean.Lang; import interfaces.heweather.com.interfacesmodule.bean.Unit; import interfaces.heweather.com.interfacesmodule.bean.air.now.AirNow; import interfaces.heweather.com.interfacesmodule.bean.weather.now.Now; import interfaces.heweather.com.interfacesmodule.view.HeConfig; import interfaces.heweather.com.interfacesmodule.view.HeWeather; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends BaseActivity { String TAG="MainActivity"; @BindViews({R.id.tv_tianqi,R.id.tv_kongqi,R.id.tv_airqlty}) ListtextViewList; @BindView(R.id.img_weather) ImageView imageView; public AMapLocationClient mLocationClient=null; //声明定位回调监听器 public AMapLocationClientOption mLocationOption=null; Location_Bean location_bean; private String CityId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMap(); HeConfig.init("HE1909121339201612","083fbdf0edca4082813382b9551043e9"); HeConfig.switchToFreeServerNode(); ButterKnife.bind(this); } private void initMap() { //初始化定位 mLocationClient=new AMapLocationClient(MainActivity.this); //设置定位回调监听 mLocationClient.setLocationListener(mLocationListener); mLocationOption = new AMapLocationClientOption(); //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); mLocationOption.setNeedAddress(true);//设置是否返回地址信息(默认返回地址信息) mLocationOption.setOnceLocation(false);//设置是否只定位一次,默认为false mLocationOption.setWifiActiveScan(true);//设置是否强制刷新WIFI,默认为强制刷新 mLocationOption.setMockEnable(false);//设置是否允许模拟位置,默认为false,不允许模拟位置 mLocationOption.setInterval(15000);//设置定位间隔,单位毫秒,默认为2000ms mLocationOption.setOnceLocation(false);//可选,是否设置单次定位默认为false即持续定位 mLocationOption.setOnceLocationLatest(false); //可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用 mLocationOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差 mLocationOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true //给定位客户端对象设置定位参数 mLocationClient.setLocationOption(mLocationOption); //启动定位 mLocationClient.startLocation(); } public AMapLocationListener mLocationListener=new AMapLocationListener() { @Override public void onLocationChanged(AMapLocation aMapLocation) { if (aMapLocation != null) { if (aMapLocation.getErrorCode() == 0) { //定位成功回调信息,设置相关消息 aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表 // aMapLocation.getLatitude();//获取纬度 // aMapLocation.getLongitude();//获取经度 aMapLocation.getAccuracy();//获取精度信息 java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。 // aMapLocation.getCountry();//国家信息 // aMapLocation.getProvince();//省信息 // aMapLocation.getCity();//城市信息 // aMapLocation.getDistrict();//城区信息 // aMapLocation.getStreet();//街道信息 // aMapLocation.getStreetNum();//街道门牌号信息 // aMapLocation.getCityCode();//城市编码 // aMapLocation.getAdCode();//地区编码 //获取经纬度 double LongitudeId = aMapLocation.getLongitude(); double LatitudeId = aMapLocation.getLatitude(); //获取定位城市定位的ID requestCityInfo(LongitudeId,LatitudeId); Toast.makeText(MainActivity.this,"所在城市:"+aMapLocation.getProvince()+aMapLocation.getCity(),Toast.LENGTH_SHORT).show(); mLocationClient.stopLocation();//停止定位 } else { //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 Log.e("info", "location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo()); } } } }; public void requestCityInfo(double longitude,double latitude){ //这里的key是webapi key String cityUrl = "https://search.heweather.net/find?location="+longitude+","+latitude+"&key=4fe5a769d1cd45509d0e8146bd032e65"; sendRequestWithOkHttp(cityUrl); } //解析根据经纬度获取到的含有城市id的json数据,这里我使用原始的jsonObject与jsonArray来解析,网上也有使用jsonformat插件来,你们也可以那样做 private void sendRequestWithOkHttp(String cityUrl) { new Thread(new Runnable() { @Override public void run() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().url(cityUrl).build(); try { Response response = okHttpClient.newCall(request).execute(); //返回城市列表json数据 String responseData = response.body().string(); System.out.println("变成json数据的格式:"+responseData); JSONObject jsonWeather = null; try { jsonWeather = new JSONObject(responseData); JSONArray jsonArray = jsonWeather.getJSONArray("HeWeather6"); JSONObject jsonObject = jsonArray.getJSONObject(0); String jsonStatus = jsonObject.getString("status"); System.out.println("解析以后的内容:"+jsonStatus); if (jsonStatus.equals("ok")){ JSONArray jsonBasic = jsonObject.getJSONArray("basic"); JSONObject jsonCityId = jsonBasic.getJSONObject(0); CityId = jsonCityId.getString("cid"); getWether(); } } catch (JSONException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void getWether() { /** * 实况天气 * 实况天气即为当前时间点的天气状况以及温湿风压等气象指数,具体包含的数据:体感温度、 * 实测温度、天气状况、风力、风速、风向、相对湿度、大气压强、降水量、能见度等。 * * @param context 上下文 * @param location 地址详解 * @param lang 多语言,默认为简体中文 * @param unit 单位选择,公制(m)或英制(i),默认为公制单位 * @param listener 网络访问回调接口 */ HeWeather.getWeatherNow(MainActivity.this, CityId, Lang.CHINESE_SIMPLIFIED , Unit.METRIC , new HeWeather.OnResultWeatherNowBeanListener() { public static final String TAG="he_feng_now"; @Override public void onError(Throwable e) { Log.i(TAG, "onError: ", e); System.out.println("Weather Now Error:"+new Gson()); } @Override public void onSuccess(Now dataObject) { Log.i(TAG, " Weather Now onSuccess: " + new Gson().toJson(dataObject)); String jsonData = new Gson().toJson(dataObject); System.out.println("返回的数据内容:"+dataObject.getStatus()); String tianqi = null,wendu = null, tianqicode = null; if (dataObject.getStatus().equals("ok")){ String JsonNow = new Gson().toJson(dataObject.getNow()); JSONObject jsonObject = null; try { jsonObject = new JSONObject(JsonNow); tianqi = jsonObject.getString("cond_txt"); wendu = jsonObject.getString("tmp"); tianqicode = jsonObject.getString("cond_code"); } catch (JSONException e) { e.printStackTrace(); } }else { Toast.makeText(MainActivity.this,"有错误",Toast.LENGTH_SHORT).show(); return; } String wendu2 = wendu +"℃"; textViewList.get(0).setText("当前天气:"+tianqi); textViewList.get(1).setText("当前温度:"+wendu2); String tagurl = "https://cdn.heweather.com/cond_icon/" +tianqicode+".png"; Glide.with(MainActivity.this).load(tagurl).into(imageView); } }); HeWeather.getAirNow(MainActivity.this,CityId, Lang.CHINESE_SIMPLIFIED, Unit.METRIC, new HeWeather.OnResultAirNowBeansListener() { public static final String TAG2="he_feng_air"; @Override public void onError(Throwable throwable) { Log.i(TAG2,"ERROR IS:",throwable); } @Override public void onSuccess(AirNow airNow) { Log.i(TAG2,"Air Now onSuccess:"+new Gson().toJson(airNow)); String airStatus = airNow.getStatus(); if (airStatus.equals("ok")){ String jsonData = new Gson().toJson(airNow.getAir_now_city()); String aqi = null,qlty = null; JSONObject objectAir = null; try { objectAir = new JSONObject(jsonData); aqi = objectAir.getString("aqi"); qlty = objectAir.getString("qlty"); textViewList.get(2).setText("天气状况:"+qlty+" "+"空气质量:"+"("+aqi+")"); } catch (JSONException e) { e.printStackTrace(); } }else { Toast.makeText(MainActivity.this,"有错误",Toast.LENGTH_SHORT).show(); return; } } }); } @Override protected void onDestroy() { super.onDestroy(); if (mLocationClient !=null){ mLocationClient.onDestroy(); } } }

好啦,之前说好的总算是做到了,写了这篇。有问题欢迎批评指正,一起讨论!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有