在Android APP上使用GPS停止

时间:2016-03-21 12:06:51

标签: android nullpointerexception gps

我想用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)

感谢您的帮助!

1 个答案:

答案 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米(以先到者为准)获得更新。