Access to GPS does not work. Application uses network to get location

My application does not want to use GPS and use the network instead. I checked this by analyzing latitude and longitude, they are a bit random (like network location).

If I use another application that uses GPS (for example, Tracker Enddomondo Sports), I see a distinctive label, which means that GPS is currently running:

enter image description here

When I launch my application, there is no mark.

I use the following code (Lars Vogella code, Source: http://www.vogella.com/articles/AndroidLocationAPI/article.html ):

import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class ShowLocationActivity extends Activity implements LocationListener { private TextView latituteField; private TextView longitudeField; private LocationManager locationManager; private String provider; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); latituteField = (TextView) findViewById(R.id.TextView02); longitudeField = (TextView) findViewById(R.id.TextView04); // 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) { System.out.println("Provider " + provider + " has been selected."); onLocationChanged(location); } else { latituteField.setText("Location not available"); longitudeField.setText("Location not available"); } } /* Request updates at startup */ @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates(provider, 400, 1, this); } /* Remove the locationlistener updates when Activity is paused */ @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(this); } @Override public void onLocationChanged(Location location) { int lat = (int) (location.getLatitude()); int lng = (int) (location.getLongitude()); latituteField.setText(String.valueOf(lat)); longitudeField.setText(String.valueOf(lng)); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { Toast.makeText(this, "Disabled provider " + provider, Toast.LENGTH_SHORT).show(); } } 

Of course, I added permissions to the AndroidManifest.xml file:

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

Any ideas?

+4
source share
1 answer

Solution: you can use GPS instead of choosing the best provider by selecting criteria.

Example, Replace:

 locationManager.requestLocationUpdates(provider, 400, 1, this); 

WITH

 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 400, 1, this); 

Explaination:

Depending on the use case of your application, you need to choose a provider of a specific location i.e. LocationManager.GPS_PROVIDER or LocationManager.NETWORK_PROVIDER

Alternatively, you can provide some input criteria, such as accuracy, power consumption, cash costs, etc., and let Android decide the nearest location matching provider.

  // Retrieve a list of location providers that have fine accuracy, no monetary cost, etc Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setCostAllowed(false); String providerName = locManager.getBestProvider(criteria, true); //and then you can make location update request with selected best provider locationManager.requestLocationUpdates(provider, 400, 1, this); 

See how to use locationmanager , how to do, specify criteria and how getBestProvider method works for reference

+5
source

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


All Articles