我想用GPS测量速度。
我可以启动应用程序,但如果我开始运行应用程序将停止。 为什么呢?
我正在使用Android 4.1
这是代码。
清单:
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
</manifest>
主要
public class MainActivity extends Activity{
Context context;
TextView output;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R
.layout.activity_main);
LocationManager locationManager = (LocationManager)this .getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener=new LocationListener() {
@Override
public void onLocationChanged(Location location) {
location.getLatitude();
Toast.makeText(context,"current speed"+location.getSpeed(),Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
}
}
LOGCAT:
致命的例外:主要 处理:hexworx.gpstest,PID:10258 java.lang.NullPointerException:尝试调用虚方法 'android.content.res.Resources android.content.Context.getResources()' 在null对象引用上 在android.widget.Toast。(Toast.java:109) 在android.widget.Toast.makeText(Toast.java:267) 在 hexworx.gpstest.MainActivity $ 1.onLocationChanged(MainActivity.java:30) 在 android.location.LocationManager $ ListenerTransport._handleMessage(LocationManager.java:281) 在 android.location.LocationManager $ ListenerTransport.access $ 000(LocationManager.java:210) 在 android.location.LocationManager $ ListenerTransport $ 1.handleMessage(LocationManager.java:226) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:135) 在android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:909) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
感谢您的帮助!
答案 0 :(得分:1)
在
行 Toast.makeText(context,"current speed"+location.getSpeed(),Toast.LENGTH_SHORT).show();
将'context'替换为'this'(不带引号)
此外,location.getSpeed()并不总是返回速度。 要查看您的位置对象是否包含速度,请使用以下方法进行检查:
location.hasSpeed();
你必须首先从GPS获得两个不同的位置点[两个(纬度,纬度)对],然后计算这两个点之间的距离,在该位置获得第二次更新的时间(第二点)然后计算速度为: 速度=距离/时间。
您必须考虑GPS位置的准确性,因为糟糕的准确度会导致非常不可靠的结果。
精度数越低越好: 您可以获得如下准确度:
location.getAccuracy();
但在使用之前,由于位置可能也没有准确性,请按以下方式检查:
location.hasAccuracy()
另外要计算两个Location对象之间的距离,请使用:
location1.distanceTo(location2); // Returns meters
同样在这一行:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,locationListener);
您每0ms和/或每0米请求更新一次。过于频繁地进行位置更新非常不可靠,而且可能会导致应用程序出现错误。 将此行替换为:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,3.0f,locationListener);
以便每2秒或每3米(以先到者为准)获得更新。