如何获取当前位置的天气

12
7个回答

13

让我告诉你不应该使用的是...Google API(已经停用)

http://thenextweb.com/google/2012/08/28/did-google-just-quietly-kill-private-weather-api/

然后,您还有其他选择,例如

Yahoo Weather API

http://developer.yahoo.com/weather/

例如,获取法国巴黎以摄氏度和其他公制单位的预测:

http://weather.yahooapis.com/forecastrss?w=615702&u=c

请访问以下链接获取其他示例: http://developer.yahoo.com/weather/#examples

WunderGround天气API

http://www.wunderground.com/weather/api/

另一个不错的替代品是Open Weather Map API,只需传递位置的纬度和经度即可支持JSON输出。

http://openweathermap.org/wiki/API/JSON_API

@MahmoudFarahat 这取决于你,哪个解决你的目的最好就用哪个。 - AurA
请问您如何在Yahoo天气API中传递动态经纬度?我已经获取了当前位置的经纬度,但是当我尝试将其传递到Yahoo天气API URL中时,它会返回401错误。但是,当我传递静态经纬度时,它会给我返回结果。URL:'https://weather-ydn-yql.media.yahoo.com/forecastrss?lat=' + latitude + '&lon=' + longitude + '&format=json&oauth_consumer_key=' + Appconstants.info.WEATHER_CONSUMER_KEY + '&oauth_signature_method=HMAC-SHA1&oauth_timestamp=' + timeStamp + '&oauth_nonce=+myAuthNonce+&oauth_version=1.0&oauth_signature=+myauthSgnature'请建议。 - Chandni

11

我个人使用过这个 API,它是免费的,你可以通过邮政编码、邮编或经纬度检索任何位置的天气预报。

免费本地天气 REST API

**注意:**本地天气 API 返回 XML、JSON 和 CSV 格式的天气数据,包括温度、降水(雨量)、天气描述、天气图标和风速等天气元素。

**更新:**www.worldweatheronline.com/ api 不再免费。

尝试以下 API:

  1. accuweather.com
  2. https://openweathermap.org/
  3. www.apixu.com

非常感谢Amitabh Sarkar。 - Tuan Vu
Amitabh Sarkar - 这是免费的吗?我需要通过经纬度访问本地天气报告。 - Arnold Brown

2

2

我个人使用过OpenWeather API。它完全免费,您可以通过城市名称、邮政编码或纬度和经度等来检索任何位置的天气预报。

<?php
 $city    = 'london';
    $jsonfile    = file_get_contents( 'http://api.openweathermap.org/data/2.5/weather?q=' . $city . '&units=metric&lang=en&appid=c0c4a4b4047b97ebc5948ac9c48c0559' );
    $jsondata    = json_decode( $jsonfile );
    $temp        = $jsondata->main->temp;
    $pressure    = $jsondata->main->pressure;
    $mintemp     = $jsondata->main->temp_min;
    $maxtemp     = $jsondata->main->temp_max;
    $wind        = $jsondata->wind->speed;
    $humidity    = $jsondata->main->humidity;
    $desc        = $jsondata->weather[0]->description;
    $maind       = $jsondata->weather[0]->main;
    $currentTime = time();
    ?>
    <style>
    body {
        font-family: Arial;
        font-size: 0.95em;
        color: #929292;
    
    }
    
    .report-container {
        border: #E0E0E0 1px solid;
        padding: 20px 40px 40px 40px;
        border-radius: 2px;
        width: 550px;
        margin: 0 auto;
    }
    
    .weather-icon {
        vertical-align: middle;
        margin-right: 20px;
    }
    
    .weather-forecast {
        color: #212121;
        font-size: 1.2em;
        font-weight: bold;
        margin: 20px 0px;
    }
    
    span.min-temperature {
        margin-left: 15px;
        color: #929292;
    }
    
    .time {
        line-height: 25px;
    }
    </style>
    <body>
    <div class="report-container">
            <h2><?php echo $jsondata->name; ?> Weather Status</h2>
            <div class="time">
                <div><?php echo date( 'l g:i a', $currentTime ); ?></div>
                <div><?php echo date( 'jS F, Y', $currentTime ); ?></div>
                <div><?php echo $desc; ?></div>
            </div>
            <div class="weather-forecast">
                <img
                    src="http://openweathermap.org/img/w/<?php echo $jsondata->weather[0]->icon; ?>.png"
                    class="weather-icon" /> <?php echo $mintemp; ?>°C<span
                    class="min-temperature"><?php echo $maxtemp; ?>°C</span>
            </div>
            <div class="time">
                <div>Humidity: <?php echo $humidity; ?> %</div>
                <div>Wind: <?php echo $wind; ?> km/h</div>
            </div>
        </div>
        </body>

1

