Android 和风天气+腾讯地图


前言

使用技术:和风天气+腾讯地图整合使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、和风天气申请+使用

参考链接:
保姆级教学
官方文档

关键代码:

    private void loadCurrentWeather(String location, final String address) {
    //location:查询的地区,可通过该地区ID、经纬度进行查询经纬度格式:经度,纬度(!!注意经度在前,有被坑过TAT)
        QWeather.getWeatherNow(getActivity(),location,Lang.ZH_HANS, Unit.METRIC, new QWeather.OnResultWeatherNowListener() {
            @Override
            public void onError(Throwable throwable) {
                Log.e("weather", "onError: "+throwable);
            }
            @Override
            public void onSuccess(WeatherNowBean weatherNowBean) {
                Log.e("Weather", "getWeather onSuccess: " + new Gson().toJson(weatherNowBean));
                //先判断返回的status是否正确,当status正确时获取数据,若status不正确,可查看status对应的Code值找到原因
                if (Code.OK == weatherNowBean.getCode()) {
                   // Log.e("Westher",new Gson().toJson(weatherNowBean));
                    WeatherNowBean.NowBaseBean now = weatherNowBean.getNow();
                    String tanqi=now.getText();
                    String temp=now.getTemp();
                    String shidu=now.getHumidity();
                    String fengxiang=now.getWindDir();
                    tv_hum.setText("湿度:"+shidu);
                    tv_temp.setText(temp);
                    tv_text.setText(tanqi);
                    tv_wind.setText("东风:"+fengxiang);
                    tv_location.setText(address);
                    layout_space.setVisibility(View.VISIBLE);
                    layout_2_set_location.setVisibility(View.INVISIBLE);
                     //这里使用了lottieAnimation;自己的设定
                    String tag=formateWeather(tanqi);
                   
                    weather_iv.setImageAssetsFolder("lottie/" +tag);
                    weather_iv.setAnimation("lottie/"+tag+"/"+tag+".json");
                    weather_iv.playAnimation();

                } else {
                    //在此查看返回数据失败的原因
                    Code code = weatherNowBean.getCode();
                    Log.e("Weather", "failed code: " + code);
                }
            }
        });

        QWeather.getGeoCityLookup(getActivity(), new QWeather.OnResultGeoListener() {
            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onSuccess(GeoBean geoBean) {
                Log.e("Weather", "getWeather onSuccess: " + new Gson().toJson(geoBean));
            }
        });
    }
    //为了使用Lottie将中文转英文
    private String formateWeather(String tanqi) {
        if(tanqi.contains("晴"))
        {
            return "sunny";
        }else if(tanqi.contains("阴")||tanqi.contains("云")){
            return "cloud";
        }else if(tanqi.contains("雪"))
        {
            return "snow";
        }else if(tanqi.contains("雨"))
        {
            return "rainy";
        }
        return "";
    }

layout文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="151dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="44dp">


        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/layout_space"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent">

            <TextView
                android:id="@+id/tv_temperature"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                android:textColor="@color/white"
                android:textSize="43sp"
                android:layout_marginLeft="25dp"
                />

            <TextView
                android:id="@+id/tv_temp_unit"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:text="@string/temp_unit"
                android:textColor="@color/white"
                android:textStyle="bold"
                android:textSize="@dimen/ts_36"
                app:layout_constraintTop_toTopOf="@id/tv_temperature"
                app:layout_constraintBottom_toTopOf="@id/tv_text"
                app:layout_constraintStart_toEndOf="@id/tv_temperature"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="@id/tv_temperature"
                app:layout_constraintStart_toEndOf="@id/tv_temperature"
                android:textColor="@color/white"
                android:textSize="@dimen/ts_12"
                android:id="@+id/tv_text"
                android:layout_marginLeft="5dp"
                android:layout_marginBottom="8dp"
                />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="@id/tv_text"
                app:layout_constraintStart_toEndOf="@id/tv_text"
                android:textColor="@color/white"
                android:textSize="@dimen/ts_12"
                android:id="@+id/tv_location"
                android:layout_marginLeft="5dp"
                />

            <TextView
                android:id="@+id/tv_outside_humidity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:layout_constraintTop_toBottomOf="@id/tv_temperature"
                app:layout_constraintStart_toStartOf="@id/tv_temperature"
                android:textSize="@dimen/ts_12"
                android:textColor="@color/blue_BFD2FF"
                />

            <View
                android:layout_width="1dp"
                android:layout_height="12dp"
                app:layout_constraintStart_toEndOf="@id/tv_outside_humidity"
                app:layout_constraintTop_toTopOf="@id/tv_outside_humidity"
                app:layout_constraintBottom_toBottomOf="@id/tv_outside_humidity"
                android:background="@color/blue_BFD2FF"
                android:layout_marginLeft="12dp"
                android:id="@+id/v_space"
                />

            <TextView
                android:id="@+id/tv_outside_wind_dir"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="@dimen/ts_12"
                android:textColor="@color/blue_BFD2FF"
                app:layout_constraintTop_toTopOf="@id/tv_outside_humidity"
                app:layout_constraintStart_toEndOf="@id/v_space"
                android:layout_marginLeft="12dp"
                />


        </androidx.constraintlayout.widget.ConstraintLayout>

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/layout_2_set_location"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="@id/layout_space"
            app:layout_constraintBottom_toBottomOf="@id/layout_space"
            app:layout_constraintStart_toStartOf="@id/layout_space"
            app:layout_constraintEnd_toEndOf="@id/layout_space"
            >

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                >

                <TextView
                    android:id="@+id/tv_weather_tip"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    android:textColor="@color/white"
                    android:textSize="@dimen/ts_16"
                    android:layout_marginLeft="25dp"
                    android:text="@string/no_weather_info"
                    />

                <TextView
                    android:id="@+id/tv_advise_tip"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:layout_constraintStart_toStartOf="@id/tv_weather_tip"
                    app:layout_constraintTop_toBottomOf="@id/tv_weather_tip"
                    android:textSize="@dimen/ts_12"
                    android:layout_marginTop="5dp"
                    android:textColor="@color/blue_BFD2FF"
                    android:text="@string/set_family_first"
                    />

            </androidx.constraintlayout.widget.ConstraintLayout>


        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>

