Getting current location from GPS

Using Criteria.ACCURACY_COARSE I get the location, but it's inaccurate. I wanted to use GPS Criteria.ACCURACY_FINE , but the onLocationChanged(Location location) method is not called.
I did some research, but could not understand why. There are many similar questions in StackOverflow, but unfortunately I could not find the one that cleared my problem.
Below is my source code:

 private void locationInformationSettings(){ Criteria criteria= new Criteria();; criteria.setAccuracy(Criteria.ACCURACY_FINE); //using Criteria.ACCURACY_COARSE works //criteria.setPowerRequirement(Criteria.POWER_LOW); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); String providername = locationManager.getBestProvider(criteria, true); myLocationListener = new MyLocationListener(); locationManager.requestLocationUpdates( providername, //LocationManager.GPS_PROVIDER, Utils.MINIMUM_TIME_BETWEEN_UPDATES, Utils.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, myLocationListener ); } private class MyLocationListener implements LocationListener { public void onLocationChanged(Location location) { locLongitude = location.getLongitude(); locLatitude = location.getLatitude(); String message = String.format( "New Location \n Longitude: %1$s \n Latitude: %2$s", locLongitude, locLatitude); Toast.makeText(RecordActivity.this, message, Toast.LENGTH_LONG).show(); Log.e(TAG, "Location information received:(" + locLongitude + "," + locLatitude +")"); locationManager.removeUpdates(myLocationListener); } public void onStatusChanged(String s, int i, Bundle b) { Toast.makeText(RecordActivity.this, "Provider status changed", Toast.LENGTH_LONG).show(); } public void onProviderDisabled(String s) { Toast.makeText(RecordActivity.this, "Provider disabled by the user. GPS turned off", Toast.LENGTH_LONG).show(); } public void onProviderEnabled(String s) { Toast.makeText(RecordActivity.this, "Provider enabled by the user. GPS turned on", Toast.LENGTH_LONG).show(); } } 

Manifest file permissions:

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

Why is the use of the network provider and the GPS provider not working?
I checked the GPS service on my settings and testing on Android 4.3 and Android 2.3.3.
thanks in advance

+1
source share
3 answers

Here you go

 package com.test.locationmanager; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.os.Bundle; import android.widget.TextView; public class LocationManagerStatus extends Activity { private LocationManager locationManager; private TextView textView; private final LocationListener gpsLocationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { final String tvTxt = textView.getText().toString(); switch (status) { case LocationProvider.AVAILABLE: textView.setText(tvTxt + "GPS available again\n"); break; case LocationProvider.OUT_OF_SERVICE: textView.setText(tvTxt + "GPS out of service\n"); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: textView.setText(tvTxt + "GPS temporarily unavailable\n"); break; } } @Override public void onProviderEnabled(String provider) { textView.setText(textView.getText().toString() + "GPS Provider Enabled\n"); } @Override public void onProviderDisabled(String provider) { textView.setText(textView.getText().toString() + "GPS Provider Disabled\n"); } @Override public void onLocationChanged(Location location) { locationManager.removeUpdates(networkLocationListener); textView.setText(textView.getText().toString() + "New GPS location: " + String.format("%9.6f", location.getLatitude()) + ", " + String.format("%9.6f", location.getLongitude()) + "\n"); } }; private final LocationListener networkLocationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { final String tvTxt = textView.getText().toString(); switch (status) { case LocationProvider.AVAILABLE: textView.setText(tvTxt + "Network location available again\n"); break; case LocationProvider.OUT_OF_SERVICE: textView.setText(tvTxt + "Network location out of service\n"); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: textView.setText(tvTxt + "Network location temporarily unavailable\n"); break; } } @Override public void onProviderEnabled(String provider) { textView.setText(textView.getText().toString() + "Network Provider Enabled\n"); } @Override public void onProviderDisabled(String provider) { textView.setText(textView.getText().toString() + "Network Provider Disabled\n"); } @Override public void onLocationChanged(Location location) { textView.setText(textView.getText().toString() + "New network location: " + String.format("%9.6f", location.getLatitude()) + ", " + String.format("%9.6f", location.getLongitude()) + "\n"); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.textview); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); } @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 5000, 0, networkLocationListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, gpsLocationListener); } @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(networkLocationListener); locationManager.removeUpdates(gpsLocationListener); } } 
+2
source

New Google Maps API Introduces OnMyLocationChangeListener.
You do not need to implement a LocationListener. Check this answer: fooobar.com/questions/1484567 / ...

+1
source

After almost two months without an answer, I decided to go with the next one that works.
Hope this helps other people save some time.

 public class GpsLocationService extends Service implements LocationListener{ private final String TAG = getClass().getSimpleName(); private LocationManager locationManager; private String provider; @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate()"); // Get the location manager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Define the criteria how to select the locatioin provider -> use // default Criteria criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(provider); // Initialize the location fields if (location != null) { Log.d(TAG, "Provider " + provider + " has been selected."); onLocationChanged(location); } else { Log.d(TAG, "Location not available!"); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "GpsLocationService has started!"); locationManager.requestLocationUpdates(provider, 400, 1, this); return START_STICKY; } @Override public void onDestroy() { Log.i(TAG, "GpsLocationService is destroyed!"); super.onDestroy(); locationManager.removeUpdates(this); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onLocationChanged(Location location) { double lat = location.getLatitude(); double lng = location.getLongitude(); Log.i( TAG, "onLocationChanged() lat = " + lat + " long = " + lng); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } } 

And in your manifest file, remember to add the following permissions:

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

Pay attention to your service:

 <service android:name=".GpsLocationService"></service> 
0
source

Source: https://habr.com/ru/post/1484564/


All Articles