最近由于要做一个项目,其中需要一个模块,将一个APP所在位置的经纬度传到数据库供另一APP访问。先看效果
当打开第一个APP时即立即获取该手机APP的经纬度,并立即上传到服务器中并写入数据库。第二个图片是另一个APP。当第二个手机想要查看第一个手机所在位置时打开APP即可以查看第一个APP手机所在位置。该demo实现了位置跟踪,大家还可以在原来的基础上进行优化。进一步的开发。本项目后台数据库采用的是MySQL,服务器端采用的是struts2,android与服务器交互采用的是HTTP协议传输json格式的数据。APP1关键代码如下:
package com.location.activity;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import com.location.net.ConnPost;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;
public class LocationActivity2 extends Activity {
private boolean isExist=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
LocationManager locationManager;
String serviceName = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(serviceName);
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 = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 2000, 10,
new LocationListener() {
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
});
}
private void updateWithNewLocation(Location location) {
String latLongString;
TextView myLocationText;
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
Geocoder geocoder = new Geocoder(this);
List places = null;
try {
places = geocoder.getFromLocation(location.getLatitude(),
location.getLongitude(), 5);
} catch (Exception e) {
e.printStackTrace();
}
String placename = "";
if (places != null && places.size() > 0) {
placename = ((Address) places.get(0)).getAddressLine(0) + ", "
+ System.getProperty("line.separator")
+ ((Address) places.get(0)).getAddressLine(1) + ", "
+ ((Address) places.get(0)).getAddressLine(2);
}
latLongString = "纬度:" + lat + "\n经度:" + lng;
send(String.valueOf(lat),String.valueOf(lng));//此处为获得经纬度后调用send方法将经纬度采用异步任务发送给服务器
} else {
latLongString = "无法获取地理信息";
}
}
public void send(String X,String Y) {
// 显示定位结果
ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();
param.add(new BasicNameValuePair("X",Y));
param.add(new BasicNameValuePair("Y",X));
new HttpAsyncTask1(param).execute("setlocation.action");
}
public class HttpAsyncTask1 extends AsyncTask<String, Integer, String> {
ArrayList<NameValuePair> param;
public HttpAsyncTask1(ArrayList<NameValuePair> param){
this.param=param;
}
@Override
protected String doInBackground(String... params) {
//采用post方式提交数据
ConnPost connpost=new ConnPost();
String result=null;
result=connpost.conn(params[0],param);
return result;
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject jsonObject = new JSONObject(result);
String message=jsonObject.getString("message");
if(message.equals("true"))
{
Toast.makeText(LocationActivity2.this, "测试成功", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(LocationActivity2.this, "测试失败",Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
Toast.makeText(LocationActivity2.this, "网络连接异常102"+result,Toast.LENGTH_LONG).show();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
if(!isExist){
isExist=true;
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
handler.sendEmptyMessageDelayed(0,2000);
return false;
}
else{
Intent intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
System.exit(0);
}
}
return super.onKeyDown(keyCode, event);
}
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
isExist=false; //取消退出标志位
};
};
}
第二个APP关键代码如下:
package com.example.locationdemo;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import com.example.locationdemo.R;
import com.example.model.Locationmodel;
import com.location.net.ConnPost;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Point;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
/**
* MapView 是地图主控件
*/
private MapView mMapView;
private BaiduMap mBaiduMap;
private Marker mMarkerA;
Locationmodel locationmodel;
private InfoWindow mInfoWindow;
// 初始化全局 bitmap 信息,不用时及时 recycle
BitmapDescriptor bdA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
BitmapDescriptor bd = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);
mBaiduMap.setMapStatus(msu);
init();
mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
public boolean onMarkerClick(final Marker marker) {
Button button = new Button(getApplicationContext());
button.setBackgroundResource(R.drawable.popup);
final LatLng ll = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(ll);
p.y -= 47;
LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p);
OnInfoWindowClickListener listener = null;
mInfoWindow = new InfoWindow(button, llInfo, listener);
mBaiduMap.showInfoWindow(mInfoWindow);
return true;
}
});
}
public void init(){
new HttpAsyncTask1().execute("getlocation.action");
}
public void initOverlay(Locationmodel locationmodel) {
// add marker overlay
LatLng llA = new LatLng(Double.parseDouble(locationmodel.getY()),Double.parseDouble(locationmodel.getX()));
OverlayOptions ooA = new MarkerOptions().position(llA).icon(bdA).zIndex(9);
mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));
// add ground overlay
/*LatLng southwest = new LatLng(39.92235, 116.380338);
LatLng northeast = new LatLng(39.947246, 116.414977);*/
LatLng southwest = new LatLng(Double.parseDouble(locationmodel.getY()),Double.parseDouble(locationmodel.getX()));
LatLng northeast = new LatLng(Double.parseDouble(locationmodel.getY())+0.00002,Double.parseDouble(locationmodel.getX())+0.00002);
LatLngBounds bounds = new LatLngBounds.Builder().include(northeast)
.include(southwest).build();
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(bounds.getCenter());
mBaiduMap.setMapStatus(u);
}
@Override
protected void onPause() {
// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
// MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
mMapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
// MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
mMapView.onDestroy();
super.onDestroy();
// 回收 bitmap 资源
bdA.recycle();
bd.recycle();
}
public class HttpAsyncTask1 extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
//采用post方式提交数据
List<NameValuePair> param = new ArrayList<NameValuePair>();
param.add(new BasicNameValuePair("username","123"));
ConnPost connpost=new ConnPost();
String result=null;
result=connpost.conn(params[0],param);
return result;
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject jsonObject = new JSONObject(result.toString()).getJSONObject("locationmodel");
String X = jsonObject.getString("x");
String Y = jsonObject.getString("y");
locationmodel=new Locationmodel();
locationmodel.setX(X);
locationmodel.setY(Y);
initOverlay(locationmodel);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
项目源码下载