Мое Приложение GPS Вышло Из Строя После Установки Последнего Местоположения

#java #android #gps #tracking

Вопрос:

В настоящее время я создаю приложение GPS из FreeCodeCamp.Org Канал на Youtube «Как создать приложение для отслеживания GPS» https://www.youtube.com/watch?v=_xUcYfbtfsIamp;t=1774s . Я сделал все, что в видео, и инструкции, но каждый раз, когда я нажимал на список точек перехода, он продолжал падать. Мне нужна помощь, чтобы исправить это. Я не знаю, что не так с кодом.

 package com.example.gipies;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResu<
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    public static final int DEFAULT_UPDATE_INTERVAL = 30;
    public static final int FAST_UPDATE_INTERVAL = 5;
    public static final int PERMISSION_FINE_LOCATION = 99;
    //Refrensi Element UI
    TextView tv_lat, tv_lon, tv_altitude, tv_accuracy, tv_speed, tv_sensor, tv_updates, tv_address,tv_wayPointCounts;
    Button btn_newWP, btn_showWayPointList,btn_showMap;
    @SuppressLint("UseSwitchCompatOrMaterialCode")
    Switch sw_locationupdates, sw_gps;


    //Variable to Remember to Track
    boolean updateOn = false;

    //Current Locaton
    Location currentLocation;

    //List of Saved
    List<Location> savedLocations;


    //Location Request configs of  FusedLocationProviderClient
    LocationRequest locationRequest;

    LocationCallback locationCallBack;


    //Google API for Location Services
    private FusedLocationProviderClient fusedLocationProviderClient;
     Object FusedLocationProviderClient;

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

        //Nilai Variable UI
        tv_lat = findViewById(R.id.tv_lat);
        tv_lon = findViewById(R.id.tv_lon);
        tv_altitude = findViewById(R.id.tv_altitude);
        tv_accuracy = findViewById(R.id.tv_accuracy);
        tv_speed = findViewById(R.id.tv_speed);
        tv_sensor = findViewById(R.id.tv_sensor);
        tv_updates = findViewById(R.id.tv_updates);
        tv_address = findViewById(R.id.tv_address);
        sw_gps = findViewById(R.id.sw_gps);
        sw_locationupdates = findViewById(R.id.sw_locationsupdates);
        btn_newWP = findViewById(R.id.btn_newWP);
        btn_showWayPointList= findViewById(R.id.btn_showWayPointList);
        btn_showMap = findViewById(R.id.btn_showMap);
        tv_wayPointCounts = findViewById(R.id.tv_CountOfPoints);

        FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

        //Set all Properties of LR
        locationRequest = new LocationRequest();
        locationRequest.setInterval(1000 * DEFAULT_UPDATE_INTERVAL);
        locationRequest.setFastestInterval(1000 * FAST_UPDATE_INTERVAL);
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        locationCallBack = new LocationCallback() {

            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);

                //Save Location
                Location location = locationResult.getLastLocation();
                updateUIValues(location);
            }
        };

        btn_newWP.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //get GPS Location



                // add New Location
                MyApplication myApplication = (MyApplication)getApplicationContext();
                savedLocations = myApplication.getMyLocations();
                savedLocations.add(currentLocation);


            }
        });

        btn_showWayPointList.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this, ShowSavedLocList.class);
                startActivity(i);

            }
        });

        btn_showMap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this,MapsActivity.class);
                startActivity(i);


            }
        });


        sw_gps.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("SetTextI18n")
            @Override
            public void onClick(View v) {
                if (sw_gps.isChecked()) {
                    //GPS Accurate
                    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                    tv_sensor.setText("Using GPS Sensor");
                } else {
                    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
                    tv_sensor.setText("Using WIFI");
                }
            }
        });

        sw_locationupdates.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (sw_locationupdates.isChecked()) {
                    //Turned On Location Tracking
                    startLocationUpdates();
                } else {
                    //Turned Off Tracking
                    stopLocationUpdates();
                }
            }
        });

        updateGPS();
    }//END onCreate

    @SuppressLint("SetTextI18n")
    private void stopLocationUpdates() {
        tv_updates.setText("Location is NOT Being Tracked");
        tv_lat.setText("Not tracking");
        tv_lon.setText("Not Tracking");
        tv_speed.setText("Not Tracking");
        tv_address.setText("Not Tracking");
        tv_accuracy.setText("Not Tracking");
        tv_altitude.setText("Not Tracking");
        tv_sensor.setText("Not Tracking");

        LocationCallback.FusedLocationProviderClient.RemoveLocationUpdates(locationCallBack);
    }

    @SuppressLint("SetTextI18n")
    private void startLocationUpdates() {

        tv_updates.setText("Location is Being Tracked");
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; 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;

            FusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallBack, null);
            updateGPS();
        }
    }

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

        switch (requestCode){
            case PERMISSION_FINE_LOCATION:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
            updateGPS();
            }
            else{
                Toast.makeText(this,"The APP Needs Permissions",Toast.LENGTH_SHORT).show();
                finish();
            }
        }
    }

    private void  updateGPS(){
        //Permissions, Current Location, Update UI



        FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(MainActivity.this);
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            FusedLocationProviderClient.getLastLocation()
                    .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    updateUIValues(location);



                    Location currentLocation = location;
                }

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

    private void updateUIValues(Location location) {

        //Update All Text with New Location
        tv_lat.setText(String.valueOf(location.getLatitude()));
        tv_lon.setText(String.valueOf(location.getLongitude()));
        tv_accuracy.setText(String.valueOf(location.getAccuracy()));

        if(location.hasAltitude()){
            tv_altitude.setText(String.valueOf(location.getAltitude()));

        }
        else{
            tv_altitude.setText("Not Available");
        }
        if (location.hasSpeed()){
            tv_speed.setText(String.valueOf(location.getAltitude()));
        }
        else{
            tv_speed.setText("Not Available");
        }


        Geocoder geocoder = new Geocoder(MainActivity.this);

        try{
            List<Address>addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
            tv_address.setText(addresses.get(0).getAddressLine(0));
        }
        catch ( Exception e){
            tv_address.setText("Unable to find");
        }

        MyApplication myApplication = (MyApplication)getApplicationContext();
        savedLocations = myApplication.getMyLocations();

        //Show Number of WPs
        tv_wayPointCounts.setText(Integer.toString(savedLocations.size()));
        

    }
}
 

в MainActivity.Java
там было написано
Не удается разрешить символ ‘FusedLocationProviderClient’
Не удается разрешить метод «requestLocationUpdates» в «Объекте»
Не удается разрешить метод «getLastLocation» в «Объекте»

Комментарии:

1. Если произойдет сбой, опубликуйте трассировку стека.

2. что такое трассировка стека? я все еще новичок в этой студии Android.

3. Моя проблема заключается в getLastLocation, RemoveLocationUpdates и requestLocationUpdates. линия стала красной, и я понял, почему она не работает,

4. ТАК что вы даже не составляете компиляцию. Ты не врежешься.

5. Хорошо, но проблема в том, что каждый раз, когда я нажимаю определенную опцию, которую я сделал в пользовательском интерфейсе, приложение падает. Я делал все шаги так же, как в видео, снова и снова, и приложение все равно выходило из строя после того, как я нажимал кнопку «Показать точки маршрута». У вас есть совет, что проверить? Спасибо.