1

I'm trying to make a simple program to perform distance calculations that will be shown in listview. I use GPSTracker from androidhive, and calling latitude and longitude fo my List Activity

public class GPSTracker extends Service implements LocationListener {

private final Context mContext;
boolean isGPSEnabled =false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location;
double latitude;
double 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);
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if(!isGPSEnabled&& !isNetworkEnabled){
            //no network enable
        }else {
            this.canGetLocation = true;
            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(isGPSEnabled){
                if(location == null){
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if(location != null){
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
        }

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

public void stopUsingGPS(){
    if(locationManager != null){
        locationManager.removeUpdates(GPSTracker.this);

    }
}

public double getLatitude(){
    if(location != null){
        latitude = location.getLatitude();
    }
    return latitude;
}

public double getLongitude(){
    if(location != null){
        longitude = location.getLongitude();

    }
    return longitude;
}

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) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
}

And My List Activity

public class Mobil extends ListFragment implements LocationListener{
GPSTracker gps;
private static final String url = "http://10.0.2.2/tambalban/car.php";  

JSONArray tambalban = null;
ArrayList<HashMap<String, String>> listMobil = new ArrayList<HashMap<String, String>>();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);             
    new getJSONData().execute();        
}

public class getJSONData extends
        AsyncTask<String, Integer, ArrayList<HashMap<String, String>>> {

    @Override
    protected ArrayList<HashMap<String, String>> doInBackground(
            String... params) {

        JSONParser jParser = new JSONParser();
        JSONObject json = jParser.getJSONFromURL(url);

        gps = new GPSTracker(getActivity()); // is it right calling from GPSTracker?    
        double lat_user = gps.getLatitude(); // get latitude, right?
        double lng_user = gps.getLongitude();
        System.out.println("lat_user : "+lat_user+""); // print in logcat return 0.00
        System.out.println("lng_user : "+lng_user+"");// print in logcat return 0.00    

        try {
            tambalban = json.getJSONArray(TAG_TAMBALBAN);

            for (int i = 0; i < tambalban.length(); i++) {
                JSONObject mtr = tambalban.getJSONObject(i);

                 String id_tb = mtr.getString(TAG_ID);
                 String name_tb = mtr.getString(TAG_NAMA);
                 String address_tb = mtr.getString(TAG_ALAMAT);
                 String telp_tb = mtr.getString(TAG_TELP);
                 String lat = mtr.getString(TAG_LAT);
                 String lng = mtr.getString(TAG_LNG);

                 double lat_tujuan = Double.parseDouble(lat);
                 double lng_tujuan = Double.parseDouble(lng);
                         double distance = hitungJarak(lat_user, lng_user, lat_tujuan, lng_tujuan);
                 distance = RoundDecimal(distance, 2);
                 String dist = Double.toString(distance)+" km";

                 HashMap<String, String> a = new HashMap<String, String>();

                a.put(TAG_ID, id_tb);
                a.put(TAG_NAMA, name_tb);
                a.put(TAG_ALAMAT, address_tb);
                a.put(TAG_TELP, telp_tb);
                a.put(TAG_LAT, lat);
                a.put(TAG_LNG, lng);
                a.put(TAG_JARAK, dist);

                listMobil.add(a);                       
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return listMobil;

    }

private double RoundDecimal(double distance, int i) {
        BigDecimal bd = new BigDecimal(distance);
        bd = bd.setScale(i, 6);         
        return bd.doubleValue();
    }


private double hitungJarak(double lat_user, double lng_user,
            double lat_tujuan, double lng_tujuan) {
    double dist;
    double radius = 6371;
    double dLat = Math.toRadians(lat_tujuan - lat_user);
    double dLon = Math.toRadians(lng_tujuan- lng_user);
    double a = Math.sin(dLat/2) * Math.sin(dLat /2)
            + Math.cos(Math.toRadians(lat_user)) * Math.cos(Math.toRadians(lat_tujuan)) 
            * Math.sin(dLon/ 2) * Math.sin(dLon/2);

    double c = 2 * Math.asin(Math.sqrt(a));
    double valueResult = radius * c;
    double km = valueResult/1;
    DecimalFormat newFormat = new DecimalFormat("####");
    int kmInDec = Integer.valueOf(newFormat.format(km));

    dist = radius * c;

        return dist;
    }


    @Override
    protected void onPostExecute(
            ArrayList<HashMap<String, String>> listMobil) {
        // TODO Auto-generated method stub
        super.onPostExecute(listMobil);
        ListAdapter adapter = new SimpleAdapter(getActivity(), listMobil,
                R.layout.list_item, new String[] { TAG_NAMA, TAG_ALAMAT, TAG_JARAK },
                new int[] { R.id.namatb, R.id.alamattb,R.id.jarak });
        setListAdapter(adapter);        
    }

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    return inflater.inflate(R.layout.list_fragment, container, false);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub

    super.onListItemClick(l, v, position, id);
    String pilih = getListAdapter().getItem(position).toString();
    Toast.makeText(getActivity(),
            pilih,
            Toast.LENGTH_LONG).show();



    Intent i = new Intent(getActivity(), DetailDaftar.class);
    Bundle bundle = new Bundle();
    bundle.putString("Selected", pilih);


    i.putExtras(bundle);
    startActivity(i); 
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}   
}

I check using Sytem.out.println, both latitude and longitude return 0.00. Am I wrong with calling current Location? Thanks you for any help.

Bambang
  • 63
  • 1
  • 6
  • Have you added permission into manifest.xml file ` ` – M D Feb 08 '14 at 04:52
  • thanks mate for your response, I have added permission in manifest before but it still not getting lat and lng – Bambang Feb 08 '14 at 14:12
  • @Bambang: Maybe you have enabled only GPS option and disabled network and wifi option and you trying to access GPS location indoor. If you do so you will only get 0.0 for both. Check this out! – TheDevMan Sep 29 '14 at 06:05

5 Answers5

1

You should create your GPSTracker gps object outside your AsyncTask try like:

 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);    
