Android – Hava Durumu(JSON)

Merhaba arkadaşlar bu yazımda JavaFx’te yaptığımız uygulamanın android uygulamasını hazırlayacağız. Api olarak yine Open Weather Api kullanacağız. Linkimiz ise şu formatta olacak ;

http://api.openweathermap.org/data/2.5/weather?q=SEHİR&appid={KEY}

Key için openweatherapi.com adresinden üyelik girişi yapmanız gerekli olacak ücretsiz zaten çok fazla sürmez üye olmanız.
Linke şehir girip açtığımızda şu şekilde bir Json verisi elde edicez;

{"coord":
{"lon":-0.13,"lat":51.51},
"weather":[
{"id":500,
"main":"Rain",
"description":"light rain",
"icon":"10n"}
],
"base":"stations",
"main":{
"temp":287.98,
"pressure":999,
"humidity":89,
"temp_min":287.55,
"temp_max":288.71
},
"wind":{
"speed":1.03,
"deg":223,
"gust":1.54
},
"rain":{
"1h":0.51
},
"clouds":{
"all":92},
"dt":1465863017,
"sys":{
"type":3,
"id":10115,
"message":0.0455,
"country":"GB",
"sunrise":1465875768,
"sunset":1465935552
},
"id":2643743,
"name":"London",
"cod":200
}

Bu Json’a göre kodlarımız şekillenecek şimdi kodlara geçersek;

public class MainActivity extends AppCompatActivity {
    private TextView txt_Sehir, txt_Sicaklik, txt_Weather, txt_Aciklama;
    private Button buton;
    private EditText editText;
    private ImageView image;
    String sehir;
//tanımlamalarımızı yaptık.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt_Sehir = (TextView) findViewById(R.id.txt_sehir);
        txt_Aciklama = (TextView) findViewById(R.id.txt_aciklama);
        txt_Sicaklik = (TextView) findViewById(R.id.txt_sicaklik);
        txt_Weather = (TextView) findViewById(R.id.txt_weather);
        buton = (Button) findViewById(R.id.button);
        editText = (EditText) findViewById(R.id.editText);
        image = (ImageView) findViewById(R.id.imageView);
//arayüzdeki componentlere atadık
        buton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                JsonParse jsonParse = new JsonParse();
                sehir = String.valueOf(editText.getText());//edit textten veriyi sehir adlı değişkene atadık
                new JsonParse().execute();//jsonParse AsynTask metodumuzu çalıştırdık.

            }
        });
    }

//AsynTask olayını başka bir yazıda açıklayacağım inşallah ama internetten araştırabilirsiniz çok güzel anlatan siteler var.
protected class JsonParse extends AsyncTask<Void, Void, Void>{
        String result_main ="";
        String result_description = "";
        String result_icon = "";
        int result_temp;
        String result_city;
        Bitmap bitImage;
        @Override
        protected Void doInBackground(Void... params) {
            String result="";
            try {
                URL weather_url = new URL("http://api.openweathermap.org/data/2.5/weather?q="+sehir+"&appid=5519df78a91952f50079565124888a76");//Url'mizi aldık
                BufferedReader bufferedReader = null;
                bufferedReader = new BufferedReader(new InputStreamReader(weather_url.openStream()));//url'yi okuyacak bufferReader'a gönderdik
                String line = null;
                while((line = bufferedReader.readLine()) != null){//satırları tek tek aldık ve ekledik
                    result += line;
                }
                bufferedReader.close();

                JSONObject jsonObject = new JSONObject(result);//string ifadeye çevirdik
                JSONArray jsonArray = jsonObject.getJSONArray("weather");//şimdi jsona bakarsanız weather isimli bir dizi var o diziyi aldık
                JSONObject jsonObject_weather = jsonArray.getJSONObject(0);//ilk indexi aldık
                result_main = jsonObject_weather.getString("main");//ilk indexin main adlı değişkenini çektik
                result_description = jsonObject_weather.getString("description");
                result_icon = jsonObject_weather.getString("icon");
//tek tek işimize yarayacakları aldık

                JSONObject jsonObject_main = jsonObject.getJSONObject("main");//main diye son kısımlarda bir değişken var onuda aldık
                Double temp = jsonObject_main.getDouble("temp");//main'in içinden sıcaklığı aldık

                result_city = jsonObject.getString("name");//en sondaki kısımdan city ismini aldık

                result_temp = (int) (temp-273);//Kelvin olduğu için Celcius'a çevirdik

                URL icon_url = new URL("http://openweathermap.org/img/w/"+result_icon+".png");//resim dosyasını burada saklıyor api adresimiz
                bitImage = BitmapFactory.decodeStream(icon_url.openConnection().getInputStream());//Android'de image olarak kullanamadığımız için bitmap formatına çevirdik

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

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            txt_Sicaklik.setText(String.valueOf(result_temp));
            txt_Weather.setText(result_main);
            txt_Sehir.setText(result_city);
            txt_Aciklama.setText(result_description);
            image.setImageBitmap(bitImage);
            super.onPostExecute(aVoid);

//tek tek gerekli olan kısımlara yerleştirdik aldığımız verileri
        }
    }
}

