0

I was trying to develop an android app which would get current location and send it to a server. When I tested it with a simulator, it always showed lat and long as '0' and on testing it on a phone, I am getting the settings alert box to turn the GPS ON always,even if it is 'ON'. Below is the code I tried..

public class Sample extends Activity {

    GPSTracker gps;
    EditText editTextAddress, editTextPort; 
    Button buttonConnect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);
        editTextAddress = (EditText)findViewById(R.id.address);
        editTextPort = (EditText)findViewById(R.id.port);
        buttonConnect = (Button)findViewById(R.id.connect);

        buttonConnect.setOnClickListener(new View.OnClickListener() {

            double latitude;
            double longitude;

            @Override
            public void onClick(View v) {
                gps = new GPSTracker(Sample.this);

                if(gps.canGetLocation()) {
                    latitude = gps.getLatitude();
                    longitude = gps.getLongitude();

                    Toast.makeText(
                            getApplicationContext(),
                            "Your Location is -\nLatitude: " + latitude + "\nLongitude: "
                                    + longitude + "\nLocation Sent", Toast.LENGTH_LONG).show();
                } else {
                    gps.showSettingsAlert();
                }

                MyClientTask myClientTask = new MyClientTask(
                        editTextAddress.getText().toString(),
                        Integer.parseInt(editTextPort.getText().toString()),latitude, longitude);
                myClientTask.execute();
            }
        });
    }
public class MyClientTask extends AsyncTask<Void, Void, Void> {

        String dstAddress;
        int dstPort;
        double latitude;
        double longitude;

        MyClientTask(String addr, int port, double lat, double lon){
            dstAddress = addr;
            dstPort = port;
            latitude = lat;
            longitude = lon;
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            Socket socket = null;

            String lat1 = String.valueOf(latitude);
            String lon1 = String.valueOf(longitude);
            String msg = lat1 + lon1;

            try {
                socket = new Socket(dstAddress, dstPort);

                OutputStream outputStream;

                    outputStream = socket.getOutputStream();
                PrintStream printStream = new PrintStream(outputStream);
                printStream.print(msg);

                printStream.close();

            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();

            }finally{
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }


    }

}

And My GPS tracker code is as below

public class GPSTracker extends Service implements LocationListener{

    private final Context context;

    boolean isGPSEnabled = false;
    boolean isNetworkEnabled = false;
    boolean canGetLocation = false;

    Location location;

    double latitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 5;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 35 * 1;

    protected LocationManager locationManager;

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

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

            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if(!isGPSEnabled && !isNetworkEnabled) {

            } else {
                this.canGetLocation = true;

                if (isNetworkEnabled) {

                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    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(locationManager != null) {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                            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;
    }

    public void showSettingsAlert() {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);

        alertDialog.setTitle("GPS is settings");

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

        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                context.startActivity(intent);
            }
        });

        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        alertDialog.show();
    }

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

    }

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

    }

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

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }

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

}

Kindly someone help me in identifying the problem.Thanks in advance.

Learner
  • 483
  • 8
  • 17

2 Answers2

0

The issue is NOT your code (well not 'yet' at least) the issue is that the Emulator is working as designed.

The reason for this is that the Emulator defaults to 0,0 for Lat/Lon. You will need to adjust the lat/lon yourself manually. for testing.

from: https://stackoverflow.com/a/2279827

To do so...

from your command line telnet localhost 5554

then geo fix <longitude value> <latitude value>

If you have multiple VMs running, they can have different Ports, and they will be listed in the name of the emulator (so 5554 to start, then most likely 5555, 5556, etc.)

Community
  • 1
  • 1
mawalker
  • 2,072
  • 2
  • 22
  • 34
  • I manually gave lat and long values from DDMS. And Testing on a real phone, gives me the settings alert always. – Learner Dec 24 '15 at 04:11
  • Your 'high level' problem is that you don't have a single logcat statement anywhere in those files, You should always have a `Log.V("ClassName","methodName() Called.");` in every method, that way you can tell what is happening for debugging. And then 'Log.d()' for where you are having problems. Because as is, you are just seeing a result, and have no idea as to what is happening before that. – mawalker Dec 24 '15 at 04:25
  • Okay will try it . Since I am beginning to learn android I am not aware of logs and ways of debugging. – Learner Dec 24 '15 at 04:27
  • http://gabesechansoftware.com/location-tracking/ this is a method of finding latitude and longitude that I found to work very well. – A.Sanchez.SD Dec 24 '15 at 04:28
0

Are your sure this.canGetLocation = true; in getLocation function call before you check if(gps.canGetLocation()) { in onClick action. Could you make a break point and debug on this.canGetLocation = true; to see what called first and what called after that.

Khang Tran
  • 467
  • 5
  • 16
  • I have added a break point at line this.canGetLocation=true; but how to see the log. I am not aware of debugging. I tried pressing F5/F6 but where should I see what called first..Please guide. – Learner Dec 24 '15 at 04:57