I'm trying to get coordinates using GPS in android. I'm successfully getting location in foreground but whenever I put app in background GPS sign vanishes and it stops locating point while in background. I went with different versions of android, some locating location points (below 8.0) and some aren't (Pie).
How to keep running GPS in background in Pie.I tried different SO answers but didn't get solution.
I'm using Service to run app in background and getting coordinates using Broadcast receiver. But I'm not getting points in Pie version.
Here's my MainActivity.java
public class MainActivity extends AppCompatActivity {
private LocationManager locationManager;
private LocationListener locationListener;
private double latitude, longitude;
BroadcastReceiver broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
/*inflating layout*/
riderFirstName = findViewById(R.id.rider_fName);
riderLastName = findViewById(R.id.rider_lName);
riderNote = findViewById(R.id.note);
logout = findViewById(R.id.logout);
if (!runtime_permissions()) {
Intent i = new Intent(getApplicationContext(), GPS_Service.class);
startService(i);
}
}
@Override
protected void onResume() {
super.onResume();
if (broadcastReceiver==null){
broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
double lat = (double) intent.getExtras().get("latitude");
double lng= (double) intent.getExtras().get("longitude");
Log.i("lat", String.valueOf(lat));
Log.i("lang", String.valueOf(lng));
Log.i("lang", String.valueOf(RiderID));
}
};
}
registerReceiver(broadcastReceiver, new IntentFilter("location_update"));
}
@Override
protected void onDestroy() {
super.onDestroy();
if (broadcastReceiver!=null)
unregisterReceiver(broadcastReceiver);
}
private boolean runtime_permissions() {
if (Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
return true;
}
return false;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 100) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Intent i = new Intent(getApplicationContext(), GPS_Service.class);
startService(i);
} else {
runtime_permissions();
}
}
}
}
Here's my Service class
public class GPS_Service extends Service {
PowerManager.WakeLock wakeLock;
private LocationListener listener;
private LocationManager locationManager;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressLint("InvalidWakeLockTag")
@Override
public void onCreate() {
listener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Intent i = new Intent("location_update");
i.putExtra("latitude", location.getLatitude());
i.putExtra("longitude", location.getLongitude());
sendBroadcast(i);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
};
locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
//noinspection MissingPermission
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, CommonObjects.DELAY_LOCATION, 0, listener);
}
@Override
public void onDestroy() {
super.onDestroy();
if(locationManager != null){
//noinspection MissingPermission
locationManager.removeUpdates(listener);
}
}
}
Here's Manifest
<!-- my permissions -->
<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />