رفتن به مطلب

آموزش استفاده از api هواشناسی در برنامه


ارسال‌های توصیه شده

سلام دوستان عزیز ، امروز من ی قسمتی از نرم افزارمو داشتم تکمیل میکردم ، به  قسمت هواشناسی رسیدم، نیاز داشتم از ی api هواشناسی استفاده کنم ، همونطور که میدونید سرور های زیادی api هواشناسی رو ارایه میکنن ولی بیشتر اون ها برای توسعه دهنده های ایرانی بستس از جمله یاهو !!

خب ما در این آموزش سعی داریم که از api هواشناسی سایت زیر استفاده کنیم : 

openweathermap.org

 

خب اول از همه وارد سایت میشید و ثبت نام میکنید ، توجه داشته باشید که پنل رایگان رو انتخاب کنید ، و بعد از ثبت نام ، وارد پنل خودتون بشید و بعد از انتخاب سرویس ، وارد قسمت API keys بشید و key خودتون رو ی جایی ذخیره کنید.

خب حالا وارد اندروید استدیو بشید و یک پروژه جدید تشکیل بدید: 

خب حالا در اندروید استدیو یک کلاس به نام  Function ایجاد کنید و کد های زیر رو در کلاس قرار بدید : 

import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
import java.util.Locale;

/**
 * Created by moein on 15/01/2017.
 */

public class Function {
    private static final String OPEN_WEATHER_MAP_URL =
            "http://api.openweathermap.org/data/2.5/weather?lat=%s&lon=%s&units=metric";

    private static final String OPEN_WEATHER_MAP_API = "b996dd71d70d2b9f4e72a87e5c3b9260";

    public static String setWeatherIcon(int actualId, long sunrise, long sunset){
        int id = actualId / 100;
        String icon = "";
        if(actualId == 800){
            long currentTime = new Date().getTime();
            if(currentTime>=sunrise && currentTime<sunset) {
                icon = "&#xf00d;";
            } else {
                icon = "&#xf02e;";
            }
        } else {
            switch(id) {
                case 2 : icon = "&#xf01e;";
                    break;
                case 3 : icon = "&#xf01c;";
                    break;
                case 7 : icon = "&#xf014;";
                    break;
                case 8 : icon = "&#xf013;";
                    break;
                case 6 : icon = "&#xf01b;";
                    break;
                case 5 : icon = "&#xf019;";
                    break;
            }
        }
        return icon;
    }



    public interface AsyncResponse {

        void processFinish(String output1, String output2, String output3, String output4, String output5, String output6, String output7);
    }





    public static class placeIdTask extends AsyncTask<String, Void, JSONObject> {

        public AsyncResponse delegate = null;//Call back interface

        public placeIdTask(AsyncResponse asyncResponse) {
            delegate = asyncResponse;//Assigning call back interfacethrough constructor
        }

        @Override
        protected JSONObject doInBackground(String... params) {

            JSONObject jsonWeather = null;
            try {
                jsonWeather = getWeatherJSON(params[0], params[1]);
            } catch (Exception e) {
                Log.d("Error", "Cannot process JSON results", e);
            }


            return jsonWeather;
        }

        @Override
        protected void onPostExecute(JSONObject json) {
            try {
                if(json != null){
                    JSONObject details = json.getJSONArray("weather").getJSONObject(0);
                    JSONObject main = json.getJSONObject("main");
                    DateFormat df;



                    String city = json.getString("name").toUpperCase(Locale.US) + ", " + json.getJSONObject("sys").getString("country");
                    String description = details.getString("description").toUpperCase(Locale.US);
                    String temperature = String.format("%.2f", main.getDouble("temp"))+ "°";
                    String humidity = main.getString("humidity") + "%";
                    String pressure = main.getString("pressure") + " hPa";
                    String iconText = setWeatherIcon(details.getInt("id"),
                            json.getJSONObject("sys").getLong("sunrise") * 1000,
                            json.getJSONObject("sys").getLong("sunset") * 1000);

                    delegate.processFinish(city, description, temperature, humidity, pressure, iconText, ""+ (json.getJSONObject("sys").getLong("sunrise") * 1000));

                }
            } catch (JSONException e) {
                //Log.e(LOG_TAG, "Cannot process JSON results", e);
            }



        }
    }






    public static JSONObject getWeatherJSON(String lat, String lon){
        try {
            URL url = new URL(String.format(OPEN_WEATHER_MAP_URL, lat, lon));
            HttpURLConnection connection =
                    (HttpURLConnection)url.openConnection();

            connection.addRequestProperty("x-api-key", OPEN_WEATHER_MAP_API);

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));

