Как использовать Android LocationManager и Listener

Мне не повезло получить какие-либо данные из GPS, используя приведенный ниже код, и я не уверен, что я делаю неправильно, похоже, мой код соответствует всему, что я вижу в Интернете. Я хотел бы, в конце концов, добавить это в фоновый сервис для регистрации gps-координат, даже если активность не видна или открыты другие приложения, и если скорость больше определенной определенной суммы, но на данный момент я не могу Даже получить любую из данных, чтобы они появились. Я относительно новичок в Android, но я не могу понять, что я делаю неправильно?

public class MainActivity extends Activity { TextView textView; MyLocationListener myLocationListener; LocationManager lm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.textView = (TextView)findViewById(R.id.message); addLocationListener(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void addLocationListener() { lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); Criteria c = new Criteria(); c.setAccuracy(Criteria.ACCURACY_FINE); final String PROVIDER = lm.getBestProvider(c, true); this.myLocationListener = new MyLocationListener(); this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0L, 0.0F, this.myLocationListener); //lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0.0F, myLocationListener); Log.d("LOC_SERVICE", "Service RUNNING!"); } public void updateLocation(Location location) { double latitude, longitude; latitude = location.getLatitude(); longitude = location.getLongitude(); int mph = convertSpeed(location.getSpeed()); Log.d("LOC_SERVICE", "mph: "+mph); this.textView.setText(this.textView.getText()+"\n"+"lat: "+latitude+" lng: "+longitude+" mph: "+mph); } private int convertSpeed(float speed) { int mph =(int)(2.236936D * speed); return mph; } class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location location) { Log.d("LOC_SERVICE", "Listener RUNNING!"); updateLocation(location); } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} } } 

Попробуйте следующий код –

 package com.muslimcompanion.utills; import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.util.Log; public class GPSTracker extends Service implements LocationListener { private final Context mContext; // flag for GPS status boolean isGPSEnabled = false; // flag for network status boolean isNetworkEnabled = false; // flag for GPS status boolean canGetLocation = false; Location location; // location double latitude; // latitude double longitude; // longitude // The minimum distance to change Updates in meters private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters // The minimum time between updates in milliseconds private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute // Declaring a Location Manager protected LocationManager locationManager; public GPSTracker(Context context) { this.mContext = context; getLocation(); } public Location getLocation() { try { locationManager = (LocationManager) mContext .getSystemService(LOCATION_SERVICE); // getting GPS status isGPSEnabled = locationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); // getting network status isNetworkEnabled = locationManager .isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnabled && !isNetworkEnabled) { // no network provider is enabled } else { this.canGetLocation = true; // First get location from Network Provider if (isNetworkEnabled) { locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("Network", "Network"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } // if GPS Enabled get lat/long using GPS Services if (isGPSEnabled) { if (location == null) { locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); Log.d("GPS Enabled", "GPS Enabled"); if (locationManager != null) { location = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { latitude = location.getLatitude(); longitude = location.getLongitude(); } } } } } } catch (Exception e) { e.printStackTrace(); } return location; } public void stopUsingGPS(){ if(locationManager != null){ locationManager.removeUpdates(GPSTracker.this); } } public double getLatitude(){ if(location != null){ latitude = location.getLatitude(); } // return latitude return latitude; } public double getLongitude(){ if(location != null){ longitude = location.getLongitude(); } // return longitude return longitude; } public boolean canGetLocation() { return this.canGetLocation; } public void showSettingsAlert(){ AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); // Setting Dialog Title alertDialog.setTitle("GPS is settings"); // Setting Dialog Message alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); // On pressing Settings button alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); mContext.startActivity(intent); dialog.cancel(); } }); alertDialog.setCancelable(false); alertDialog.show(); } @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public IBinder onBind(Intent arg0) { return null; } } 

Теперь включите эту строку в свою деятельность –

 GPSTracker gps = new GPSTracker(this); int status = 0; if(gps.canGetLocation()) { status = GooglePlayServicesUtil .isGooglePlayServicesAvailable(getApplicationContext()); if (status == ConnectionResult.SUCCESS) { current_lattitude = gps.getLatitude(); current_longitude = gps.getLongitude(); _appPrefs.saveSmsBody("" + current_lattitude); _appPrefs.saveSmsBody("" + current_longitude); Log.d("dashlatlongon", "" + current_lattitude + "-" + current_longitude); if (current_lattitude == 0.0 && current_longitude == 0.0) { current_lattitude = 22.22; current_longitude = 22.22; } } else { current_lattitude = 22.22; current_longitude = 22.22; } } else { gps.showSettingsAlert(); } 

Сначала вы должны использовать разрешение:

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

Далее вы используете метод onCreate (), используя код ниже, чтобы получить доступ к GPS.

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, this); } 

Теперь, если GPS не включен, вам необходимо обратиться ниже кода. Для подробного объяснения вы можете узнать, как получить текущее местоположение в учебнике по Android .

 Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); 

Здесь мы использовали намерения перенаправлять страницу пользователя на страницу настроек местоположения, чтобы он мог включить GPS в настройках местоположения.