6 Ekim 2015 Salı

Android ile REST Erişimi ve Konum Bulma Uygulaması

rest android att
           Android uygulamalarında konuma göre (GPS, NETWORK) hava durumu nasıl çekilir.




Başla


Uygulama çalıştırıldığında ilk önce konum bilgisi veren hizmetlerin (GPS vb.) kullanılabilir olup olmadığı kontrol ediliyor. Kullanılabilir ise konum bilgisi hava durumu servisine postalanıyor ve geri dönen JSON veri işlenerek ekrana bastırılıyor. Eğer konum hizmetleri kapalı ise uyarı veriyor ve sizden konum ayar sayfasına gitmenizi istiyor.

Hava durumunu coğrafi koordinatlara göre çektik.
Daha fazlası için   openweathermap.org


android hava
Res1. - Uygulamanın ekran görüntüsü

Adım 1 :

Gerekli İzinleri Verin

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gurkan0791.weatherlikeapp" >

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>



Adım 2 :

Arayüz


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:background="@drawable/background_image"
    >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textViewWeather"
        android:background="#ffa72a"
        android:layout_alignTop="@+id/textView3"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/myImageView"
        android:layout_above="@+id/textViewCountry"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Country"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="77dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="City"
        android:id="@+id/textView2"
        android:layout_marginTop="30dp"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Weather"
        android:id="@+id/textView3"
        android:layout_below="@+id/textView2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="29dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textViewCountry"
        android:layout_alignTop="@+id/textView"
        android:layout_alignLeft="@+id/textViewWeather"
        android:layout_alignStart="@+id/textViewWeather"
        android:background="#ffa72a" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/textViewCity"
        android:layout_alignTop="@+id/textView2"
        android:layout_alignLeft="@+id/textViewWeather"
        android:layout_alignStart="@+id/textViewWeather"
        android:background="#ffa72a" />


</RelativeLayout>


Adım 3 :

Rest Service' den Konum Bilgisine Göre Verileri Çekin. Parse İşlemi Yapın ve Arayüzde Gösterin.

