Как отправить GPS-координаты в другой класс - PullRequest
1 голос
/ 28 февраля 2012

Я работаю над организацией своего приложения, и мне нужна помощь в отправке координат GPS в другой класс, который отправляет их в базу данных.Когда кнопка отправки в основном действии нажата, она начинает намерение, которое начинает LocationActivity.Оттуда я хотел бы отправить координаты GPS в SendActivity, который отправляет их в базу данных (через программу PHP).Как отправить координаты в SendActivity?Я комментирую раздел, где я пытался, но он не работает.Любая помощь будет оценена.Спасибо!

LocationActivity.java:

public class LocationActivity extends Activity{

    private LocationManager locManager;
    private LocationListener locListener;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startLocation();
    }

    private void startLocation()
    {   
        //get a reference to the LocationManager
        locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        //checked to receive updates from the position
        locListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                SendActivity.send(location); //What to do here?
            }
            public void onProviderDisabled(String provider){
                //labelState.setText("Provider OFF");
            }
            public void onProviderEnabled(String provider){
                //labelState.setText("Provider ON ");
            }
            public void onStatusChanged(String provider, int status, Bundle extras){
                //Log.i("", "Provider Status: " + status);
            }
        };

        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
    }
}

SendActivity.java:

public class SendActivity extends Activity {


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    void send(Location loc)
    {
        Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));
         String lat = String.valueOf(loc.getLatitude()); 
         String lon = String.valueOf(loc.getLongitude());

        SharedPreferences shared = getSharedPreferences("PEOPLE_PREFERENCES", MODE_PRIVATE);
        final String usr_id2 = shared.getString("USR_ID", "none");

        if (lat != "0" && lon != "0")   
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://example.com/test/example.php");
         try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
           nameValuePairs.add(new BasicNameValuePair("lat", lat)); 
           nameValuePairs.add(new BasicNameValuePair("lon", lon));
           nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
         } 
         catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         } 
         catch (IOException e) {
             // TODO Auto-generated catch block
         }

        }
    }
}

Ответы [ 3 ]

0 голосов
/ 28 февраля 2012

Существует множество способов отправки местоположения между классами.

1) отправка через приемник вещания.

2) сохраните его в некоторой переменной / настройках и прочитайте его из другого действия.

3) реализовать обработчик и передать сообщение / отправить сообщение.

4) пройти через намерения / поставить доп.

и множество других способов.

0 голосов
/ 28 февраля 2012

Нет необходимости создавать Activity, чтобы получить LatLong .. Ниже приведен класс для получения LatLong:

class UpdateGeoLocation {
    LocationManager locationManager;
    String provider;
    double lat, lng;
    Location location;
    Location returnlocation;
    Context context;

    public static String locationdetails = null;

    public UpdateGeoLocation(Context context) {
        this.context = context;     
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        provider = locationManager.getBestProvider(criteria, true);
        location = locationManager.getLastKnownLocation(provider);
        returnlocation = locationManager.getLastKnownLocation(provider);
    }

    public Location getLocation(Location location) {

        if (location != null) {
            Log.d("one", "IF getLocation :: " + location);
            returnlocation.setLatitude(location.getLatitude());
            returnlocation.setLongitude(location.getLongitude());

        } else {
            try {
                listenForLocation(provider);
            } catch (NullPointerException nullPointerException) {
                nullPointerException.printStackTrace();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        return returnlocation;

    }

    private void listenForLocation(String providerName) {
        locationManager.requestLocationUpdates(providerName, 0, 0,
                locationListener);
        if (location != null) {
            location.getLatitude();
            location.getLongitude();
            getLocation(location);
        } else {
            // Toast.makeText(context, "location null",
            // Toast.LENGTH_SHORT).show();
        }
    }

    private final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            returnlocation.setLatitude(location.getLatitude());
            returnlocation.setLongitude(location.getLongitude());
        }

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {
        }

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

}


Following is the Activity where I used above class to get LatLong :

Location location = null;

OnCreate() :

try {
    Looper.prepare();
    if (null != (location = requestForLocation())) {
        if (null != location) {
            Log.d("one", "Location :: " + location.getLatitude());
            Log.d("one", "Location  LATLONG :: " + location.getLongitude());

                        //Use intent or bundle here to send LatLong to other activities..


        } else {
            Log.d("one", "Location not found:: ");

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


private Location requestForLocation() {
    return new UpdateGeoLocation(MonsterLoginActivity.this)
    .getLocation(null);
}
0 голосов
/ 28 февраля 2012

Вы действительно хотите, чтобы SendActivity была совершенно новым видом деятельности, или вы просто хотите, чтобы класс реализовал функцию Send?Если это последнее, вы можете просто сделать его обычным классом, а не делать его активностью.

Если вы хотите, чтобы SendActivity была новой деятельностью (с новым экраном активности), вы бы запустили ее с новым намерением.и добавьте координаты gps в комплект намерений.

Что-то вроде

public void onLocationChanged(Location location) {
   //SendActivity.send(location); //What to do here?
   Intent i = new Intent(this, SendActivity.class);
   float lat = ... //calculate lat and lon here
   float lon = ...
   i.putExtra("latitude", lat);
   i.putExtra("longitude", lon);
   this.startActivity(i);
}

В SendActivity:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    float lat = getIntent().getFloatExtra("latitude");
    float lon = getIntent().getFloatExtra("longitude");
}

Но не имеет смысла просто вызывать функцию внутри другого действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...