和风SDK查询城市ID(保姆级教程)

这篇具有很好参考价值的文章主要介绍了和风SDK查询城市ID(保姆级教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android studio版本:2021.2.1

例程名:hfserachcityid

这几天没什么事做,而且我原来那个“项目”因为免费api不能用了,只能改为和风的免费api,但需要申请,而且还要城市ID,玩天气的基本都知道城市ID这个东西,之前我找到一个在网页上查询城市 ID的网址,但现在也用不了了(目前和风网页版又可以使用了,地址:位置搜索服务 | 和风天气 2023.3.3 又不能用了,见鬼了。2023.3.4),我记得好像还哪里可以查,但不记得了。既然和风也可以查,就再做个app不就行了,其实也可以把代码 放到我那个“项目”里,这事以后再说。而且还可以顺便学点东西,我肯定会遇到问题的,解决的过程就是学习的过程。可没想到这个东西还真给我找了不少麻烦,也算学到了东西。我之前做过一个“andriod 和风天气SDK获取实时天气(保姆级教程)”,我原本想这不是一样吗?代码都不用大的改动,其实不一样,而且我现在怀疑那个教程的代码还能不能用,我真想不通,代码干嘛改动那么大?这样以前做的东西不都用不了?算了,生气也没用。先说说两个为难我的地方。

  1. 这个东西获取的城市数据是List<LocationBean>这种格式(相关数据格式见:城市搜索 for Android | 和风天气开发服务),我以为是list,于是按照list<bean>的获取值方法好一顿折腾,就是不成功,原来获取天气的时候就很简单,而且当时还提供例程代码,现在好了,例程代码也没有了,只能一遍遍试, 因为我真不会啊。而且原来获取天气的代码搬过来没好使。折腾我好几天。

  1. 在获取天气的时候,直接可以在代码里面修改ui界面,在这里不行,settext出现致命错误:Only the original thread that created a view hierarchy can touch its views.一查才知道不可以在非ui线程更新ui线程(其实我哪里知道,后来才知道是这么回事。)于是又查解决办法,书到用时方恨少啊。

好了,剩下的就是如何完整的做这个app了。

重要:申请key之前先建立项目,项目的package name(包名)要用,不建立项目没有这个名称,或者后建立项目的时候用这个名也行。

一、申请免费和风key.

 网址:登录 | 和风天气

注册略。

登录后进入“和风天气开发者控制台”

和风SDK查询城市ID(保姆级教程)

点击左侧"项目管理":

和风SDK查询城市ID(保姆级教程)

进入后点击右侧"添加key"进入下图(上图只是演示,和风只能申请3个免费KEY):选择“android SDK”,key的名称随便写,package name "必须"与你的app 一致,否则无法获取数据。(下面有提示如何获取package name,一般类似com.example.nothing这样。)

和风SDK查询城市ID(保姆级教程)

点击创建后如下图,就得到了key 和public id.这两个在代码里和风初始化的时候都要用到。

和风SDK查询城市ID(保姆级教程)

至此和风免费key申请完成,此key每天有1000次免费访问,足够了。

二、新建项目。(android studio2021.2.1)

file-new-newproject后如下图:选择empty activity.

和风SDK查询城市ID(保姆级教程)

next后:

和风SDK查询城市ID(保姆级教程)

项目名称自选,我写的nothing是为了配合刚才那个和风key.最下面的minimumsdk是指最小兼容版本,看个人需要,这个以后也可以改。点finish完成。

三、项目配置:

城市搜索开发文档:城市搜索 for Android | 和风天气开发服务

sdk下载:Android SDK配置 | 和风天气开发服务

把下载的sdk文件放到下图的文件夹内:libs必须在project模式下才能看到,可以在系统“文件管理器”打开如下路径:AndroidStudioProjects\nothing\app\libs。

和风SDK查询城市ID(保姆级教程)

在android studio内打开文件夹在sdk文件上右键,点击最下面add as library完成sdk导入

和风SDK查询城市ID(保姆级教程)

添加权限。打开:androidmanafest.xml文件

和风SDK查询城市ID(保姆级教程)

添加如下权限:

    <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" />

权限意义:

和风SDK查询城市ID(保姆级教程)

权限添加androidmanafest.xml位置如图示:

和风SDK查询城市ID(保姆级教程)

引用库。打开如下图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+)
和风SDK查询城市ID(保姆级教程)

至此项目配置完成。

四、项目代码。主要部分都有注释。注意本代码不是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">

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <EditText
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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" />

    <Button
        android: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;
    @Override
    protected 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(){
            @Override
            public 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";
            //如果提供数据有问题显示          
            @Override
            public void onError(Throwable e) {
                Log.i(TAG, "onError: ", e);
                System.out.println("Weather Now Error:"+new Gson());
            }
            //如果返回结果正确则执行
            @Override
            public void onSuccess(GeoBean geoBean) {
                if (Code.OK == geoBean.getCode()) {//getLocationBean
                    String 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() {
                        @Override
                        public 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);
                }
            }
        });
    }
}

