0

I am new around here but have come hoping to find the solution to a problem that I am having with my android app. The goal is to periodically update the latitude and longitude to my database. I have no problem with posting the username and password so I don't know why it isn't working with the lat/long.

I have been looking for the answer for a while now, but have been unsuccessful so far. Unfortunately, I am pretty new to coding and am getting the following error in my logcat:

03-14 08:13:58.612: E/JSON(265): 
{"tag":"login","success":1,"error":0,"uid":"513fb03e6a8e36.15977675","user":
{"name":"g","email":"g","created_at":"2013-03-12 17:46:22","updated_at":null}}n

03-14 08:13:58.842: D/dalvikvm(265): GC_FOR_MALLOC freed 3295 objects / 190800 bytes in 76ms

03-14 08:13:59.822: D/GPS Enabled(265): GPS Enabled

03-14 08:14:00.272: E/JSON(265): Invalid Requestn

03-14 08:14:00.272: E/JSON Parser(265): Error parsing data org.json.JSONException: Value Invalid of type java.lang.String cannot be converted to JSONObject

03-14 08:14:00.272: I/DashboardActivity(265): Update on geolocation success

It is probably something stupid that I am doing so it is my hope that the bug can be fixed quickly. The basic functionality that I am looking for is the app to periodically update the latitude and longitude to my database. Here is what I think is the relevant code:

Jsonparser:

public class JSONParser implements Serializable {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "/n");
        }
        is.close();
        json = sb.toString();
        Log.e("JSON", json);
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

GPStracker:

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 {
            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){
        locationManager.removeUpdates(GPSTracker.this);
    }
}

/**
 * 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();
}


public void onLocationChanged(Location location) {
}


public void onProviderDisabled(String provider) {
}


public void onProviderEnabled(String provider) {
}


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

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

}

userfunctions:

public class UserFunctions implements Serializable {

private static final long serialVersionUID = 1L;

private JSONParser jsonParser;


private static String loginURL = "URL removed";
private static String registerURL = "URL removed";
private static String LOCATION_UPDATE_URL = "URL removed";

private static String login_tag = "login";
private static String register_tag = "register";
private static String LOCATION_UPDATE_TAG = "update_location";

private String email;
private String password;

// constructor
public UserFunctions() {
  jsonParser = new JSONParser();
}

/**
* function make Login Request
* 
* @param email
* @param password
*/
public JSONObject loginUser() {
  // Building Parameters
  List<NameValuePair> params = new ArrayList<NameValuePair>();
  params.add(new BasicNameValuePair("tag", login_tag));
  params.add(new BasicNameValuePair("email", email));
  params.add(new BasicNameValuePair("password", password));
  JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
  // return json
  // Log.e("JSON", json.toString());
  return json;
}

/**
* function make update geo location
* 
* @param lon
* @param lat
* @return
*/
public JSONObject updateUserGeoLocation(String lon, String lat) {
  // Building Parameters
  List<NameValuePair> params = new ArrayList<NameValuePair>();
  params.add(new BasicNameValuePair("tag", LOCATION_UPDATE_TAG));
  params.add(new BasicNameValuePair("email", email));
  params.add(new BasicNameValuePair("password", password));
  params.add(new BasicNameValuePair("lon", lon));
  params.add(new BasicNameValuePair("lat", lat));
  JSONObject json = jsonParser.getJSONFromUrl(LOCATION_UPDATE_URL, params);
  return json;
}

/**
* function make Login Request
* 
* @param name
* @param email
* @param password
*/
public JSONObject registerUser(String name, String email, String password) {
  // Building Parameters
  List<NameValuePair> params = new ArrayList<NameValuePair>();
  params.add(new BasicNameValuePair("tag", register_tag));
  params.add(new BasicNameValuePair("name", name));
  params.add(new BasicNameValuePair("email", email));
  params.add(new BasicNameValuePair("password", password));

  // getting JSON Object
  JSONObject json = jsonParser.getJSONFromUrl(registerURL, params);
  // return json
  return json;
}

/**
* Function get Login status
*/
public boolean isUserLoggedIn(Context context) {
  DatabaseHandler db = new DatabaseHandler(context);
  int count = db.getRowCount();
  if (count > 0) {
     // user logged in
     return true;
  }
  return false;
}

/**
* Function to logout user
* Reset Database
*/
public boolean logoutUser(Context context) {
  DatabaseHandler db = new DatabaseHandler(context);
  db.resetTables();
  return true;
}

public String getEmail() {
  return email;
}

public void setEmail(String email) {
  this.email = email;
}

public String getPassword() {
  return password;
 }

public void setPassword(String password) {
  this.password = password;
}

}

dbase php file

<?php


