Android Studio - 从 MapsActivity 返回上一个 activity 时应用程序崩溃

Android Studio - App Crashes when getting back to last activity from MapsActivity

你好,我有这个可以跟踪用户位置的应用程序我有两个 Activity,它们是 HomeActivity 和 MapsActivity。在应用程序的第一个 运行 上,在我按下主页 Activity 上的按钮后,它将转到地图 Activity,但在单击后退按钮或 onBAckpressed 后,应用程序崩溃了,但在第二次打开应用程序并单击返回主页Activity 不要崩溃。

这是我的代码。

package www.teamruby.com.capstoneproject;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.location.Criteria;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.storage.StorageManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.text.format.Formatter;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;


import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpResponse;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.GroundOverlayOptions;
import com.google.android.gms.maps.model.LatLngBounds;


import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.apache.http.HttpEntity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;





public class SendHelp extends FragmentActivity implements OnMapReadyCallback{


    private Map<Integer, LatLng> marker = new HashMap();


    String e_date="";
    String e_type="";
    String e_position="";
    String e_desc="";
    String e_user_id="";
    String e_location="";


    Button stop;
    private GoogleMap mMap;
    private Marker currentLocationMarker,locationsMarker,clickedMarker;

    String provider;
    LocationManager locationManager;
    private final static int MY_PERMISSION_FINE_LOCATION = 101;

    AlertDialog.Builder builder;
    Context ctx;

    String current_loc="0000";
    String loc_url ="http://192.168.8.100/sample_login/location.php";
    String locs_url ="http://192.168.8.100/sample_login/locs_list.php";

    private ArrayList<LatLng> points; //added
    Polyline line; //added
    private List<LatLng>latLngList;



    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_help);

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            e_date = extras.getString("e_date");
            e_type = extras.getString("e_type");
            e_position = extras.getString("e_position");
            e_desc = extras.getString("e_desc");
            e_user_id = extras.getString("e_user_id");

        }
//        Toast.makeText(SendHelp.this, e_date, Toast.LENGTH_LONG).show();
//        Toast.makeText(SendHelp.this, e_type, Toast.LENGTH_LONG).show();
//        Toast.makeText(SendHelp.this, e_position, Toast.LENGTH_LONG).show();
//        Toast.makeText(SendHelp.this, e_desc, Toast.LENGTH_LONG).show();
//        Toast.makeText(SendHelp.this, e_user_id, Toast.LENGTH_LONG).show();



        points = new ArrayList<LatLng>(); //added
        latLngList = new ArrayList<LatLng>();
        WifiManager manager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
        WifiInfo info = manager.getConnectionInfo();
        final int ip = info.getIpAddress();
        final String ipAddress = BigInteger.valueOf(ip).toString();


        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        final LocationListener mlocListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {

                if(currentLocationMarker != null){
                    currentLocationMarker.remove();
                }

                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                final LatLng latLng = new LatLng(latitude, longitude);

                points.add(latLng); //added
//                redrawLine();

                MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(latLng);
                markerOptions.title(e_user_id).snippet(e_position);

                markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
                currentLocationMarker = mMap.addMarker(markerOptions);
//                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
//                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17.2f));


                current_loc = latLng.toString();



                Toast.makeText(SendHelp.this, ipAddress, Toast.LENGTH_LONG).show();




                StringRequest stringRequest = new StringRequest(Request.Method.POST, loc_url,
                        new Response.Listener<String>() {
                            @Override
                            public void onResponse(String response) {
//                                    try {
//                                        JSONArray jsonArray= new JSONArray(response);
//                                        JSONObject jsonObject = jsonArray.getJSONObject(0);
//                                        String code = jsonObject.getString("code");
//                                        String message = jsonObject.getString("message");
//                                        builder.setTitle("Server Response");
//                                        builder.setMessage(message);
//                                        displayAlert(code);
//
//                                    } catch (JSONException e) {
//                                        e.printStackTrace();
//                                    }
                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("current_loc", current_loc);
                        return params;


                    }


                };
                MySingleton.getInstance(SendHelp.this).addToRequestQueue(stringRequest);

            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }


        };



        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        provider = locationManager.getBestProvider(criteria, true);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }


        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, mlocListener);


        stop =(Button)findViewById(R.id.stop);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                locationManager.removeUpdates(mlocListener);
                Toast.makeText(SendHelp.this, "STOPPPPPPPPP", Toast.LENGTH_LONG).show();

                Intent i = new Intent(SendHelp.this,INeedHelp.class);
                finish();
                startActivity(i);

            }
        });

    }

    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */


    @Override
    public void onMapReady(GoogleMap googleMap) {


        mMap = googleMap;

        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.raw.cspc);

        LatLng southwest = new LatLng(13.40411165, 123.37296439);
        LatLng northeast = new LatLng(13.40764800, 123.37730890);

        LatLngBounds latLngBounds = new LatLngBounds(southwest, northeast);

        GroundOverlayOptions groundOverlayOptions = new GroundOverlayOptions();
        groundOverlayOptions.positionFromBounds(latLngBounds);

        groundOverlayOptions.image(bitmapDescriptor);


        googleMap.addGroundOverlay(groundOverlayOptions);

        LatLng tlatLng = new LatLng(13.4062, 123.3750);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(tlatLng));
        mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(tlatLng, 17.2f));
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;



        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION);
            }

        }



    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {

            case MY_PERMISSION_FINE_LOCATION:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

                        return;
//                        mMap.setMyLocationEnabled(true);
//                        Intent i = new Intent(SendHelp.this,SendHelp.class);
//                        startActivity(i);
                    }


                }
                else{
                    Toast.makeText(getApplicationContext(),"This App Requires location to be granted", Toast.LENGTH_LONG).show();
                    return;
                }
                break;
        }
    }


    public void displayAlert(final String code){

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if(code.equals("no_location")){

                    current_loc="";

                }
                else if(code.equals("loc_success")){
                    current_loc="";

                }

            }
        });
        AlertDialog alertDialog = builder.create();
        alertDialog.show();

    }

//    private void redrawLine(){
//
////        mMap.clear();  //clears all Markers and Polylines
//
//        PolylineOptions options = new PolylineOptions().width(5).color(Color.RED).geodesic(true);
//        for (int i = 0; i < points.size(); i++) {
//            LatLng point = points.get(i);
//            options.add(point);
//        }
//
//        line = mMap.addPolyline(options); //add Polyline
//    }



    @Override
    public void onBackPressed() {


        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(false);
        builder.setMessage("Do you want to Exit?");
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //if user pressed "yes", then he is allowed to exit from application

                stop.performClick();

            }
        });
        builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //if user select "No", just cancel this dialog and continue with app
                dialog.cancel();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
    }

}

这里是 logcat:

07-06 02:13:45.548 27451-27451/www.teamruby.com.capstoneproject E/AndroidRuntime: FATAL EXCEPTION: main
    Process: www.teamruby.com.capstoneproject, PID: 27451
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.Button.performClick()' on a null object reference
        at www.teamruby.com.capstoneproject.SendHelp.onClick(SendHelp.java:430)
        at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

据我所知,这是因为您还没有实例化名为停止的按钮。您只将引用变量声明为停止,默认情况下为 null。 因此在onCreate方法中,使用如下代码实例化按钮。

stop=(Button) findViewById(R.id.XXyourButtonNameInTheXML);