动图演示:文章来源地址https://www.toymoban.com/news/detail-477499.html

和风SDK查询城市ID(保姆级教程)

到了这里,关于和风SDK查询城市ID(保姆级教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio安装和设置SDK、Gradle(国内源)、AVD下载目录详细教程

    本机环境:win11家庭版 Android Studio版本:android-s tudio-2022.2.1.20-windows android studio官网 在安装目标盘创建文件夹,不要有中文文件夹,文件夹名称不要带空格。 本次安装在VMware虚拟机中安装,只有一个C盘,无其他盘,所以自定义安装目录都在C盘下创建的 Android studio安装完成 上

    2024年02月14日
    浏览(52)
  • iOS开发Swift-10-位置授权, cocoapods,API,天气获取,城市获取-和风天气App首页代码

     1.获取用户当前所在的位置 在infi中点击加号,选择权限:当用户使用app的时候获取位置权限. 填写使用位置权限的目的.  2.获取用户的经纬度. ViewController:  3.通过第三方服务获取当前天气 (1)安装cocoapods https://dev.qweather.com/ 在网站中可以找到,当向 https://devapi.qweather.com/v7/weathe

    2024年02月09日
    浏览(53)
  • GEO芯片数据下载和探针ID转换(保姆级教程)

    本文章主要参考了: ①R 语言的安装(详细教程) ②GEO芯片数据下载和探针ID转换 我们需要的基因表达量信息在NCBI的GEO数据库中对应的编号为GSE95394,搜索后结果如下 来到页面底部,这里的series Matrix File(s)是已经处理好所有样本对应各基因的表达量数据 下载并打开后如下图,

    2024年02月01日
    浏览(38)
  • Android studio中如何下载sdk

    打开 file - settings 这个页面, 在要下载的 SDK 前面勾上, 然后点 apply 在 platforms 中就可以看到下载好的 SDK: Android SDK目录结构详细介绍可以参考这篇文章: 51CTO博客- Android SDK目录结构

    2024年02月05日
    浏览(53)
  • Android Studio 提高SDK下载速度

    我们在下载Android SDK的时候,经常会出现下载失败的情况, 报 android sdk manager not installing components 之类的错误。 要如何加快SDK的下载速度呢 ? 我们可以通过修改 Hosts 来实现 Windows 中的 hosts 文件是一个没有扩展名的系统文件,可以用记事本等工具打开。它的作用是将一些常用

    2024年02月16日
    浏览(51)
  • Android Studio与 Android SDK的安装和配置

    Android Studio与 Android SDK的安装和配置 Android Studio是开发Android应用程序的官方集成开发环境(IDE),它提供了丰富的工具和功能,使开发者能够方便地创建、调试和部署Android应用。Android SDK(Software Development Kit)是一组开发Android应用所需的软件包集合,包含了Android平台的工具

    2024年02月08日
    浏览(49)
  • 安装Android Studio并配置sdk环境

    下载地址:https://www.oracle.com/java/technologies/java-se-glance.html 参考这篇文章:https://blog.csdn.net/ace_u_005a/article/details/114840497(优秀极了) 官网下载地址:https://developer.android.google.cn/studio/#downloads(下载不了|_|) 这里可以下载:http://www.android-studio.org/index.php/download/hisversion(Nice!)

    2023年04月09日
    浏览(83)
  • Android Studio安装SDK失败解决办法

    安装SDK时界面会显示安装的连接,同时在你选择的安装SDK的文件夹里面会生成一些目录和文件,在你选择放SDK的目录下有一个叫做.temp的文件夹,里面放的就是下载的临时文件。 .temp内部的文件夹里面能看到下载的具体文件名,我们可以直接复制在下载信息框的链接,粘贴到

    2024年04月09日
    浏览(54)
  • Android Studio配置本地SDK的方法

    Android Studio配置本地SDK的方法 Android Studio是一款强大的集成开发环境,用于开发Android应用程序。在使用Android Studio进行开发时,配置本地SDK是非常重要的一步。本文将介绍如何进行Android Studio的本地SDK配置,并提供相应的源代码示例。 下载Android SDK 首先,你需要下载Android SD

    2024年02月03日
    浏览(42)
  • Android中的SDK以及利用Android Studio生成aar

    广义上的SDK: 指的是为特定的软件包、软件框架、硬件平台、操作系统等建立应用程序时所使用的开发工具的集合。 比如你在编辑器里敲代码的时候它会自动补全代码,自动错误检查,你点一下Run,它会调用编译器来自动编译,编译完它会调用iPhone的模拟器来运行,这就是

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包