</RelativeLayout>

效果图:

在这里插入图片描述
在这里插入图片描述

二、腾讯地图申请+使用

参考链接:
https://lbs.qq.com/mobile/androidLocationSDK/androidGeoGuide/androidGeoCreat
https://blog.csdn.net/yechaoa/article/details/88893785
https://lbs.qq.com/tool/component-picker.html
代码如下(示例):


 mWebView=findViewById(R.id.web_map);
        btn =findViewById(R.id.btn_map);
        String mUrl = "https://apis.map.qq.com/tools/locpicker?search=1&type=0&backurl=http://callback&key=自己的key&referer=自己的工程名";
        WebSettings settings = mWebView.getSettings();
        settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
        settings.setSupportMultipleWindows(true);
        settings.setJavaScriptEnabled(true);
        settings.setSavePassword(false);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setMinimumFontSize(settings.getMinimumFontSize() + 8);
        settings.setAllowFileAccess(false);
        settings.setTextSize(WebSettings.TextSize.NORMAL);
        mWebView.setVerticalScrollbarOverlay(true);
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (!url.startsWith("http://callback")) {
                    view.loadUrl(url);
                } else {
                    try {
                     

                        //转utf-8编码
                        String decode = URLDecoder.decode(url, "UTF-8");
                       // LogUtil.i(decode);

                        //转uri,然后根据key取值
                        Uri uri = Uri.parse(decode);
                        Log.e("address",uri.toString());
                        latng = uri.getQueryParameter("latng");//纬度在前,经度在后,以逗号分隔
                        String[] split = latng.split(",");
                        DecimalFormat decimalFormat=new DecimalFormat(".00");
                        lat=decimalFormat.format(Float.parseFloat(split[0]));//纬度
                        lng=decimalFormat.format(Float.parseFloat(split[1]));//经度
                        address = uri.getQueryParameter("city");//地址
                        Log.e("address",lat+"///"+lng+"///"+address+"///"+latng);

                      //  LogUtil.i(uri.getQueryParameter("addr"));

                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
                return true;
            }
        });
        mWebView.loadUrl(mUrl);

layout文件:

<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=".Activity.MappingActivity">

    <WebView
        android:id="@+id/web_map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="56dp"
        app:layout_constraintBottom_toTopOf="@+id/btn_map"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </WebView>

    <TextView
        android:id="@+id/btn_map"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="8dp"
        android:background="@drawable/background_circle_bule_gradient"
        android:gravity="center"
        android:text="@string/confirm"
        android:textColor="@color/white"
        android:textSize="@dimen/ts_16"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_editor_absoluteX="16dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

效果图:
在这里插入图片描述
在这里插入图片描述

三、两者连接

流程:天气处设置监听器→跳转腾讯地图(有回调结果的跳转)→腾讯地图下设置一个按钮并设置监听器→跳转天气并带回地址名和经纬度

代码如下(示例):

天气页面(有回调的跳转):

 layout_2_set_location.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //TOdo:设置当前位置。
                Intent intent =new Intent(getActivity(), MappingActivity.class);
                int requestCode =1;
                startActivityForResult(intent,requestCode);
            }
        });
      
 @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //三个参数:int requestCode, int resultCode, Intent data:分别表示结果请求码,结果码 ,data就是我们刚刚在另一个activity保存的data
        /**
         * 1判断code 2 从data 中取出数据 3显示
         */
        if(requestCode==1&&resultCode==2)
        {
            String result=data.getStringExtra("addr");
            String address =data.getStringExtra("address");
            Log.e("address",result);
            loadCurrentWeather(result,address);
        }
    }

地图页面:

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //返回结果之前先保存一个结果
                int resultCode=2;
                //准备一个带额外数据的intent对象
                Intent data=new Intent();
                //结果是从输入框中获取
                addr=lng+","+lat;
                data.putExtra("addr",addr);//key value
                data.putExtra("address",address);
                //设置结果  data 通过RESULT 取得结果
                setResult(resultCode,data);
                finish();
            }
        });

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值