Android, 全球定位系统。具有 GPS 定位功能的应用程序

Android, gps. App with GPS's localizzation

我遇到了问题:我正在实施辅助 Activity 给我用户的位置。从Page1.java,通过一个按钮,打开Track.java,当我想显示用户所在位置的坐标时。问题是当我单击此按钮时:应用程序已关闭! 这是Page1.java:

的代码

package com.example.giacomob.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by Giacomo B on 05/08/2015.
 */
public class Page1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page1);

       // String dato1 = getIntent().getExtras().getString("NomeDati1");
        //Intent intent = getIntent(); // Point 1
       // Bundle bundle = intent.getExtras(); // Point 2
       // String data1 = bundle.getString("NomeDati1"); // Point 3
        String dato1 =  getIntent().getExtras().getString("NomeDati1"); //preleva la stringa
        Toast.makeText(this, dato1, Toast.LENGTH_SHORT).show();  //PROVA: questo mi fa comparire una specie di label notifica trasparente con il valore di "data1"
        Log.d("TAG", "data1:" + dato1); //credo sia una specie di debug

    //    String salve =  getIntent().getExtras().getString("ciao");

     //   System.out.println("questo è il valore della prima variabile" +salve);

        //FARE CONTROLLO IN CASO IL FILE XML E' VUOTO E QUINDI LA STRINGA E' VUOTA
        String[] arr = dato1.split("\|");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(i + " => " + arr[i]);
        }

        final ArrayList <String> listp = new ArrayList<String>();
        for (int i = 0; i < arr.length; ++i) {
            listp.add(arr[i]);
        }
        // recupero la lista dal layout
        final ListView mylist = (ListView) findViewById(R.id.listView1);

        // creo e istruisco l'adattatore
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listp);

        // inietto i dati
        mylist.setAdapter(adapter);

        Button b_load=(Button)findViewById(R.id.button_send2);
        b_load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
    
                Intent openTrack = new Intent(Page1.this, Track.class);

           

                startActivity(openTrack);
            }
        });

      
    }
  

这是Track.java的代码:

package com.example.giacomob.myapplication;

import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;

/**
 * Created by Giacomo B on 07/08/2015.
 */
