原问题来自于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);
在开发的过程中我们会用到list显示一个列表,或者其他的东西。在普通的html中我们可以使用如下代码:
<ul> <li>Raymond Camden</li> <li>Scott Stroz</li> <li>Todd Sharp</li> <li>Dave Ferguson</li> </ul>
这样能创建一个默认的列表,然后我们使用CSS修改为自己想要的样式。在jquerymobile中我们达到同样的样式只需要为其添加data-role="content"。修改后如下:
<ul data-role="listview"> <li>Raymond Camden</li> <li>Scott Stroz</li> <li>Todd Sharp</li> <li>Dave Ferguson</li> </ul>
代码中其他部分都省略了,这样的显示效果如下:
在实际的情况中我们经常使用多级的列表。我们只需要在上面每个li中添加ul,这样jquerymobile会自动为那些有子项目的添加一个箭头。部分代码:
<ul data-role="listview"> <li>Games <ul> <li>Pong</li> <li>Breakout</li> <li>Tron</li> </ul> </li> <li>Planets</li> </ul>
效果如下:
没有子项目的将不会为其添加上箭头,点击进入后,子项目显示跟第一个图片的效果一样。
开发移动软件处理网络连接对于程序员是一个头疼的问题,至少我这个菜鸟这么认为,翻了几个软件发现有几个软件在logo页面就是检测网络是否可用,在其他页面有一个broadcast去处理,写了一下子,贴点代码做个笔记
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (checknetwork()) {
//跳转到其他页面的代码
.......................
}else {
openNet("网络信息", "无法连接上服务器,请检查网络");
}
}
private void openNet(String title, String message) {
// 让用户检查网络
AlertDialog.Builder adb = new AlertDialog.Builder(
LogoActivity.this);
final AlertDialog ad = adb.create();
// String current = "当前无法获取定位信息";
ad.setTitle(title);
ad.setMessage(message);
ad.setButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//由于4.0以上把原来的设置方式舍弃了所以上面的代码舍去
if(android.os.Build.VERSION.SDK_INT > 13 ){
//3.2以上打开设置界面,也可以直接用ACTION_WIRELESS_SETTINGS打开到wifi界面
startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));}
else {
startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
}
ad.dismiss();
}
});
ad.setButton2("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ad.dismiss();
System.exit(0);
}
});
ad.show();
}
public boolean checknetwork() {
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if( cm == null )
return false;
NetworkInfo netinfo = cm.getActiveNetworkInfo();
if (netinfo == null )
{
return false;
}
if(netinfo.isConnected())
{
return true;
}
return false;
}
网络连接广播处理
public class ConnectionChangeReceiver extends BroadcastReceiver {
private static final String TAG =ConnectionChangeReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "网络状态改变");
boolean success = false;
//获得网络连接服务
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// State state = connManager.getActiveNetworkInfo().getState();
// 获取WIFI网络连接状态
State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
// 判断是否正在使用WIFI网络
if (State.CONNECTED == state) {
success = true;
}
// 获取GPRS网络连接状态
state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
// 判断是否正在使用GPRS网络
if (State.CONNECTED != state) {
success = true;
}
if (!success) {
Toast.makeText(context, context.getString(R.string.your_network_has_disconnected), Toast.LENGTH_LONG).show();
}
}
public class ConnectionChangeReceiver extends BroadcastReceiver { private static final String TAG =ConnectionChangeReceiver.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { Log.e(TAG, "网络状态改变"); boolean success = false; //获得网络连接服务 ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // State state = connManager.getActiveNetworkInfo().getState(); // 获取WIFI网络连接状态 State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); // 判断是否正在使用WIFI网络 if (State.CONNECTED == state) { success = true; } // 获取GPRS网络连接状态 state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); // 判断是否正在使用GPRS网络 if (State.CONNECTED == state) { success = true; } if (!success) { Toast.makeText(context, context.getString(R.string.your_network_has_disconnected), Toast.LENGTH_LONG).show(); } }
记得在Manifest文件里面进行权限声明,和广播接收器注册。
< !-- Needed to check when the network connection changes -->
< uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
< receiver android:name="you_package_name.ConnectionChangeReceiver" android:label="NetworkConnection">
< intent-filter>
< action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
< /intent-filter>
< /receiver>
使用方式一:
1. 在Activity的onCreate中:
//注册网络监听
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消监听
unregisterReceiver(mNetworkStateReceiver);
使用方式二:
1. 应用启动时,启动Service,在Service的onCreate方法中注册网络监听:
//注册网络监听
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2.
应用退出时,Service关闭,在Service的onDestroy方法中取消监听:
//取消监听
unregisterReceiver(mNetworkStateReceiver);
1楼l375852247昨天 16:49给你顶顶