We have a location-based app where, based on the location of users, we are trying to push some campaign notifications. But this seems to drain the phoneβs battery and consumes up to 30-35% of the charge from time to time.
Below is the location implementation in our application.
public class DashboardActivity extends BaseActivity implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks, LocationListener, ExitConfirmationDialog.OnExitResponseListner { private final int HAS_PERMISSION_COARSE_LOCATION = 1; private final int HAS_PERMISSION_FINE_LOCATION = 2; LocationManager locationManager; CustomTextViewDemi mNotificationCount; String count = ""; Menu menu; List<CreateFragmentsPojo> fragments; boolean isSettingsScreenOpen = false; int backPresedCount = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); setTitle("Dashboard"); setupNavigationView(0); fragments = new ArrayList<>(); Utils.HandleViews(mLayout, false); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (isGPSLocationEnabled(locationManager)) { buildGooleApiClient(); } else if (isNetworkLocationEnabled(locationManager)) { buildGooleApiClient(); } else { showAlert(); } } private void buildGooleApiClient() { buildGoogleApiClient(); if (Build.VERSION.SDK_INT >= 23) { requestPermission(); } else { if (mGoogleApiClient != null) { if (mGoogleApiClient.isConnected()) { getUserCurrentLocation(); } else { mGoogleApiClient.connect(); } } else { getDashBoard("", ""); } } } public void getData(String lat, String lng) { if (Utils.isInternetConnection(this)) { getCampaignDetails(lat, lng); } else { Utils.HandleViews(progressBar, false); Utils.showMessages(this, Params.CHECK_INTERNET_MESSAGE, true); } } private void getUserCurrentLocation() { try { Utils.HandleViews(progressBar, true); if (mGoogleApiClientAwareness == null) { buildGoogleApiAwarenessClient(); } Awareness.SnapshotApi.getLocation(mGoogleApiClientAwareness) .setResultCallback(new ResultCallback<LocationResult>() { @Override public void onResult(@NonNull LocationResult locationResult) { if (!locationResult.getStatus().isSuccess()) { Log.e("awareness demo api ", "Could not get location."); if (mGoogleApiClient != null) { try { Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null) { getDashBoard(mLastLocation.getLatitude() + "", mLastLocation.getLongitude() + ""); } else { getDashBoard("", ""); } } catch (SecurityException e) { e.printStackTrace(); } } else { if (locationManager != null) { String provider = Utils.getUserLastLocation(locationManager); if (provider != null) { try { Location location = locationManager.getLastKnownLocation(provider); if (location != null) { getDashBoard(location.getLatitude() + "", location.getLongitude() + ""); } else { getDashBoard("", ""); } } catch (SecurityException e) { e.printStackTrace(); } } } } } try { Location location = locationResult.getLocation(); if (location != null) { getDashBoard(location.getLatitude() + "", location.getLongitude() + ""); } else { getDashBoard("", ""); } } catch (Exception e) { e.printStackTrace(); } } }); } catch (SecurityException se) { se.printStackTrace(); } } private void showAlert() { final AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("Enable Location") .setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to " + "get campaigns at your location.") .setPositiveButton("Location Settings", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface paramDialogInterface, int paramInt) { isSettingsScreenOpen = true; Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(myIntent, 201); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface paramDialogInterface, int paramInt) { getUserCurrentLocation(); } }); dialog.show(); } @TargetApi(23) private void requestPermission() { int HAS_REQUEST_PERMISSION_COARSE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION); if (HAS_REQUEST_PERMISSION_COARSE_LOCATION != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) { new AlertDialog.Builder(this) .setTitle("Request Permission") .setMessage("Provide permission to access your location") .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, HAS_PERMISSION_COARSE_LOCATION); } }).create().show(); } else { requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, HAS_PERMISSION_COARSE_LOCATION); } } else { requestFineLocationPermission(); } } @TargetApi(23) private void requestFineLocationPermission() { int HAS_REQUEST_PERMISSION_FINE_LOCATION = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); if (HAS_REQUEST_PERMISSION_FINE_LOCATION != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) { new AlertDialog.Builder(this) .setTitle("Request Permission") .setMessage("Provide permission to access your location") .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, HAS_PERMISSION_FINE_LOCATION); } }).create().show(); } else { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, HAS_PERMISSION_FINE_LOCATION); } } else { getUserCurrentLocation(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == HAS_PERMISSION_COARSE_LOCATION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { requestFineLocationPermission(); } } else if (requestCode == HAS_PERMISSION_FINE_LOCATION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getUserCurrentLocation(); } } } private void getUserLocationBackgroundProcess() { try {