调用百度地图实现位置跟踪程序android APP demo源代码分享

最近由于要做一个项目,其中需要一个模块,将一个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();
			}
		}
	}
}
项目源码下载

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值