Android-клиент GPS отправляет координаты на сервер, только если в пределах области - PullRequest
0 голосов
/ 11 января 2012

Я хотел бы поделиться тем, что я подготовил до сих пор, и в то же время попросить помощи и предложений относительно следующих необходимых шагов кодирования.

Основываясь на кратких и базовых обучающих материалах по Java, Android и онлайн-ресурсам, я разработал следующий теоретический код, имеющий следующие цели (теоретический, потому что я еще не тестировал его):

  1. явно выберите поставщика GPS (GPS / сотовый / WiFi), чтобы узнать местоположение телефона
  2. отображает текущее местоположение в текстовом представлении
  3. подключается к серверу через 3g
  4. отправляет серверу широту, долготу и временную метку как можно чаще

Ниже код, который я подготовил:

 import android.app.Activity;
 import android.content.Context;
 import android.location.Criteria;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.os.Bundle;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 import android.widget.TextView;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.Socket;
 import java.net.UnknownHostException;

 public class GpsActivity extends Activity {

private LocationManager lm;
private LocationListener locationListener;
public static TelephonyManager tm;
public static TextView tv;
public static Socket s;
public static PrintWriter out;


/**
 * Called when the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 /**
  * retrieve a reference to provide access to information about the telephony services on the device     
  */
    tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    setContentView(R.layout.main);
 /**
  * retrieve a reference to provide access to the system location services    
  */              
lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);    


/**
 * explicitly select the GPS provider, create a set of Criteria and let android choose the best provider available
 */

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = lm.getBestProvider(criteria, true);
/**
 * This method takes in four parameters:
provider: The name of the provider with which you register
minTime: The minimum time interval for notifications, in milliseconds.
minDistance: The minimum distance interval for notifications, in meters.
listener: An object whose onLocationChanged() method will be called for each location update.
 */
locationListener = new MyLocationListener();
lm.requestLocationUpdates(provider, 0, 0, locationListener);

tv = (TextView) findViewById(R.id.textView1);
tv.setText("I currently have no Location Data.");

}

/**
 * Connects the Android Client to a given server
 * 
 * @param name
 *            The name of the remote server
 * @param port
 *            Port number to connect to at the remote server.
 * @throws IOException
 * @throws UnknownHostException
 */
public static void connect(String name, int port)
        throws UnknownHostException, IOException
{

    s = new Socket(name, port);
    out = new PrintWriter(s.getOutputStream(), true);
}

/**
 * Sends a string message to the server.
 * 
 * @param msg
 *            The message to be sent.
 * @throws IOException
 */
public static void send(String msg) throws IOException
{
    if (!s.isClosed() && msg != null)
    {
        out.println(msg);
        if (msg.contains("CMD_QUIT"))
        {
            out.close();
            s.close();
            Log.i("ServerConnection", "Client Disconnected.");
        }
    }
}


private class MyLocationListener implements LocationListener{

    @Override
    public void onLocationChanged(Location loc) {
        String txt = "Latitude:" + loc.getLatitude() + "/nLongitude:" + loc.getLongitude();
        Log.i("GeoLocation", "My current location is:\n " + txt);
        tv.setText("My current location is:\n" + txt);
        String msg = loc.getLongitude() + "\n" + loc.getLatitude() + "\n"
           + loc.getTime();

    try
        {
        connect("IP address", 27960);
        send("CMD_HELLO");
        send(msg);
        send("CMD_QUIT");
        } catch (UnknownHostException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }



    @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

    }

}

}

ПОЖАЛУЙСТА, ПОМОГИТЕ

  1. Просьба прокомментировать, если приведенный выше код будет соответствовать указанным четырем целям.
  2. КАК МОЖНО СООТВЕТСТВОВАТЬ МОЮ 5-ую цель ----- Я хочу, чтобы приложение для Android запускало подключение к серверу и отправляло широту и долготу только тогда, когда телефон (используемый в автомобиле) находится в зоне дороги ( скажем, площадь 1 км х 30 м). Он постоянно прослушивает свое местоположение, но начнет отправлять на сервер, как только он входит в область, и будет непрерывно отправлять и остановится только после того, как выйдет из области.

1 Ответ

0 голосов
/ 11 января 2012
  1. Нет.Вы просите ОС предоставить лучшего поставщика.Это будет объяснено lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
  2. не будет работать, потому что вы не можете обновить текстовое представление от слушателя.Взгляните на android.OS.Handler
  3. , технически вы встречаете это, но вам лучше будет использовать JSON или XML по HTTP, а не придумывать собственный протокол.
  4. Да

Для 5, создайте два местоположения, местоположение NorthWest и местоположение SouthEast, которые представляют ваш ящик.В вашем методе onLocationChanged сравните новое местоположение с углами, чтобы (l.lat> se.lat && l.lat nw.lon), где "l" - это самое новое местоположение от обратного вызова, "se" - это юго-восточный угол вашей границы, а "nw" - северо-западный угол вашей границы.Если он удовлетворяет вышеуказанным 4 условиям, вы отправляете его на сервер.

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