if (isset($_POST['tag']) && $_POST['tag'] != '') {
// get tag
$tag = $_POST['tag'];

// include db handler
require_once 'include/DB_Functions.php';
$db = new DB_Functions();

// response Array
$response = array("tag" => $tag, "success" => 0, "error" => 0);

// check for tag type
if ($tag == 'login') {
    // Request type is check Login
    $email = $_POST['email'];
    $password = $_POST['password'];

    // check for user
    $user = $db->getUserByEmailAndPassword($email, $password);
    if ($user != false) {
        // user found
        // echo json with success = 1
        $response["success"] = 1;
        $response["uid"] = $user["unique_id"];
        $response["user"]["name"] = $user["name"];
        $response["user"]["email"] = $user["email"];
        $response["user"]["created_at"] = $user["created_at"];
        $response["user"]["updated_at"] = $user["updated_at"];
        echo json_encode($response);
    } else {
        // user not found
        // echo json with error = 1
        $response["error"] = 1;
        $response["error_msg"] = "Incorrect email or password!";
        echo json_encode($response);
    }
  } else if ($tag == 'register') {
    // Request type is Register new user
    $name = $_POST['name'];
    $email = $_POST['email'];
    $password = $_POST['password'];

    // check if user is already existed
    if ($db->isUserExisted($email)) {
        // user is already existed - error response
        $response["error"] = 2;
        $response["error_msg"] = "User already existed";
        echo json_encode($response);
    } else {
        // store user
        $user = $db->storeUser($name, $email, $password);
        if ($user) {
            // user stored successfully
            $response["success"] = 1;
            $response["uid"] = $user["unique_id"];
            $response["user"]["name"] = $user["name"];
            $response["user"]["email"] = $user["email"];
            $response["user"]["created_at"] = $user["created_at"];
            $response["user"]["updated_at"] = $user["updated_at"];
            echo json_encode($response);
        } else {
            // user failed to store
            $response["error"] = 1;
            $response["error_msg"] = "Error occured in Registartion";
            echo json_encode($response);
        }
    }
} else {
    echo "Invalid Request";
}
} else {
echo "Access Denied";
}

mainactivity

private void processGPSTracker() {
  if (mUserFunctions == null || !mUserFunctions.isUserLoggedIn(getApplicationContext()))
     return;

  gps = new GPSTracker(DashboardActivity.this);
  if (gps.canGetLocation()) {

     double latitude = gps.getLatitude();
     double longitude = gps.getLongitude();

     JSONObject json = mUserFunctions.updateUserGeoLocation(Double.valueOf(longitude)
           .toString(), Double.valueOf(latitude).toString());

     // check for login response
     try {
        if (json.getString(KEY_SUCCESS) != null && json.getString(KEY_SUCCESS).equals("1")) {
           Log.i("DashboardActivity", "Update on geolocation success");
        } else {
           Log.e("DashboardActivity", "Update on geolocation Failed");
        }
     } catch (JSONException e) {
        e.printStackTrace();
     }

     // \n is for new line
     Toast.makeText(getApplicationContext(),
           "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG)
           .show();

  } else {
     // can't get location
     // GPS or Network is not enabled
     // Ask user to enable GPS/network in settings
     gps.showSettingsAlert();
  }
  }

Any help would be greatly appreciated. I would like to be able to move on and finish this app.

user1255632
  • 17
  • 1
  • 6

2 Answers2

0

Change

JSONObject json = mUserFunctions.updateUserGeoLocation(Double.valueOf(longitude)
       .toString(), Double.valueOf(latitude).toString());  

To

JSONObject json = mUserFunctions.updateUserGeoLocation(Double.toString(longitude),
        Double.toString(latitude));
Hoan Nguyen
  • 18,033
  • 3
  • 50
  • 54
  • Hey there. Thanks for your reply and attempt to help. Unfortunately I get the same error after making that change. – user1255632 Mar 20 '13 at 01:09
0

I think it may be the new line append in your while loop. The first line of the log appears to show an 'n' character outside the closing bracket of the JSON String which would throw the JSON Exception when parsing

DrJimbo
  • 45
  • 1
  • 7
  • Good call. I was missing a "\" before that "n". It still runs the same error though. – user1255632 Mar 20 '13 at 03:01
  • what happens when you take out the new line character all together? – DrJimbo Mar 20 '13 at 03:17
  • Just seen this: [link](http://stackoverflow.com/questions/13368739/jsonexception-value-of-type-java-lang-string-cannot-be-converted-to-jsonobject) which suggests there may be an invisible character at position 0 of the StringBuilder. try `json = sb.substring(1);` – DrJimbo Mar 20 '13 at 03:26
  • in `getJSONFromUrl()` in your `JSONParser` class. Replace the line: `json = sb.toString();` – DrJimbo Mar 20 '13 at 16:38
  • That causes a fatal error. I even tried changing the number one by one up to 4. – user1255632 Mar 20 '13 at 19:29