前言
使用技术:和风天气+腾讯地图整合使用
提示:以下是本篇文章正文内容,下面案例可供参考
一、和风天气申请+使用
关键代码:
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();
}
});