OpenWeatherMap是最好的天气开放API,您可以使用:https://openweathermap.org/api

  • 它提供免费的天气数据和预测API,适用于任何地图服务,如Web和智能手机应用程序
  • 它使用JSON / XML格式为您的应用程序提供天气数据。
  • 它提供广泛的有用的与天气相关的信息,包括当前天气,历史天气,预报,风,云,天气站数据等
  • 我们如何获取所选位置的天气信息? Openweathermap提供了两种不同的查找城市的模式。一种使用名称模式,另一种使用地理坐标。
  • 免费使用

这是一个示例应用程序android-openweathermap-app


1
请注意,截至2022年9月,它并不完全免费。即使是使用有限的免费访问权限,您也必须在文件中提供计费信息,并且他们会对超额使用进行收费(而不是设定上限)。 - Chris H

0

0

添加到 build.gradle 文件中

implementation 'com.github.androdocs:Simple-HTTP-Request:v1.0'

XML

<?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="match_parent"
android:background="@drawable/bg_gradient"
android:orientation="vertical"
android:padding="25dp">

<RelativeLayout
    android:id="@+id/mainContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="visible">

    <LinearLayout
        android:id="@+id/addressContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:textColor="#FFFFFF"
            android:id="@+id/address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="DHAKA, BD"
            android:textSize="24dp" />

        <TextView
            android:textColor="#FFFFFF"
            android:id="@+id/updated_at"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="20 April 2012, 20:08 PM"
            android:textSize="14dp" />
    </LinearLayout>


    <LinearLayout
        android:id="@+id/overviewContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical">

        <TextView
            android:textColor="#FFFFFF"
            android:id="@+id/status"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Clear Sky"
            android:textSize="18dp" />

        <TextView
            android:textColor="#FFFFFF"
            android:id="@+id/temp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:fontFamily="sans-serif-thin"
            android:text="29°C"
            android:textSize="90dp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal">

            <TextView
                android:textColor="#FFFFFF"
                android:id="@+id/temp_min"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Min Temp: 05:05 AM" />

            <Space
                android:layout_width="50dp"
                android:layout_height="wrap_content" />

            <TextView
                android:textColor="#FFFFFF"
                android:id="@+id/temp_max"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Max Temp: 05:05 PM" />
        </LinearLayout>

    </LinearLayout>


    <LinearLayout
        android:id="@+id/detailsContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="3">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3CF1EBF1"
                android:gravity="center"
                android:orientation="vertical"
                android:padding="8dp">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@drawable/sunrise"
                    android:tint="#FFFFFF" />

                <Space
                    android:layout_width="wrap_content"
                    android:layout_height="5dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Sunrise"
                    android:textSize="12dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:id="@+id/sunrise"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="06:40 AM"
                    android:textSize="14dp" />
            </LinearLayout>

            <Space
                android:layout_width="10dp"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3CF1EBF1"
                android:gravity="center"
                android:orientation="vertical"
                android:padding="8dp">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@drawable/sunset"
                    android:tint="#FFFFFF" />

                <Space
                    android:layout_width="wrap_content"
                    android:layout_height="5dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Sunset"
                    android:textSize="12dp" />

                <TextView
                     android:textColor="#FFFFFF"
                    android:id="@+id/sunset"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="06:40 AM"
                    android:textSize="14dp" />
            </LinearLayout>

            <Space
                android:layout_width="10dp"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3CF1EBF1"
                android:gravity="center"
                android:orientation="vertical"
                android:padding="8dp">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@drawable/wind"
                    android:tint="#FFFFFF" />

                <Space
                    android:layout_width="wrap_content"
                    android:layout_height="5dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Wind"
                    android:textSize="12dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:id="@+id/wind"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="06:40 AM"
                    android:textSize="14dp" />
            </LinearLayout>
        </LinearLayout>

        <Space
            android:layout_width="wrap_content"
            android:layout_height="10dp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="3">

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3CF1EBF1"
                android:gravity="center"
                android:orientation="vertical"
                android:padding="8dp">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@drawable/pressure"
                    android:tint="#FFFFFF" />

                <Space
                    android:layout_width="wrap_content"
                    android:layout_height="5dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Pressure"
                    android:textSize="12dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:id="@+id/pressure"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="06:40 AM"
                    android:textSize="14dp" />
            </LinearLayout>

            <Space
                android:layout_width="10dp"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3CF1EBF1"
                android:gravity="center"
                android:orientation="vertical"
                android:padding="8dp">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@drawable/humidity"
                    android:tint="#FFFFFF" />

                <Space
                    android:layout_width="wrap_content"
                    android:layout_height="5dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Humidity"
                    android:textSize="12dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:id="@+id/humidity"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="06:40 AM"
                    android:textSize="14dp" />
            </LinearLayout>

            <Space
                android:layout_width="10dp"
                android:layout_height="wrap_content" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="#3CF1EBF1"
                android:gravity="center"
                android:orientation="vertical"
                android:padding="8dp">

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:src="@drawable/info"
                    android:tint="#FFFFFF" />

                <Space
                    android:layout_width="wrap_content"
                    android:layout_height="5dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Created By"
                    android:textSize="12dp" />

                <TextView
                    android:textColor="#FFFFFF"
                    android:id="@+id/about"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="AndroDocs"
                    android:textSize="14dp" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>