            StringBuffer json = new StringBuffer(1024);
            String tmp="";
            while((tmp=reader.readLine())!=null)
                json.append(tmp).append("\n");
            reader.close();

            JSONObject data = new JSONObject(json.toString());

            // This value will be 404 if the request was not
            // successful
            if(data.getInt("cod") != 200){
                return null;
            }

            return data;
        }catch(Exception e){
            return null;
        }
    }




}

 

سپس 

در اندروید استدیو وارد قسمت لایه اکتیوتی مورد نظرتون بشید و کد های زیر رو اضافه کنید:

<TextView
        android:id="@+id/city_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textAppearance="?android:attr/textAppearanceLarge" />


    <TextView
        android:id="@+id/weather_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="90sp"
        />

    <TextView
        android:id="@+id/current_temperature_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="50sp" />

    <TextView
        android:id="@+id/details_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/weather_icon"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textAppearance="?android:attr/textAppearanceMedium"
        />
    <TextView
        android:id="@+id/humidity_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/details_field"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textAppearance="?android:attr/textAppearanceMedium"
        />
    <TextView
        android:id="@+id/pressure_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/humidity_field"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:textAppearance="?android:attr/textAppearanceMedium"
        />

و بعد از این وارد کلاس اکتیویتی خودتون بشید و کد های زیر رو اضافه کنید : 

TextView cityField, detailsField, currentTemperatureField, humidity_field, pressure_field, weatherIcon;

    Typeface weatherFont;

cityField = (TextView)findViewById(R.id.city_field);
        detailsField = (TextView)findViewById(R.id.details_field);
        currentTemperatureField = (TextView)findViewById(R.id.current_temperature_field);
        humidity_field = (TextView)findViewById(R.id.humidity_field);
        pressure_field = (TextView)findViewById(R.id.pressure_field);
        weatherIcon = (TextView)findViewById(R.id.weather_icon);
        weatherIcon.setTypeface(weatherFont);

        Function.placeIdTask asyncTask =new Function.placeIdTask(new Function.AsyncResponse() {
            public void processFinish(String weather_city, String weather_description, String weather_temperature, String weather_humidity, String weather_pressure, String weather_iconText, String sun_rise) {

                cityField.setText(weather_city);
                detailsField.setText(weather_description);
                currentTemperatureField.setText(weather_temperature);
                humidity_field.setText("Humidity: "+weather_humidity);
                pressure_field.setText("Pressure: "+weather_pressure);
                weatherIcon.setText(Html.fromHtml(weather_iconText));

            }
        });
        asyncTask.execute("34.3277", "47.0778"); //  asyncTask.execute("Latitude", "Longitude")

و در آخر هم بیاید دسترسی اینترنت رو بهش بدید از طریق Manifest 

<uses-permission android:name="android.permission.INTERNET"/>

و آخرین نکته اینه که فونتی رو که واستون پیوست میکنم به برنامه اضافه کنید و در پوشه 

assets/fonts

قرار بدید.

اگه بخوام همشو توضیح بدم  زیاد میشه اگه دوستان میخان درخواست بدن که فیلم آموزشیشو تهیه کنم.

 

با تشکر.

weathericons-regular-webfont.zip

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ببخشید از api چجوری میشه در بیسیک فور اندروید استفاده کرد

هیچ نمونه ای چیزی کسی نداره.یاد بگیریم؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در 7 ساعت قبل، 101011 گفته است :

ببخشید از api چجوری میشه در بیسیک فور اندروید استفاده کرد

هیچ نمونه ای چیزی کسی نداره.یاد بگیریم؟

والا نمیدونم، زیاد بیسیک کار نکردم دوست نداشتم ، ولی فک کنم بشه استفاده کرد چون فقط اطلاعات با فرمت جیسون JSON دریافت میشن و کتابخانه جیسون هم واسه بیسیک موجوده ، بستگی به خلاقیت شما داره.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

برای هر سایتی همین کد ها استفاده میشه؟ مثلا سایت weatherunderground.com

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در 1 ساعت قبل، mr.ehsan8001 گفته است :

برای هر سایتی همین کد ها استفاده میشه؟ مثلا سایت weatherunderground.com

سلام بله تقریبا همشون تو ی قالبن ولی باید ببینید که. مقدار جیسون در‌ سرور اون سایت چی هست که با این جایگزین کنید. 

 

 

موفق باشید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...