我有以下非常简单的类,它查找最后已知的用户坐标,然后打印其中一个。但我将loc作为null变量。应用程序不会将数据读入loc变量。
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class Navigation extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* Use the LocationManager class to obtain GPS locations */
try
{
LocationManager mlocManager =
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
Toast.makeText(getBaseContext(),
"Provider Enable Status : " + mlocManager.isProviderEnabled(
mlocManager.getProvider("gps").getName()),
Toast.LENGTH_LONG).show();
Location loc = mlocManager.getLastKnownLocation("gps");
Toast.makeText( getApplicationContext(), "" +
loc.getLatitude(), Toast.LENGTH_LONG).show();
Toast.makeText( getApplicationContext(), "" + loc,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage() +
e.toString(), Toast.LENGTH_LONG).show();
}
}
}
我在代码中添加了以下监听器:
LocationListener mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( mlocManager.getProvider("gps").getName(), 0, 0, mlocListener);
在oncreate函数中。以下是
中的一个类public class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
Toast.makeText( getApplicationContext(),
"Hi, location changed. :)", Toast.LENGTH_LONG).show();
try {
loc.getLatitude();
loc.getLongitude();
String Text = "My current location is: " +
" Latitude = " + loc.getLatitude() +
" Longitude = " + loc.getLongitude();
Toast.makeText(getApplicationContext(),
Text, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(),
e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
运行窗口后,我执行以下操作: 转到Eclipse中的DDMS并设置lattitude / longtitude并单击send。
仍然不会在函数中触发任何toast命令。
答案 0 :(得分:1)
如果您阅读manual,则明确表示该方法返回“提供者的最后一个已知位置,或者为null”。
我不是Android开发人员,但我猜它会在GPS冷启动时返回null,直到修复完毕。在继续之前,您必须检查loc是!=null
。您可能会尝试等待一段时间或使用异步回调。
希望得到帮助。
答案 1 :(得分:1)
这是有道理的......因为如果设备从未有过已知的位置,那么你就无法得到一个。 你应该自己处理null。提供新位置或等待第一个GPS数据......
答案 2 :(得分:1)
WarrenFaith和djechelon说的确是一种很好的做法。在使用该对象之前,您应该检查它是否为空。
另外请注意,如果您在活动中,则无需让上下文调用getApplication()
和getBaseContext()
。将其替换为this
,然后重试。
您可能还想查看第三个Toast通知,因为您设置的文本为""+loc
我猜您的意思是""+loc.getLongitude()
。
如果你需要在另一个类的某个地方拥有活动的上下文,那么就像这样定义上下文。
private Context ctx = null;
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
// some code
ctx = getApplication();
// some more code
}
// your other class in the same Java file (inner class)
public class MyOtherClass {
// a construtctor probably
// some usefull methods
Toast.makeText(ctx, "My message", 5000).show();
}
答案 3 :(得分:0)
那么你可以做空检查,这绝对是解决这个问题的方法。另一个技巧是你的onResume()调用你请求位置更新的活动:
@Override
protected void onResume() {
// TODO Auto-generated method stub
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f,this);
super.onResume();
}
在您的情况 mlocManager 中,请确保将其创建为实例变量(类级别)而非本地(在onCreate的情况下未在方法中定义)。
这肯定会获取位置更新而不会抛出空指针。另外,请确保 geofix您的GPS配置模拟器。使用DDMS的仿真器控件弹出按钮来执行此操作。在启动活动之前修复一些经度和latitiude值。
希望这有帮助!