簡體   English   中英

如何讓天氣信息默認顯示用戶當前位置的天氣? Openweather map

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM