【问题标题】:Android GPS OnLocationChange CrashAndroid GPS OnLocationChange 崩溃
【发布时间】:2016-11-04 18:38:22
【问题描述】:

每当我尝试运行我的 android 应用程序时,我都会继续收到此错误并崩溃。它应该检索当前 gps 位置并更新一个名为 log on the data activity 的文本视图。

07-02 09:28:40.978 27682-27682/? W/dalvikvm: threadid=1: 线程以未捕获的异常退出 (group=0x416aeba8) 07-02 09:28:40.978 27682-27682/? E/AndroidRuntime: 致命异常: main 进程:com.novakinc.novak,PID:27682 java.lang.NullPointerException 在 com.novakinc.novak.MainActivity$1.onLocationChanged(MainActivity.java:52) 在 android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:279) 在 android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:208) 在 android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:224) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5017) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 在 dalvik.system.NativeStart.main(Native Method)

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.novakinc.novak">

<uses-permission android:name="android.permission.ACCESS_COARSE_INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".help" />
    <activity android:name=".about" />
    <activity android:name=".data"></activity>
</application>

</manifest>

MainActivity.java:

package com.novakinc.novak;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


private LocationManager locationManager;
private LocationListener listener;



@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);




    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);


    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            data.log.append("\n " + location.getLongitude() + " " +     location.getLatitude());
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(i);
        }
    };

    if (ActivityCompat.checkSelfPermission(this,     Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED   && ActivityCompat.checkSelfPermission(this,   Manifest.permission.ACCESS_COARSE_LOCATION) !=   PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]  {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET}
                    ,10);
        }
        return;
    }
    // this code won't execute IF permissions are not allowed, because in the line above there is return statement.


    locationManager.requestLocationUpdates("gps", 5000, 0, listener);


}


//---------------------------------------Menu---------------------------------------------------

public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.about:
            startActivity(new Intent(this, about.class));
            return true;
        case R.id.help:
            startActivity(new Intent(this, help.class));
            return true;
        case R.id.data:
            startActivity(new Intent(this, data.class));
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

//---------------------------------------End Menu-----------------------------------------------

}

数据.java:

package com.novakinc.novak;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;


public class data extends AppCompatActivity {

    public static TextView log;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_data);
        log = (TextView) findViewById(R.id.textView);

    }
}

【问题讨论】:

    标签: java android gps android-gps


    【解决方案1】:

    data.log 是数据活动中的静态变量吗?您需要在向其附加内容之前为其分配一个引用

    【讨论】:

    • 所以你得到了一个 NPE,因为第一次没有初始化文本视图。但是为什么要在不可见的activity中追加一个文本视图呢?
    • 因为您可以进入数据活动并查看日志。
    • 而且文本视图确实有一个初始值。它默认为“新文本”
    • 您可以在 MainActivity 中获取一个字符串,在 on locationchanged 方法中保存您想要的任何内容,并在启动数据活动时将该字符串传递给数据活动,并在创建时获取该字符串数据活动的方法并将其设置在文本视图中
    【解决方案2】:

    你得到一个 Nullpointer 异常,因为在 LocationListener 中你从 Location 得到一个空值。始终检查 (if) 空值。

    【讨论】:

    • 你能创建一个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2012-07-07
    • 2012-12-27
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多