如何将百度地图API获取经纬度写成公有方法?
原问题来自于CSDN问答社区:http://ask.csdn.net/questions/636
问题描述:
我使用的是百度地图API来获取经纬度坐标。但是我的程序里面有多个地方用到了经纬度。
所以我就想把这个获取经纬度的方法写成公共方法,但是遇到了问题。首先是我修改了一点的百度获取经纬度坐标的代码!
MyLocition.activity
package Dagaishang.Android;import java.util.HashMap;import java.util.Map;import Dagaishang.Android.Utility.CmpDistance;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.widget.TextView;import android.location.Location;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.LocationListener;public class MyLocation extends Activity { // 自己的经纬度坐标 private Double myPointX, myPointY; // 计算的两个经纬度之间的距离 private Double Distance; LocationListener mLocationListener = null;// create时注册此listener,Destroy时需要Remove Map<String, Object> myMap = new HashMap<String, Object>(); CmpDistance comDis = new CmpDistance(); String FriendPx; String FriendPy; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylocation);// getLocationByBaidu("0", "0",this); } // FriendPx,FriendPy为好友的经纬度坐标,返回值为计算后的两个坐标的点的距离 String getLocationByBaidu(String PointY, String PonitY,Activity tontext) { FriendPx = PointY; FriendPy = PonitY; BMapApiDemoApp app = (BMapApiDemoApp)tontext.getApplication(); if (app.mBMapMan == null) { app.mBMapMan = new BMapManager(this.getApplication()); app.mBMapMan.init(app.mStrKey, new BMapApiDemoApp.MyGeneralListener()); } app.mBMapMan.start(); // 注册定位事件 mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { if (location != null) { myPointX = location.getLongitude(); myPointY = location.getLatitude(); Distance = comDis.GetLongDistance(myPointX, myPointY, Double.valueOf(FriendPx), Double.valueOf(FriendPy)); } } }; return String.valueOf(Distance); } @Override protected void onPause() { BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication(); // 移除listener app.mBMapMan.getLocationManager().removeUpdates(mLocationListener); app.mBMapMan.stop(); super.onPause(); } @Override protected void onResume() { BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication(); // 注册Listener app.mBMapMan.getLocationManager().requestLocationUpdates( mLocationListener); app.mBMapMan.start(); super.onResume(); }}
其中的getLocationByBaidu()就是我想要使用到的获取经纬度并计算两个点之间距离的方法了,但是其中 if (app.mBMapMan == null) 在其他地方调用的时候会报空指针错误。不知道是不是因为传递过来的Activity不对或者说这里的getlocation()没有获取到东西。
问题
1.是否是因为这个activity没有显示,所以 BMapApiDemoApp app = (BMapApiDemoApp)tontext.getApplication();没有能获取到东西。怎么解决这个问题呢?
2.是否有其他办法来解决获取经纬度坐标的问题,实在不行 我就只有在每个需要 用到经纬度的地方把上面的那个方法写到那个activity里面了(我试过那样可以),但是代码太冗余了,重复的很多。
解决方案:
我也没见你调用这个方法啊?是否为空,一个log就明白了
你不是有这么一句吗
if (location != null) {
就在这里调用,直接把这个location传过去不就行了吗,是不会空的
你所说的空,肯定是传的时候就是空的,可以调试看看
对于这个径纬度,要是我,我会分开,取得径纬度不做好,我不会进行下一步
你现只需将此两个变量值当成参数或是用结构体还是啥数据类型都一回事
Class VecLoc{double latitude =0;//经度double longitude =0;//纬度float accuracy =0;//精度double altitude =0;//海拔float bearing =0;//方向float speed =0;//速度}
关健是能把数据送过去,此处在不在activity里不重要,因为context可以传送
另外还有一种方法,如果操作过多,你可以建立一个Handler消息通道
在任何地方都可以通过这样来与之通信,特别你有多个类会很实用
Bundle data = new Bundle(); String mTAG = "LocationMessage"; String str="{\"latitude\":123,\"longtitude\":321}"; data.putString(mTAG,str); Message msg = new Message(); msg.setData(data); mHandler.sendMessage(msg);