e.printStackTrace();
}
}
核心的功能也就是 locationManager 的 requestLocationUpdates 方法,这个方法用来
更新手机端的位置信息,它格式如下,
public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
第一个参数 provider 我们传入 GPS_PROVIDER 表明我们用来更新 GPS 信息,第二
个参数 minTime 表明多久更新一次,以毫秒为单位,在这里我们传入 5 * 1000 设置为 5 秒,第三个参数 minDistance 表示多远距离后更新信息,以米为单位,最后一个参数 locationListener 用来设置一个监听器,当需要更新信息时会触发它,我们的程序可以通 过它在地理位置发生改变需要更新时来发送信息到服务端以便实时的更新,这也是本程序的 关键代码之所在。在这个监听器中,有四个方法分别表示监听位置时可能发生的状况,我们 在代码需要实现 它, 它们分别是 onLocationChanged 表示 位置 发生了改变 , onProviderDisabled 表示 GPS 被禁用了,onProviderEnabled 表示 GPS 被启用, onStatusChanged 表示状态发生改变。在我们的程序中,只对 onLocationChanged 进 行了处理,代码如下:
private final LocationListener locationListener = new LocationListener(){
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
String s = updateLocation(location);
s = phonenumber + '|' + s;//发送手机号码和经纬度
System.out.println(s); SendInfo(s); }
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
};
可以看到我们先 updateLocation,然后再 SendInfo,onLocationChanged 被调用
的时候,传进来一个 location 参数,我们通过调用它的 getLongitude()与 getLatitude()
来分别获取当前所在的经度与纬度,代码如下:
private String updateLocation(Location location) {
if (location != null) {
double longitude= location.getLongitude();
double latitude = location.getLatitude(); System.out.println("经度:" + longitude + " 纬度:" + latitude);
String s = Double.toString(longitude) + ',' + Double.toString(latitude);
return s;
} else { System.out.println("无法获取地理信息");
return null;
}
}
在这里我们返回一个 String 里面包含了经纬度来供我们的 Socket 来使用,在程序初
使化的时候,我们调用 InitSocket()方法初使化了套接字:
private void InitSocket(){
try {
ds = new DatagramSocket(LOCALPORT);
} catch (SocketException e) {
// TODO Auto-generated catch block e.printStackTrace();
}
}
初使化部分只是构造了一个 DatagramSocket 类,它是 Android 程序基于 UDP 方式
Socket 的基础,我们的数据要通过的 DatagramSocket 的 send()方法;来发送出去,它 有一个参数 DatagramPacket 表明我们要发送一个 UDP 的包。我们来看看 SendInfo() 的代码:
private void SendInfo(String s){
byte [] buf = s.getBytes(); //默认的字符集为 UTF-8
int length = buf.length;
for(int i=0; i<length; i++){
buf[i] = (byte) (buf[i] ^ 0x90); //简单进行加密
}
try {
dp = new
DatagramPacket(buf,length,InetAddress.getByName(REMOTESERVER), REMOTEPORT);
}
catch (UnknownHostException e) {
// TODO Auto-generated catch block e.printStackTrace();
}
try { System.out.println("发送地理位置...");
ds.send(dp);
}
catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("发送地理位置失败...");
e.printStackTrace();
}
}
在 Android 中,String 的 getBytes()方法默认返回的是 UTF-8 格式的字节数组,
这为我们的代码与 C++的通信带来了方便,但请注意:如果大家在开发相关程序时如果发 送的是自定义的数据格式如结构等在发送前就需要做好相关的转换,因为到 C++端后转换 比较麻烦的。在 SendInfo()里面我将“手机号码|经纬度”格式的字符串首先转换为字 节流,然后简单的进行了抑或加密,这样一定程度上保证了数据的安全性。
讲完了手机端,我们来看看 PC 端的处理部分,代码采用 MFC 来编写一个基于 Dialog |