Programımızı çalıştırdıktan sonra nasıl görünecek derseniz ;

Screenshot_2016-06-14-03-47-03.png

Programın dosyasını buradan indirebilirsiniz.

Android – Hava Durumu(JSON)” üzerine 22 yorum

  1. zeynep

    merhaba,uygulamanız çok yararlı oldu ancak size bir sorum olucak hava durmu sonuçlarını türkçe vermesi için ne yapabilirim

    Beğen

    1. Yorumunuz için teşekkür ederim api desteği ingilizce olduğu için mecburen ingilizce sonuç alıyoruz ama google translatenin api desteği olması lazım onu araştırıp kullanabilirsiniz diye umuyorum.

      Beğen

      1. Ahmet

        Kullanıcının girdiği sayı veya kelimeleri ayrı ayrı dizilere aktarıp ekrana yansıtan programın kodları gerek bana 3 gündür uğraşdım lakin yapamadım siz yardımcı olabilir misiniz acaba ?

        Beğen

  2. Ahmet

    rozetli70@gmail.com şunu unuttum

    kullanıcı sayı girecek ve ardından yazı girecek ve bunları ayrı ayrı dizilere aktarcak mesela

    Sayı giriniz :

    5

    yazı giriniz :

    ahmet

    sayı : 5
    yazı: ahmet gibi olursa çok iyi olur hocam

    Beğen

  3. Tietz

    Hocam çok teşekkürler.
    Androidde yeni sayılırım fakat sayenizde api mantığı oturmuş oldu. Bi çok kaynağa baktım hava durumu için ama hepsi karışıktı ve key nedir nasıl/nereye yerleştirilir bir türlü anlayamamıştım. Sayenizde çok iyi anladım Allah razı olsun 🙂
    Bu tür yazılarınızın artması dileğiyle, başarılar 🙂

    Beğen

  4. Tietz

    Merhaba, bu olayı bi çok kez yaptıracagım için(farklı activitylerde) ve her bir activity de ayrı ayrı tanımlamak yerine o sınıftan nesne olusturup ornegin
    islemler ii=new islemler(sehirAdi); dedigimde sehir adını yollayacagım ve bilgileri alacağım şu şekilde ii.gelenSicaklik, ii.gelenAciklama vs. sonra da txt_aciklama.setText(ii.gelenAciklama);
    diyecegim ama olmuyor. Nasıl yapabilirim acaba?

    Beğen

      1. Tietze

        Teşekkürler bekliyorum 🙂

        Bir de her hangi bi web sitesini api olarak kullanabilme şansımız var mı_? jsoup konusunu araştırdım fakat kullanıcı adı ve şifre istenen bi site örneğin facebook(tabii apisi yokmuş gibi düşünürsek) gibi. Hesabı olanlar giriş yapıp içeriklerini görebilecek. Bu mümkün mü? kendi api ımızı yaratmak yani

        Beğen

      2. Selenium framework var, emin değilim tam olarak istediğin bu mu ama, selenium ile kullanıcı girişi yaptırabilirsin web crawler gibi butonlara tıklayabiliyorsun vs. api olmadan uygulamayı webde gezindirebilirsin.

        Beğen

Yorum bırakın