<ProgressBar
    android:id="@+id/loader"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone" />

<TextView
    android:id="@+id/errorText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="Something went wrong"
    android:visibility="gone" />

 public class WeatherActivity extends AppCompatActivity {
//    String CITY = "surat";
String API = "8118ed6ee68db2debfaaa5a44c832918";
String locality;
 TextView addressTxt, updated_atTxt, statusTxt, tempTxt, temp_minTxt, temp_maxTxt, 
sunriseTxt,   sunsetTxt, windTxt, pressureTxt, humidityTxt;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().clearFlags(67108864);
        getWindow().setStatusBarColor(ContextCompat.getColor(this, 
R.color.weatheract));
    }
    setContentView(R.layout.activity_weather);

    addressTxt = findViewById(R.id.address);
    updated_atTxt = findViewById(R.id.updated_at);
    statusTxt = findViewById(R.id.status);
    tempTxt = findViewById(R.id.temp);
    temp_minTxt = findViewById(R.id.temp_min);
    temp_maxTxt = findViewById(R.id.temp_max);
    sunriseTxt = findViewById(R.id.sunrise);
    sunsetTxt = findViewById(R.id.sunset);
    windTxt = findViewById(R.id.wind);
    pressureTxt = findViewById(R.id.pressure);
    humidityTxt = findViewById(R.id.humidity);

    LocationManager locationManager = (LocationManager) 
getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    if (ContextCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
            && ContextCompat.checkSelfPermission(this, 
Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

        Location location = 
locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, 
false));
        if (location != null) {
            getCity(location.getLatitude(), location.getLongitude());
        }
    }

}

private final void getCity(double d2, double d3) {
    List list;

    try {
        list = new Geocoder(getApplicationContext(), 
Locale.getDefault()).getFromLocation(d2, d3, 1);
        if (list != null && (!list.isEmpty())) {
            locality = ((Address) list.get(0)).getLocality();
            new weatherTask().execute();

        }
    } catch (NullPointerException e2) {

    } catch (IOException e) {
        e.printStackTrace();
    }
}

class weatherTask extends AsyncTask<String, Void, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        /* Showing the ProgressBar, Making the main design GONE */
        findViewById(R.id.loader).setVisibility(View.VISIBLE);
        findViewById(R.id.mainContainer).setVisibility(View.GONE);
        findViewById(R.id.errorText).setVisibility(View.GONE);
    }

    protected String doInBackground(String... args) {
        String response = 
HttpRequest.excuteGet("https://api.openweathermap.org/data/2.5/weather?q=" + locality 
+ "&units=metric&appid=" + API);
        return response;
    }

    @Override
    protected void onPostExecute(String result) {


        try {
            JSONObject jsonObj = new JSONObject(result);
            JSONObject main = jsonObj.getJSONObject("main");
            JSONObject sys = jsonObj.getJSONObject("sys");
            JSONObject wind = jsonObj.getJSONObject("wind");
            JSONObject weather = jsonObj.getJSONArray("weather").getJSONObject(0);

            Long updatedAt = jsonObj.getLong("dt");
            String updatedAtText = "Updated at: " + new SimpleDateFormat("dd/MM/yyyy 
hh:mm a", Locale.ENGLISH).format(new Date(updatedAt * 1000));
            String temp = main.getString("temp") + "°C";
            String tempMin = "Min Temp: " + main.getString("temp_min") + "°C";
            String tempMax = "Max Temp: " + main.getString("temp_max") + "°C";
            String pressure = main.getString("pressure");
            String humidity = main.getString("humidity");

            Long sunrise = sys.getLong("sunrise");
            Long sunset = sys.getLong("sunset");
            String windSpeed = wind.getString("speed");
            String weatherDescription = weather.getString("description");

            String address = jsonObj.getString("name") + ", " + 
sys.getString("country");


            /* Populating extracted data into our views */
            addressTxt.setText(address);
            updated_atTxt.setText(updatedAtText);
            statusTxt.setText(weatherDescription.toUpperCase());
            tempTxt.setText(temp);
            temp_minTxt.setText(tempMin);
            temp_maxTxt.setText(tempMax);
            sunriseTxt.setText(new SimpleDateFormat("hh:mm a", 
Locale.ENGLISH).format(new Date(sunrise * 1000)));
            sunsetTxt.setText(new SimpleDateFormat("hh:mm a", 
Locale.ENGLISH).format(new Date(sunset * 1000)));
            windTxt.setText(windSpeed);
            pressureTxt.setText(pressure);
            humidityTxt.setText(humidity);

            /* Views populated, Hiding the loader, Showing the main design */
            findViewById(R.id.loader).setVisibility(View.GONE);
            findViewById(R.id.mainContainer).setVisibility(View.VISIBLE);


        } catch (JSONException e) {
            findViewById(R.id.loader).setVisibility(View.GONE);
            findViewById(R.id.errorText).setVisibility(View.VISIBLE);
        }

    }
}


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接