和风SDK查询城市ID(保姆级教程)
android studio版本:2021.2.1
例程名:hfserachcityid
这几天没什么事做,而且我原来那个“项目”因为免费api不能用了,只能改为和风的免费api,但需要申请,而且还要城市ID,玩天气的基本都知道城市ID这个东西,之前我找到一个在网页上查询城市 ID的网址,但现在也用不了了,我记得好像还哪里可以查,但不记得了。既然和风也可以查,就再做个app不就行了,其实也可以把代码 放到我那个“项目”里,这事以后再说。而且还可以顺便学点东西,我肯定会遇到问题的,解决的过程就是学习的过程。可没想到这个东西还真给我找了不少麻烦,也算学到了东西。我之前做过一个“andriod 和风天气SDK获取实时天气(保姆级教程)”,我原本想这不是一样吗?代码都不用大的改动,其实不一样,而且我现在怀疑那个教程的代码还能不能用,我真想不通,代码干嘛改动那么大?这样以前做的东西不都用不了?算了,生气也没用。先说说两个为难我的地方。
这个东西获取的城市数据是List<LocationBean>这种格式(相关数据格式见:https://dev.qweather.com/docs/android-sdk/geoapi/android-city-lookup/),我以为是list,于是按照list<bean>的获取值方法好一顿折腾,就是不成功,原来获取天气的时候就很简单,而且当时还提供例程代码,现在好了,例程代码也没有了,只能一遍遍试, 因为我真不会啊。而且原来获取天气的代码搬过来没好使。折腾我好几天。
在获取天气的时候,直接可以在代码里面修改ui界面,在这里不行,settext出现致命错误:Only the original thread that created a view hierarchy can touch its views.一查才知道不可以在非ui线程更新ui线程(其实我哪里知道,后来才知道是这么回事。)于是又查解决办法,书到用时方恨少啊。
好了,剩下的就是如何完整的做这个app了。
重要:申请key之前先建立项目,项目的package name要用,不建立没有这个名称。
一、申请免费和风key.
网址:https://id.qweather.com/#/register?redirect=https%3A%2F%2Fconsole.qweather.com
注册略。
登录后进入“和风天气开发者控制台”
点击左侧"项目管理":
进入后点击右侧"添加key"进入下图(上图只是演示,和风只能申请3个免费KEY):选择“android SDK”,key的名称随便写,package name "必须"与你的appg 一致,否则无法获取数据。(下面有提示如何获取package name,一般类似com.example.nothing这样。)
点击创建后如下图,就得到了key 和public id.这两个在代码里和风初始化的时候都要用到。
至此和风免费key申请完成,此key每天有1000次免费访问,足够了。
二、新建项目。(android studio2021.2.1)
file-new-newproject后如下图:选择empty activity.
next后:
项目名称自选,我写的nothing是为了配合刚才那个和风key.最下面的minimumsdk是指最小兼容版本,看个人需要,这个以后也可以改。点finish完成。
三、项目配置:
城市搜索开发文档:https://dev.qweather.com/docs/android-sdk/geoapi/android-city-lookup/
sdk下载:https://dev.qweather.com/docs/configuration/android-sdk-config/
把下载的sdk文件放到下图的文件夹内:libs必须在project模式下才能看到,可以在系统“文件管理器”打开如下路径:AndroidStudioProjects\nothing\app\libs
在android studio内打开文件夹在sdk文件上右键,点击最下面add as library完成sdk导入。
添加权限。打开:androidmanafest.xml文件
添加如下权限:
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
权限意义:
权限添加androidmanafest.xml位置如图示:
引用库。打开如下图build gradle文件,添加如下库:
compile 'com.squareup.okhttp3:okhttp:3.12.12' (3.12.12+)compile 'com.google.code.gson:gson:2.6.2' (2.6.2+)
至此项目配置完成。
四、项目代码。主要部分都有注释。注意本代码不是nothing的代码,注意包名。
activity_main.xml(布局根据个人喜好,下面是我使用的相对布局)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"tools:context=".MainActivity"><TextViewandroid:id="@+id/title1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="76dp"android:text="城市ID查询程序"android:textColor="@android:color/holo_red_light"android:textSize="20sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.498"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/inputcity"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="140dp"android:text="请输入查询地区/城市:"android:textColor="@color/black"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.167"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/cityname"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="96dp"android:text="地区/城市名:"android:textColor="@color/black"app:layout_constraintStart_toStartOf="@+id/inputcity"app:layout_constraintTop_toBottomOf="@+id/inputcity" /><TextViewandroid:id="@+id/cityid"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="地区/城市ID:"android:textColor="@color/black"app:layout_constraintStart_toStartOf="@+id/cityname"app:layout_constraintTop_toBottomOf="@+id/cityname" /><TextViewandroid:id="@+id/belonearea"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="所属行政区域:"android:textColor="@color/black"app:layout_constraintStart_toStartOf="@+id/cityid"app:layout_constraintTop_toBottomOf="@+id/cityid" /><TextViewandroid:id="@+id/textView11"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="上级城市:"android:textColor="@color/black"app:layout_constraintStart_toStartOf="@+id/belonearea"app:layout_constraintTop_toBottomOf="@+id/belonearea" /><EditTextandroid:id="@+id/input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="19dp"android:ems="8"android:inputType="textPersonName"android:minHeight="48dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toEndOf="@+id/inputcity"app:layout_constraintTop_toBottomOf="@+id/title1"tools:ignore="SpeakableTextPresentCheck" /><TextViewandroid:id="@+id/cityname1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="123"app:layout_constraintStart_toEndOf="@+id/cityname"app:layout_constraintTop_toTopOf="@+id/cityname" /><TextViewandroid:id="@+id/cityid1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="28dp"android:text="456"app:layout_constraintBottom_toBottomOf="@+id/cityid"app:layout_constraintStart_toEndOf="@+id/cityname"app:layout_constraintTop_toTopOf="@+id/cityname1" /><TextViewandroid:id="@+id/area1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="456"app:layout_constraintBottom_toBottomOf="@+id/belonearea"app:layout_constraintStart_toEndOf="@+id/belonearea" /><TextViewandroid:id="@+id/area"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="456"app:layout_constraintBottom_toBottomOf="@+id/textView11"app:layout_constraintStart_toEndOf="@+id/belonearea" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确定"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.486"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/input"app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
mainactivity.java
package com.example.hfserachcityid;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.google.gson.Gson;
import com.qweather.sdk.bean.base.Code;
import com.qweather.sdk.bean.geo.GeoBean;
import com.qweather.sdk.view.HeConfig;
import com.qweather.sdk.view.QWeather;public class MainActivity extends AppCompatActivity {public TextView viewname,viewid,viewarea,viewarea1;private EditText inputcity;private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewname=(TextView)findViewById(R.id.cityname1);viewid=(TextView)findViewById(R.id.cityid1);viewarea=(TextView)findViewById(R.id.area);viewarea1=(TextView)findViewById(R.id.area1);inputcity=(EditText)findViewById(R.id.input);button=(Button)findViewById(R.id.button);//和风初始化HeConfig.init("HE2303010152481612", "3cbc9266e3b24f38afbf182611fc3de4");HeConfig.switchToDevService();//按钮监听button.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {//此处注意,gettext的值如果为空,不可以用inputcity.gettext().tostring()=="",此值永远非空。//只能用equals,如果有值可以用==方式。String string="";//如果为空值无动作,非空开始查询。if(string.equals(inputcity.getText().toString())){}else{getCity();}}});}//获取数据及解析关键代码public void getCity(){//获取输入框内容String inputct =inputcity.getText().toString();//此方法为和风提供QWeather.getGeoCityLookup(MainActivity.this, inputct, new QWeather.OnResultGeoListener(){public static final String TAG="he_feng_city";//如果提供数据有问题显示 @Overridepublic void onError(Throwable e) {Log.i(TAG, "onError: ", e);System.out.println("Weather Now Error:"+new Gson());}//如果返回结果正确则执行@Overridepublic void onSuccess(GeoBean geoBean) {if (Code.OK == geoBean.getCode()) {//getLocationBeanString id=geoBean.getLocationBean().get(0).getId();String name=geoBean.getLocationBean().get(0).getName();String adm2=geoBean.getLocationBean().get(0).getAdm2();String adm1=geoBean.getLocationBean().get(0).getAdm1();//因不可以在非ui线程修改ui线程内容,所以必须使用runOnUiThread或类似方法。//直接使用viewname.setText(name);会导致错误,程序退出。runOnUiThread(new Runnable() {@Overridepublic void run() {viewname.setText(name);viewid.setText(id);viewarea1.setText(adm1);viewarea.setText(adm2);}});}else{//在此查看返回数据失败的原因Code code = geoBean.getCode();System.out.println("失败代码: " + code);//Log.i(TAG, "failed code: " + code);}}});}
}
动图演示:
相关文章:
和风SDK查询城市ID(保姆级教程)
android studio版本:2021.2.1例程名:hfserachcityid这几天没什么事做,而且我原来那个“项目”因为免费api不能用了,只能改为和风的免费api,但需要申请,而且还要城市ID,玩天气的基本都知道城市ID这个东西&am…...
暴力递归到动态规划
暴力递归到动态规划 假设有排成一行的n个位置, 记为1~n,n-定大于或等于2。开始时机器人在其中的m位置上(m 一定是1~n中的一个)。如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到n位置, 那么下一步只能…...
Java:Java仍然处于领先地位?
没有多少编程语言能够自吹自擂并持续流行20多年,但Java就是其中之一。Java应用程序不仅局限于web和移动开发,而且给大数据和人工智能留下了深刻的印象。不用多说,让我们讨论一下Java流行的几个原因!!1.实用性根据JamesGosling的说法ÿ…...
虚拟地址空间
本节目录1.如何理解区域划分2.为什么一个变量可以存储两个不同的值?3.深入理解虚拟地址空间为什么要有地址空间?4.理解什么是挂起?1.虚拟地址空间究竟是什么?2.映射关系的维护是谁做的?1.如何理解区域划分 所谓的区域…...
Python基础篇(十五)-- Pygame游戏编程
1 初识Pygame Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像、声音、视频、事件、碰撞等的支持。Pygame建立在SDL的基础上,SDL是一套跨平台的多媒体开发库,用C语言实…...
LeetCode 热题 HOT 100 Java 题解 -- Part 2
练习地址 Part 1 : https://blog.csdn.net/qq_41080854/article/details/128829494 LeetCode 热题 HOT 100 Java 题解 -- Part 236. 二叉树的中序遍历 9437. 不同的二叉搜索树 9638. 验证二叉搜索树 9839. 对称二叉树 10140. 二叉树的层序遍历 10241. 二叉树的最大深度 10442.…...
【项目实战】IDEA常用快捷键汇总
一、修改为Eclipse的快捷键 相信很多朋友跟我一样, 都是习惯了eclipse的快捷键,没错,习惯这东西真的很难改!IDEA非常强大,支持我们修改IDEA中的keymap为Eclipse的快捷键!友好又贴心,有没有&…...
更新 TKK 失败,请检查网络连接。谷歌翻译 translation插件不能用解决办法 亲测有效
谷歌翻译无法使用,谷歌回应解释是,谷歌翻译使用率过低,所以选择停止服务。网上也有说法,指出根本原因为,提供API接口的googleapis被墙,这导致js文件和字体资源无法加载。 这里提供两种解决办法 方案一 修…...
SpringBoot整合MybatisPlus多数据源
相信在很多使用MybatisPlus框架的小伙伴都会遇到多数据源的配置问题,并且官网也给出了推荐使用多数据源 (dynamic-datasource-spring-boot-starter) 组件来实现。由于最近项目也在使用这个组件来实现多数据源切换,因此想了解一下该组件是如何运行的&…...
【教程】如何使用Java生成PDF文档?
在如今数字化时代,越来越多的人使用PDF文档进行信息传递和共享。而使用Java生成PDF文档也成为了一个非常重要的技能,因为Java作为一种通用的编程语言,可以在不同的操作系统和平台上运行。下面,我们将为您介绍如何使用Java生成PDF文…...
I.MX6ULL内核开发13:pinctrl子系统和gpio子系统-led实验
目录 一、pinctrl子系统 1.1 pinctrl子系统编写格式以及引脚属性介绍 1.1.1 iomux节点介绍 1.1.2 pinctrl子节点编写格式 1.1.3 引脚配置信息介绍 1.2 将RGB灯引脚添加到pinctrl子系统 1.2.1 查找RGB灯使用的引脚 1.2.2找到引脚宏定义 1.2.3 设置引脚属性 1.2.4 在…...
Linux系列 使用vi文本编辑器
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.vi文本编辑器 1.使用vi文本编辑器 2.vi编辑器的工作模式 3.命令模式中的…...
【java基础】接口(interface)
文章目录基础介绍接口的定义关于接口字段和方法的说明使用接口抽象类和接口接口方法冲突的一些说明方法相同名称和参数,返回值相同方法名称相同,参数不同,返回值相同方法返回值不同,名称参数相同方法完全相同,一个有默…...
ChatGPT(GPT3.5) OpenAI官方API正式发布
OpenAI社区今天凌晨4点多发送的邮件,介绍了ChatGPT官方API的发布。官方介绍文档地址为“OpenAI API”和“OpenAI API”。 ChatGPT(GPT3.5)官方API模型名称为“gpt-3.5-turbo”和“gpt-3.5-turbo-0301”。API调用价格比GPT text-davinci-003模型便宜10倍。调用费用为…...
CAD中如何将图形对象转换为三维实体?
有些小伙伴在CAD绘制完图纸后,想要将图纸中的某些图形对象转换成三维实体,但却不知道该如何操作,其实很简单,本节CAD绘图教程就和小编一起来了解一下浩辰CAD软件中将符合条件的对象转换为三维实体的相关操作步骤吧! 将…...
【K8S笔记】Kubernetes 集群架构与组件介绍
K8S 官方文档 https://kubernetes.io/zh/docs/home ##注重关注 概念和任务 板块。 K8S 集群架构 K8S也是运用了分布式集群架构: 管理节点/Master 整个集群的管理,任务协作。工作节点/Node 容器运行、删除。 K8S 组件介绍 管理节点/Master 相关组件 …...
9 怎么登录VNC
1)首先在ssh登录后启动vncserver。登陆后输入下面的指令来创建自己的VNC。 命令vncserver :16 –geometry 1900x1000 其中:16是分配的端口号,1900x1000是分辨率。如果没有响应,建议执行下面操作后再次重复上面操作。 命令…...
MPI ubuntu安装,mpicc,mpicxx,mpif90的区别
介绍 MPI是并行计算的一个支持库,支持对C、C、fortran语言进行并行计算。 安装基础环境 ubuntu进行gcc/g/gfortran的安装: gcc: ubuntu下自带gcc编译器。可以通过gcc -v命令来查看是否安装。 g: sudo apt-get install buil…...
移动端笔记
目录 一、移动端基础 二、视口 三、二倍图/多倍图 四、移动端开发 (一)开发选择 (二)常见布局 (三)移动端技术解决方案 五、移动WEB开发之flex布局 六、移动WEB开发之rem适配布局 #END(…...
操作系统笔记、面试八股(一)—— 进程、线程、协程
文章目录1. 进程、线程、协程1.1 进程1.1.1 进程间的通信方式1.1.2 进程同步方式1.1.3 进程的调度算法1.1.4 优先级反转1.1.5 进程状态1.1.6 PCB进程控制块1.1.7 进程的创建和撤销过程1.1.8 为什么要有进程1.2 线程1.2.1 为什么要有线程1.2.2 线程间的同步方式1.3 协程1.3.1 什…...
Python每日一练(20230302)
目录 1. 字符串统计 2. 合并两个有序链表 3. 下一个排列 附录 Python字典内置方法 增 删 改 查 其它 1. 字符串统计 从键盘输入一个包含有英文字母、数字、空格和其它字符的字符串,并分别实现下面的功能:统计字符串中出现2次的英文字母&#…...
Numpy课后练习
Numpy课后练习 文章目录 Numpy课后练习一、前言二、题目及答案一、前言 答案仅供参考,谢谢大家! 二、题目及答案 导入Numpy包并设置随机数种子为666 import numpy as np np.random.seed(666)创建并输出一个包含12个元素的随机整数数组r1,元素的取值范围在[30,100)之间 r1 …...
动态规划dp中的子序列、子数组问题总结
目录 定义dp数组 初始化dp数组 状态转移方程 最终结果 题目 定义dp数组 这类问题的共性是会提供两个数组,寻找他们共同的子序列、子数组。设第一个数组为s,第二个数组为t。则可以设二维dp数组,其大小为len(s + 1)*len(t + 1) dp[i][j]表示 s 前 i 个长度,...
Zookeeper3.5.7版本——Zookeeper的概述、工作机制、特点、数据结构及应用场景
目录一、Zookeeper的概述二、Zookeeper的工作机制三、Zookeeper的特点四、Zookeeper的数据结构五、Zookeeper的应用场景5.1、统一命名服务5.2、统一配置管理5.3、统一集群管理5.4、服务器动态上下线5.5、软负载均衡一、Zookeeper的概述 Zookeeper 是一个开源的分布式的&#x…...
安卓逆向学习及APK抓包(二)--Google Pixel一代手机的ROOT刷入面具
注意:本文仅作参考勿跟操作,root需谨慎,本次测试用的N手Pixel,因参考本文将真机刷成板砖造成的损失与本人无关 1 Google Pixel介绍 1.1手机 google Pixel 在手机选择上,优先选择谷歌系列手机,Nexus和Pixel系列&…...
线程池的基本认识与使用
线程池的基本认识与使用线程池线程池工作原理:优点:传统的创建线程方式线程池创建线程使用线程池 池化思想:线程池、字符串常量池、数据库连接池可以提高资源的利用率 线程池工作原理: 预先创建多个线程对象 放入线程池种&#…...
小家电品牌私域增长解决方案来了
小家电品牌的私域优势 01、行业线上化发展程度高 相对于大家电动辄上千上万元的价格,小家电的客单价较低。而且与大家电偏刚需属性不同的是,小家电的消费需求侧重场景化,用户希望通过购买小家电来提高自身的生活品质。这就决定了用户的决策…...
什么是让ChatGPT爆火的大语言模型(LLM)
什么是让ChatGPT爆火的大语言模型(LLM) 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录什么是让ChatGPT爆火的大语言模型(LLM)大型语言模型有什么用?大型语言模型如何工作?大型语言模型的热门应用在哪里可以找到大型语言…...
【监控】Linux部署postgres_exporter及PG配置(非Docker)
目录一、下载及部署二、postgres_exporter配置1. 停止脚本stop.sh2. 启动脚本start.sh3. queries.yaml三、PostgreSQL数据库配置1. 修改postgresql.conf配置文件2. 创建用户、表、扩展等四、参考一、下载及部署 下载地址 选一个amd64下载 上传至服务器,解压 tax…...
基于Java+SpringBoot+Vue+Uniapp(有教程)前后端分离健身预约系统设计与实现
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…...
苏州淘宝网站建设培训/初学者做电商怎么入手
服务器py文件怎么连接数据库 内容精选换一换本章节适用于MRS 3.x之前版本。Loader支持以下多种连接,每种连接的配置介绍可根据本章节内容了解。obs-connectorgeneric-jdbc-connectorftp-connector或sftp-connectorhbase-connector、hdfs-connector或hive-connectorO…...
什么叫seo网站推广/初学者做电商怎么入手
信息系统集成有以下几个显著特点。(1)信息系统集成要以满足用户需求为根本出发点。(2)信息系统集成不只是设备选择和供应,更重要的,它是具有高技术含量的工程过程,要面向用户需求提供全面解决方案,其核心是软件。(3)系统集成的最终…...
wordpress模板dux/google推广公司哪家好
第三章 进程描述和控制 一、什么是进程: 开发操作系统是为了给应用程序提供一个方便、安全和一致的接口。 操作系统是计算机硬件和应用程序之间的一层软件,对应用程序和工具提供支持。 目标: 资源对多个应用程序是可用的; 物理处…...
做网站的小图标/百度竞价点击软件
》》下拉组件 1.组件结构: 2.index.js: 1 //index.js2 Component({3 /**4 * 组件的属性列表5 */6 properties: {7 propArray: {8 type: Array,9 } 10 }, 11 /** 12 * 组件的初始数据 13 */ 14 data: { 15 selec…...
一级a做爰片免费网站丶/广告营销顾问
夜光序言: 既然选择了远方,便只顾风雨兼程,哪管山高路远。 正文:...
苹果网站用什么做的/中国十大电商培训机构
解决报告 http://blog.csdn.net/juncoder/article/details/38136193 题目传送门 题意: n头m个机器,求最大匹配。 ps 一分钟前刚做了POJ1469 直接改了输入输出就交了,题意全然一样,,,sad ,代码传…...