public class Track extends ActionBarActivity implements LocationListener {
    /* @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_track);
}
    String providerId = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    private  final int MIN_DIST=20;
    private static final int MIN_PERIOD=30000; */
    private String providerId = LocationManager.GPS_PROVIDER;
    private LocationManager locationManager=null;
    private static final int MIN_DIST=20;
    private static final int MIN_PERIOD=30000;
    /*if(!providerId.contains("gps"))

    {
        final Intent intent = new Intent();
        intent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        intent.setData(Uri.parse("3"));
        sendBroadcast(intent);
    }*/
    @Override
    protected void onResume()
    {
        if (!locationManager.isProviderEnabled(providerId))
        {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
        super.onResume();
        LocationManager locationManager  = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (!locationManager.isProviderEnabled(providerId))
        {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
        else
            locationManager.requestLocationUpdates(providerId, MIN_PERIOD, MIN_DIST, this);
    }

    private void updateGUI(Location location)
    {
        double latitude=location.getLatitude();
        double longitude=location.getLongitude();
        String msg="Ci troviamo in coordinate ("+latitude+","+longitude+")";
        TextView txt= (TextView) findViewById(R.id.locationText);
        txt.setText(msg);
    }
    @Override
    protected void onPause()
    {
        super.onPause();
        locationManager.removeUpdates(this);
    }
    @Override
    public void onLocationChanged(Location location)
    {
        updateGUI(location);
    }

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

    @Override
    public void onProviderEnabled(String s)
    { }

    @Override
    public void onProviderDisabled(String s)
    {  }
}

这是关联到 Track.java 的 xml 文件的代码,称为 "activity_track.xml":

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:text="In attesa di essere localizzati..."
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:textSize="25sp"
    android:id="@+id/locationText"/>

</RelativeLayout>

这是LogCat的代码:

08-08 00:04:23.801    2217-2217/com.example.giacomob.myapplication I/art﹕ Not late-enabling -Xcheck:jni (already on)
08-08 00:04:24.035    2217-2234/com.example.giacomob.myapplication I/OpenGLRenderer﹕ Initialized EGL, version 1.4
08-08 00:04:24.070    2217-2234/com.example.giacomob.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
08-08 00:04:24.070    2217-2234/com.example.giacomob.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4398620, error=EGL_SUCCESS
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ Root element :destinazione
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ ----------------------------
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ [ 08-08 00:04:25.762  2217: 2217 I/System.out ]
    Current Element :destinazione
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ Coordinata X : 1
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ 1
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ Naziome : Italia
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ Paese : Cannole
08-08 00:04:25.762    2217-2217/com.example.giacomob.myapplication I/System.out﹕ Via : Piazza San Vincenzo
08-08 00:04:25.864    2217-2217/com.example.giacomob.myapplication I/System.out﹕ 0 => 1
08-08 00:04:25.864    2217-2217/com.example.giacomob.myapplication I/System.out﹕ 1 => 2
08-08 00:04:25.864    2217-2217/com.example.giacomob.myapplication I/System.out﹕ 2 => Italia
08-08 00:04:25.864    2217-2217/com.example.giacomob.myapplication I/System.out﹕ 3 => Cannole
08-08 00:04:25.864    2217-2217/com.example.giacomob.myapplication I/System.out﹕ 4 => Piazza San Vincenzo
08-08 00:04:25.919    2217-2234/com.example.giacomob.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
08-08 00:04:25.919    2217-2234/com.example.giacomob.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa511b960, error=EGL_SUCCESS
08-08 00:04:26.166    2217-2234/com.example.giacomob.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
08-08 00:04:26.166    2217-2234/com.example.giacomob.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xb4398900, error=EGL_SUCCESS
08-08 00:04:26.893    2217-2217/com.example.giacomob.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.giacomob.myapplication, PID: 2217
    java.lang.RuntimeException: Unable to resume activity {com.example.giacomob.myapplication/com.example.giacomob.myapplication.Track}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.location.LocationManager.isProviderEnabled(java.lang.String)' on a null object reference
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2989)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3020)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
            at android.app.ActivityThread.access0(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.location.LocationManager.isProviderEnabled(java.lang.String)' on a null object reference
            at com.example.giacomob.myapplication.Track.onResume(Track.java:39)
            at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
            at android.app.Activity.performResume(Activity.java:6076)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2978)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3020)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
            at android.app.ActivityThread.access0(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

这是Track.java

的更新

package com.example.giacomob.myapplication;

import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;

/**
 * Created by Giacomo B on 07/08/2015.
 */
public class Track extends ActionBarActivity implements LocationListener {
    /* @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_track);
}
    String providerId = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    private  final int MIN_DIST=20;
    private static final int MIN_PERIOD=30000; */
    private String providerId = LocationManager.GPS_PROVIDER;
    //  private LocationManager locationManager=null;
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    private static final int MIN_DIST = 20;
    private static final int MIN_PERIOD = 30000;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page1);
        this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    
    }
    @Override
    protected void onResume()
    {
        if (!locationManager.isProviderEnabled(providerId))
        {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
        super.onResume();
      //  LocationManager locationManager  = (LocationManager) getSystemService(LOCATION_SERVICE);
        if (!locationManager.isProviderEnabled(providerId))
        {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
        else
            locationManager.requestLocationUpdates(providerId, MIN_PERIOD, MIN_DIST, this);
    }

    private void updateGUI(Location location)
    {
        double latitude=location.getLatitude();
        double longitude=location.getLongitude();
        String msg="Ci troviamo in coordinate ("+latitude+","+longitude+")";
        TextView txt= (TextView) findViewById(R.id.locationText);
        txt.setText(msg);
    }
    @Override
    protected void onPause()
    {
        super.onPause();
        locationManager.removeUpdates(this);
    }
    @Override
    public void onLocationChanged(Location location)
    {
        updateGUI(location);
    }

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

    @Override
    public void onProviderEnabled(String s)
    { }

    @Override
    public void onProviderDisabled(String s)
    {  }
}

我不明白 应用关闭的原因!请帮我!谢谢

您永远不会实例化您的 LocationManager 引用。这必须像这样在 onCreate 中完成:

 LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

应用程序因空指针异常而崩溃。

andrewdleach的回答是正确的;在 onCreate 中添加的确切行是:

this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

编辑:

好的,试试这个

package com.example.giacomob.myapplication;

import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;

/**
 * Created by Giacomo B on 07/08/2015.
 */
public class Track extends ActionBarActivity implements LocationListener
{
    String providerId = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    private  final int MIN_DIST=20;
    private static final int MIN_PERIOD=30000; */
    private String providerId = LocationManager.GPS_PROVIDER;
    private LocationManager locationManager=null;
    private static final int MIN_DIST=20;
    private static final int MIN_PERIOD=30000;

    /*if(!providerId.contains("gps"))

    {
        final Intent intent = new Intent();
        intent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        intent.setData(Uri.parse("3"));
        sendBroadcast(intent);
    }*/

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_track);
        this.locationManager  = (LocationManager) getSystemService(LOCATION_SERVICE);
    }

    @Override
    protected void onResume()
    {
        if (locationManager == null)
            locationManager  = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (!locationManager.isProviderEnabled(providerId))
        {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
        super.onResume();
        if (!locationManager.isProviderEnabled(providerId))
        {
            Intent gpsOptionsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(gpsOptionsIntent);
        }
        else
        {
            locationManager.requestLocationUpdates(providerId, MIN_PERIOD, MIN_DIST, this);
        }
    }

    private void updateGUI(Location location)
    {
        double latitude=location.getLatitude();
        double longitude=location.getLongitude();
        String msg="Ci troviamo in coordinate ("+latitude+","+longitude+")";
        TextView txt= (TextView) findViewById(R.id.locationText);
        txt.setText(msg);
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        if (locationManager != null)
            locationManager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location)
    {
        updateGUI(location);
    }

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

    @Override
    public void onProviderEnabled(String s)
    { }

    @Override
    public void onProviderDisabled(String s)
    {  }
}