2 jkingcl JKINGCL 于 2012.12.04 12:07 提问

如何将百度地图API获取经纬度写成公有方法!

我使用的是百度地图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里面了(我试过那样可以),但是代码太冗余了,重复的很多。

谢谢您看完真诚的解答!

1个回答

franzhong
franzhong   2012.12.04 12:25
已采纳

我也没见你调用这个方法啊?是否为空,一个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);
JKINGCL
JKINGCL 非常感谢您的回答,我结合您的建议和我实际情况来解决!
大约 5 年之前 回复
franzhong
franzhong 明白了,这样你除了用我上面给你的activity间通信,你还可以使用全局变量:http://blog.csdn.net/andypan1314/article/details/6722480
大约 5 年之前 回复
JKINGCL
JKINGCL 其实这个获取GPS这一块是在activity里的但是是不显示的activity,其他页面的activity也需要用这个XY坐标,而且需要定时更新这个XY坐标,我想写一个通用的方法,其他的activity调用就好了!
大约 5 年之前 回复
franzhong
franzhong 你若不想只搞个class,你就不用考虑前一个activity,因为本界面就是个activity,更有view界面,为啥要把另一activity考虑进来(你是不是startActivityForResult,回传数据更方便),需要通信的话,专门解决通信问题,首先你要得到坐标啊,xy你能正确的得到吗,得到就不用考虑这事了,要不就成结构设计问题去了,多个地方都需用的话,你可以搞成全局变量不就成了,只要不是null就更新全局变量,明白没,若是别的activity也想用,那就是通信问题了,只要解决如何将一个字符串传过去,全都解决了,定位好问题啊,说的太多有点乱
大约 5 年之前 回复
JKINGCL
JKINGCL myLocation = new MyLocation();OurDistance = myLocation.getLocationByBaidu(PointX,PointY,Around_FriendInfoActivity.this);
大约 5 年之前 回复
JKINGCL
JKINGCL 我是在其他的activity中调用的getLocationByBaidu方法!我是这样写的调用你看看!
大约 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!