i am trying to submit user registration form in android with current location. I am new to android and java development. when i try to access myLat and myLan of the onLocationChanged method in my name value pairs code , it is unable to find both the variables. How can i access both the variables in my name value pair code.
package com.imran;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import com.google.android.gcm.GCMRegistrar;
import com.google.android.maps.MyLocationOverlay;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.app.Activity;
import android.content.Context;
public class Register extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
final EditText email_id = (EditText) findViewById(R.id.email_id) ;
final EditText name = (EditText) findViewById(R.id.name);
final EditText password = (EditText) findViewById(R.id.password);
Button button = (Button) findViewById(R.id.button1) ;
//generate GCM id
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, "12356");
} else {
String TAG = null;
Log.v(TAG, regId);
}
//generate GCM id ended
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//get current location
LocationManager manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
LocationListener listner = new LocationListener() {
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
double myLonDouble = location.getLongitude();
final String myLon = Double.toString(myLonDouble);
double myLatDouble = location.getLatitude();
final String myLat = Double.toString(myLatDouble);
}
};
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listner);
//end get current location
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//postData();
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://xyz.com/folder/register.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("email", email_id.getText().toString()));
nameValuePairs.add(new BasicNameValuePair("name", name.getText().toString()));
nameValuePairs.add(new BasicNameValuePair("password", password.getText().toString()));
nameValuePairs.add(new BasicNameValuePair("regid", regId));
nameValuePairs.add(new BasicNameValuePair("uid", "2"));
nameValuePairs.add(new BasicNameValuePair("lat",myLat ));
nameValuePairs.add(new BasicNameValuePair("lon",myLon));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
//Toast.makeText(this, resId, duration)
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
});
}
}
You are having problems with the scope of your variables. The myLatDouble and myLon Double that you are initializing only exist within the onLocationChanged method where they are created. You would have to declare them in a different place so that they do not go out of scope when you try to access them or you would have to pass them into the nameValuePairs code as an argument
You should probably study up on scope and member variables. The thing is, you can't declare one thing in one method then attempt to access it from another method.
So, we declare that thing as a member variable, and define it in one method, then it can be used in another method.
Like so (I've marked my comments with
**
):