gps = new GPSTracker(getActivity()); // is it right calling from GPSTracker?             
new getJSONData().execute();        

}

And also add required permission into your manifest.xml file:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
M D
  • 47,665
  • 9
  • 93
  • 114
  • Thanks mate for your respon, sure I have added those permissions. I try to move the GPSTracker in onCreate but still not getting lat and lng – Bambang Feb 08 '14 at 14:57
0

your GPSTracker class will return current location latitude and longitude. I have already checked and it is returning lat/long values. In second part I am not getting, what you are trying to do with json but if you want to get latitude longitude in another activity then simply instantiate GPSTracker class like

Inside activity

GPSTracker tracker;

and inside onCreate method

tracker=new GPSTracker(this);

and another one thing ypu can not print or log any statement in doInBackground() method because it will run in background only. Try to toast your output in onPostExecute() method

M D
  • 47,665
  • 9
  • 93
  • 114
HemangNirmal
  • 621
  • 1
  • 8
  • 24
0

If you are using emulator for testing, then you should do the following:

1.In your editor (I assume you are using Eclipse) go to

Window -> Open Perspective -> Show View -> Emulator Control.

2 There you would see two editable textbox with tags 'latitude' and 'longitude'.

3 Set the values appropriately and click send.

Now your emulator has the values set by you.

Niranjan
  • 15
  • 7
  • I never success adding lat and lng with DDMS, I use putty to enter telnet commands, Do you any ideas for this ? I also think my emulator maybe error – Bambang Feb 08 '14 at 15:07
0

This is my code for getting Longitude and Latitude , it works great for me

public void setLocation() { 
            LocationManager LM;

    LM = (LocationManager) CurrentContext
            .getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
            // adjust ur criteria with ur desired features

    provider = LM.getBestProvider(criteria, true);

    try {

        LM.requestLocationUpdates(provider, 1000, 1, this);

        if (LM != null) {
            Loc = LM.getLastKnownLocation(provider);

            if (Loc != null) {
                userLocation = new Location("");

                userLocation.setLatitude(Loc.getLatitude());
                userLocation.setLongitude(Loc.getLongitude());

            }
        }

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

    LM.removeUpdates(this);
}
Menna-Allah Sami
  • 580
  • 4
  • 19
  • Hi Mate, it still not fix my problem, I curious about ListFragment, is it right when I using listFragment instead Activity – Bambang Feb 16 '14 at 15:04
  • It doesn't matter either you use activity or ListFragment Could you print the logcat or notify me with your error ? – Menna-Allah Sami Feb 18 '14 at 09:42
0

Use this code

 public class LocationUpdateService extends Service {


        private LocationManager _locationManager;
        private boolean _gpsEnabled,_networkEnabled;
        @Override 
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }



        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();
            _locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            _gpsEnabled = _locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
            _networkEnabled = _locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        }

        public void onStart(Intent intent, int startId) {

            Log.e("onStart","onStart");

            if( _gpsEnabled ) {
                _locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        1000, 0, locationListener);
            } else if ( _networkEnabled ){
                _locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                        1000, 0, locationListener);
            }

        };




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

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onLocationChanged(final Location location) {
            final Location currentLocation = location;

            Log.e("onLocationChanged", " " + currentLocation);
            _locationManager.removeUpdates(locationListener);

            Toast.makeText(LocationUpdateService_2.this, "Location lat "+currentLocation.getLatitude()+ " long "+currentLocation.getLongitude() , Toast.LENGTH_LONG).show();

    }

    };
Hradesh Kumar
  • 1,765
  • 15
  • 20