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

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于进行网络定位 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于访问GPS定位 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于获取运营商信息,用于支持提供运营商信息相关的接口 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 --><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 用于访问网络,网络定位需要上网 --><uses-permission android:name="android.permission.INTERNET" /> <!-- 用于读取手机当前的状态 --><uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 用于写入缓存数据到扩展存储卡 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于申请调用A-GPS模块 --><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 用于申请获取蓝牙信息进行室内定位 --><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

在application内部添加如下:

    <meta-dataandroid:name="com.amap.api.v2.apikey"android:value="keyxxxxxxxxx">//开发者申请的key</meta-data>

第三步,修改activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FFF"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv_tianqi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#000"android:textSize="15sp"/><ImageViewandroid:id="@+id/img_weather"android:layout_width="17dp"android:layout_height="17dp"/><TextViewandroid:id="@+id/tv_kongqi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#000"android:textSize="15sp"/><TextViewandroid:id="@+id/tv_airqlty"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#000"android:textSize="15sp"/>
</LinearLayout>

第四步,修改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})List<TextView>textViewList;@BindView(R.id.img_weather)ImageView imageView;public AMapLocationClient mLocationClient=null;//声明定位回调监听器public AMapLocationClientOption mLocationOption=null;Location_Bean location_bean;private   String CityId;@Overrideprotected 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() {@Overridepublic 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();//获取定位城市定位的IDrequestCityInfo(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 keyString 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() {@Overridepublic 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";@Overridepublic void onError(Throwable e) {Log.i(TAG, "onError: ", e);System.out.println("Weather Now Error:"+new Gson());}@Overridepublic 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";@Overridepublic void onError(Throwable throwable) {Log.i(TAG2,"ERROR IS:",throwable);}@Overridepublic 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;}}});}@Overrideprotected void onDestroy() {super.onDestroy();if (mLocationClient !=null){mLocationClient.onDestroy();}}
}

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

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

  1. Android使用高德地图api实现基础定位

    Android使用高德地图api实现基础定位(一) 关于 会获取SHA1的可自行跳过这一步 第二步引用高德sdk 第三步修改MainActivity.java 关于 这篇主要讲如何使用高德sdk(不是 ...

  2. 【Android笔记】Android 使用高德SDK获取定位

    Android 使用高德SDK获取定位 在Android开发过程中,经常需要获取手机的定位,这里记录一下使用搞的定位的过程.我选择使用高德的SDK,其实也有Web的API,但是API使用IP定位,An ...

  3. 用百度SDK获取地理位置和天气信息

    以下实现通过百度SDK获取地理位置和天气信息,请參考百度开发文档 1. 在相关下载最新的库文件.将so文件的压缩文件解压出来,把相应架构下的so文件放入开发人员自己APP的相应架构下的目录中,建议所有 ...

  4. android使用高德地图SDK获取定位信息

    注册账号.创建应用.获取API KEY等这些就不说了,按照官网来就行,我们来讲讲项目的配置及示例代码. 高德地图获取定位信息配置要比百度地图简单多了,这是我比较喜欢的一点,而且之前用百度地图嵌入一个应 ...

  5. Android 手机app三种方法获取定位地址(自带API,外接SDK,获取外网IP)

    一.手机App定位在我看来有三种方法: 1.通过Android自带的API:LocationManager获取到经纬度,再通过Geocoder反地理位置查询到所在的地址. 2.外接SDK,如高德SDK ...

  6. vue 实现 高德地图 api 掩模、定位、天气

    vue渲染掩模.定位.天气. /* #app.vue中的代码或其他vue文件 #public/index.html需要引入 高德地图jsapi*/ <script type="text ...

  7. android studio高德地图的显示于定位(附带逆地理编码围栏)

    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...

  8. java天气app_MVP+RxJava2+Retrofit2 实况天气app

    前言 我在这些文章中有介绍一些框架的简单使用方法,但是是分开使用的,现在我们把这些框架结合起来,来搭建一个简单的实况天气app,首先我会用MVP模式搭建app的大致框架,然后将RxJava2和Retr ...

  9. 天气通android2.1,实况天气通v2.1.2

    应用介绍 实况天气通app是一款天气服务平台,每天可以及时的获取天气信息,轻松查阅24小时内天气变化,从容应对早做打算,那么有需要的朋友快来下载吧! 软件介绍 实用的工作生活天气助手.天气软件,只需要 ...

最新文章

  1. python从零基础到项目实战怎么样-2018完整Python零基础到项目精通的学习书籍
  2. python画图哆啦a梦-【Python】绘制哆啦A梦
  3. 百一测评mysql数据库答案_MySQL练习题,百炼成神~
  4. TabLayout属性详解
  5. 理解 RIPv1使用广播更新路由与RIPv2使用组播更新路由的区别
  6. python 保存图片代码_最简单的selenium+Python自动右键保存图片
  7. 学生汽车网页设计作品静态HTML网页模板源码 大学生汽车网站制作 简单汽车网页设计成品
  8. Java基础篇(02):特殊的String类,和相关扩展API
  9. android 退出应用,如何停止服务,Android 完全退出当前应用程序的四种方法
  10. 【漫画】程序员永远修不好的Bug——情人节
  11. 想转行做web前端工程师,必学这6大技能
  12. Redis入门完整教程:CacheCloud运维功能
  13. 电脑版美食大战老鼠放置html,美食大战老鼠2
  14. 用741运算放大器搭建RC正弦振荡器:文氏电桥振荡电路
  15. 主成分分析提取好的特征
  16. 多媒体计算机用什么音箱好,小巧又不失音质 桌面2.0电脑音箱推荐榜
  17. android8 fat分区,MTK 6577+Android EMMC分区布局
  18. 饭店合同免费下载|股份合同免费|餐厅股份合作协议书
  19. 对称NAT穿透的一种新方法
  20. 测绘资质-导航电子地图制作

热门文章

  1. 嵌入式linux之buildroot(三)buildroot配置
  2. anaconda中安装的python环境中没有pip3的问题
  3. Mybatis多租户插件
  4. “被毕业”下的深圳IT程序员,有人当场破防流泪,有人985硕士刚工作1年,有人大厂总监年近40......
  5. u盘启动蓝屏 索尼vaio_使用快启动u盘启动制作工具为索尼笔记本安装
  6. qt 静态 mysql_qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
  7. 搞定上传图片的,速度不错
  8. Makefile call函数说明
  9. asp判断是否移动端_asp判断用户端是电脑访
  10. 4 亿用户,7W+ 作业调度难题,Bigo 基于 Apache DolphinScheduler 巧化解