[英]How can I make the weather information default to display the weather in the user's current location? Openweather map
我正在嘗試制作一個基本的天氣應用程序,所以這可能是一個很長的應用程序。
我希望應用程序在加載時顯示用戶當前位置的天氣。 另外,我有一個編輯文本,用戶可以在其中搜索一個城市,並顯示該城市的當前天氣。
但是,如果他們沒有輸入城市/將框留空,我如何驗證編輯文本並引發錯誤消息?
我不知道如何將天氣默認為用戶的位置。 有人能幫忙嗎?
這是我到目前為止所得到的:
package com.example.weatherapp;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
TextView view_city;
TextView view_temp;
TextView view_desc;
TextView view_hum;
TextView view_pres;
TextView view_wspeed;
ImageView view_weather;
EditText search;
Button btnsearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view_city = findViewById(R.id.location);
view_city.setText("");
view_temp = findViewById(R.id.temp);
view_temp.setText("");
view_desc = findViewById(R.id.condition);
view_desc.setText("");
view_hum = findViewById(R.id.humidity);
view_hum.setText("");
view_pres = findViewById(R.id.pressure);
view_pres.setText("");
view_wspeed = findViewById(R.id.wspeed);
view_wspeed.setText("");
view_weather = findViewById(R.id.weathericon);
search = findViewById(R.id.citysearch);
btnsearch = findViewById(R.id.searchbtn);
btnsearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InputMethodManager imm=(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getRootView().getWindowToken(), 0);
api_key(String.valueOf(search.getText()));
}
});
}
private void api_key(final String City) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://api.openweathermap.org/data/2.5/weather?q="+City+"&units=metric&appid=febe19d9086a360a7f9283cedac01bfd")
.get()
.build();
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
try{
Response response = client.newCall(request).execute();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) { }
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String responseData = response.body().string();
try {
JSONObject json = new JSONObject(responseData);
JSONArray array = json.getJSONArray("weather");
JSONObject object = array.getJSONObject(0);
String description = object.getString("description");
String icons = object.getString("icon");
JSONObject templ = json.getJSONObject("main");
Double Temperature = templ.getDouble("temp");
JSONObject hum = json.getJSONObject("main");
Double Humidity = hum.getDouble("humidity");
JSONObject pre = json.getJSONObject("main");
Double Pressure = pre.getDouble("pressure");
JSONObject wind = json.getJSONObject("wind");
Double windSpeed = wind.getDouble("speed");
setText(view_city, City);
String temps = Math.round(Temperature) + "°C";
setText(view_temp, temps);
String hums = Math.round(Humidity) + "%";
setText(view_hum, hums);
String pres = Math.round(Pressure) + " hPa";
setText(view_pres, pres);
String wspeed = Math.round(windSpeed) + " mph";
setText(view_wspeed, wspeed);
setText(view_desc, description);
setIcon(view_weather, icons);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}catch (IOException e){
e.printStackTrace();
}
}
private void setText(final TextView text, final String value){
runOnUiThread(new Runnable() {
@Override
public void run() {
text.setText(value);
}
});
}
private void setIcon(final ImageView imageView, final String value){
runOnUiThread(new Runnable() {
@Override
public void run() {
switch (value){
case "01d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.sun));
break;
case "01n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.sun));
break;
case "02d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.suncloud));
break;
case "02n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.suncloud));
break;
case "03d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.cloudsun));
break;
case "03n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.cloudsun));
break;
case "04d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.cloud));
break;
case "04n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.cloud));
break;
case "09d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.rain));
break;
case "09n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.rain));
break;
case "10d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.heavyrain));
break;
case "10n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.heavyrain));
break;
case "11d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.thunder));
break;
case "11n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.thunder));
break;
case "13d": imageView.setImageDrawable(getResources().getDrawable(R.drawable.snow));
break;
case "13n": imageView.setImageDrawable(getResources().getDrawable(R.drawable.snow));
break;
default:
imageView.setImageDrawable(getResources().getDrawable(R.drawable.sun));
}
}
});
}
}
就放
btnsearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String mSearch = search.getText().toString().trim();
if (mSearch.equals("")) {
//Put Some Error like**
Toast.makeText(context, "Please Input City Name*", Toast.LENGTH_SHORT).show();
} else {
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getRootView().getWindowToken(), 0);
api_key(String.valueOf(search.getText()));
}
}
});
編輯這是您的評論的編輯
First go to 'you package name'/right click/new/file/: name as CityNames.json (Rembeber to put.json extension correctly)
然后 go 到這個站點。
復制所有數據並將其粘貼到 json 文件中。
並在您的項目中創建一個方法
File file = new File(context.getFilesDir(),FILE_NAME);
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
StringBuilder stringBuilder = new StringBuilder();
String line = bufferedReader.readLine();
while (line != null){
stringBuilder.append(line).append("\n");
line = bufferedReader.readLine();
}
bufferedReader.close();
// This responce will have Json Format String
String responce = stringBuilder.toString();
並將響應解析為 json 類型或了解它,它的基本!
然后制作一個 arrayList 並存儲取自 json 的所有城市名稱,並從方法中返回。
然后使用該方法檢查城市是否有效,如下所示:
for (int i = 0 ; methodName.size> i ; i++)
{
if (cityName.equals(methodName.get(i)))
{
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getRootView().getWindowToken(), 0);
api_key(String.valueOf(search.getText()));
break;
}
}
您應該使用 (FusedLocationProviderClient) (由 google 推薦)來獲取存儲在用戶手機中的最后一個用戶位置(緯度和經度)。 OpenWeather 的 API 有兩個參數,您應該在 API 中發送緯度和經度。 試試這個教程。 它會幫助你。 如何跟蹤當前位置
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.