package com.example.gurkan0791.weatherlikeapp;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    //json veri sabitleri
    private static final String MAIN = "main";
    private static final String TEMP = "temp";
    private static final String SYS ="sys";
    private static final String COUNTRY ="country";
    private static final String CITY ="name";

    private TextView myTextView;
    private TextView myTextViewCountry;
    private TextView getMyTextViewCity;
    private ImageView myImageView;

    private  static GetWeather getWeather = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myTextView = (TextView) findViewById(R.id.textViewWeather);
        myTextViewCountry = (TextView) findViewById(R.id.textViewCountry);
        getMyTextViewCity = (TextView) findViewById(R.id.textViewCity);
        myImageView = (ImageView) findViewById(R.id.myImageView);


        //async metodu çalıştır
        getWeather = new GetWeather();
        getWeather.execute();
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (getWeather == null) {
            getWeather = new GetWeather();
            getWeather.execute();
        }
    }

    public class GetWeather extends AsyncTask<Void,Void,List<Object>> {

        //süren işlemi göster
        private ProgressDialog loading;

        //json veri tiplerini belirle
        private JSONObject jsonReader ;
        private JSONObject main ;
        private JSONArray weather;
        private JSONObject sys;

        //json istenen verileri array at
        private List<Object> weatherList;

        //konum (GPS, NETWORK) servisi
        private GPSTracker gpsTracker;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            gpsTracker = new GPSTracker(MainActivity.this);
            weatherList = new ArrayList<Object>();
            loading = ProgressDialog.show(MainActivity.this,"Please Wait...",null,true,true);
        }

        @Override
        protected List<Object> doInBackground(Void... params) {

            //tamponlu okuyucu
            BufferedReader bufferedReader = null;

                double latitude = 0;
                double longitude = 0;
                //konum bilgisi alınabiliyor mu?
                if(gpsTracker.canGetLocation()) {
                    //enlem boylam bilgisini çek
                     latitude =  gpsTracker.getLatitude();
                     longitude = gpsTracker.getLongitude();
                    try {

                        //json servisi için hedef url
                        URL url = new URL("http://api.openweathermap.org/data/2.5/weather?lat="+latitude+"&lon="+longitude+"&units=metric");
                        //URL url = new URL("http://api.openweathermap.org/data/2.5/weather?q=Antalya&units=metric");
                        //java .net sınıfına ait http sağlayıcı
                        HttpURLConnection con = (HttpURLConnection) url.openConnection();

                        StringBuilder sb = new StringBuilder();
                        bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));

                        String json;
                        while((json = bufferedReader.readLine())!= null){
                            sb.append(json+"\n");
                        }

                        //okunan veriyi al
                        jsonReader = new JSONObject(sb.toString().trim());

                        //verideki main anahtarı bilgilerini tut ve temp değerini listeye ekle
                        main = jsonReader.getJSONObject(MAIN);
                        weatherList.add(main.getString(TEMP));

                        //weather anahtarının gösterdiği diziyi al
                        weather = jsonReader.optJSONArray("weather");
                        //dizinin ilk elemanını çek
                        JSONObject jsonObject = weather.getJSONObject(0);
                        //hava durumunu resim olarak göstermek için weather.icon bilgisini çek ve url' ye ata
                        //url' ye ulaş ve bitmap olarak listeye ekle
                        URL url1 = new URL("http://openweathermap.org/img/w/"+jsonObject.getString("icon")+".png");
                        Bitmap bmp = BitmapFactory.decodeStream(url1.openConnection().getInputStream());
                        weatherList.add(bmp);

                        //aynı şekilde ülke kodunu çekmek için
                        sys = jsonReader.getJSONObject(SYS);
                        weatherList.add(sys.getString(COUNTRY)); //get(2)
                        //şehir adını çekmek için
                        weatherList.add(jsonReader.getString(CITY)); // GET(3)

                        // diziyi onPostExecute metoduna gönder
                        return weatherList;

                    }catch (IOException e) {
                        e.printStackTrace();
                        return  null;
                    }
                    catch (JSONException e) {
                        e.printStackTrace();
                        return null;
                    }
                }else{
                    /*
                    can't get location
                    GPS or Network is not enabled
                    Ask user to enable GPS/ network in settings

                    alınmıyorsa onPostExecute null döndür
                    */

                    return null;
                }
        }

        @Override
        protected void onPostExecute(List<Object> s) {
            super.onPostExecute(s);
            loading.dismiss();

            //konum bilgisi alınamadıysa android setting activity' sine gönder
            if (s == null) {
                getWeather = null;
                gpsTracker.showSettingsAlert();

            }else {
                //konum bilgisi alındıysa dizideki verileri context' e  bas
                myTextView.setText((CharSequence) s.get(0).toString() + " \u00b0"); // ° Derece sembolü
                myTextViewCountry.setText((CharSequence) s.get(2));
                getMyTextViewCity.setText((CharSequence) s.get(3));
                myImageView.setImageBitmap((Bitmap) s.get(1));

                //konum bilgisini toast a basmak isterseniz
                if (gpsTracker.canGetLocation()) {
                    double latitude = gpsTracker.getLatitude();
                    double longitude = gpsTracker.getLongitude();

                    Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
                } else {
                    gpsTracker.showSettingsAlert();
                }
                //myWebView.loadUrl("http://openweathermap.org/img/w/03d.png");
            }
            gpsTracker.stopUsingGPS();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}



Adım 4 :

Konum Belirlemek İçin Gerekli Servisi Yazın.

package com.example.gurkan0791.weatherlikeapp;

/**
 * Created by gurkan0791 on 05.10.2012.
 * bu bir copy-paste sınıftır.
 */
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                //ilk önce network metoduyla konum alıyor.
                //ama GPS açıksa network yerine gps yükleniyor.
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

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

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            try {
                locationManager.removeUpdates(GPSTracker.this);

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

    /**
     * Function to get latitude
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * Function to show settings alert dialog
     * On pressing Settings button will lauch Settings Options
     * */
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");

        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });

        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

}


Bitir

Hiç yorum yok:

Yorum Gönder