Skip to content

Instantly share code, notes, and snippets.

@master255
Created November 28, 2016 11:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save master255/465818d6c1e52ea8d33d9589b4ec2c3b to your computer and use it in GitHub Desktop.
Save master255/465818d6c1e52ea8d33d9589b4ec2c3b to your computer and use it in GitHub Desktop.
1
package ru.infoshell.securephone.location;
import java.util.Date;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import ru.infoshell.securephone.helpers.Lo;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
public class LocationHelper {
public static LocationManager lManager;
public static LocationListener locListener;
public static LocationsCallback googleLocCallback;
public static Location lastLoc;
public static Location lastLoc2;
private static final int updTimeCriteria = 5*60*1000;
/**
* Регистрация слушателя геоположения
*/
public static int registerLocManager(Context cont, boolean renew){
Lo.w("registerLocManager: renew: "+renew);
int availProviders = 0;
if (locListener==null ){
Lo.v("new locListener ");
locListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Lo.w("onStatusChanged "+provider);
}
@Override
public void onProviderEnabled(String provider) {
Lo.w("onProviderEnabled "+provider);
}
@Override
public void onProviderDisabled(String provider) {
Lo.w("onProviderDisabled "+provider);
}
@Override
public void onLocationChanged(Location location) {
Lo.w("onLocationChanged "+location);
lastLoc = location;
}
};
}
if (lManager==null || renew){
lManager = (LocationManager) cont.getSystemService(Context.LOCATION_SERVICE);
Lo.v("new lManager: "+lManager);
//Назначаем слушателя на возможные провайдеры по очереди
//(для верности завернем их в try, т.к. некоторые могут быть недоступны)
try {
lManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000, 50, locListener);
availProviders++;
Lo.v("GPS_PROVIDER ");
} catch (Exception e) {
Lo.e(""+e);
// try { Looper.prepare(); } catch (Exception e2){}
}
try {
lManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 300000, 50, locListener);
availProviders++;
Lo.v("NETWORK_PROVIDER ");
} catch (Exception e) {Lo.e(""+e);}
try {
lManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 300000, 50, locListener);
availProviders++;
Lo.v("PASSIVE_PROVIDER ");
} catch (Exception e) {Lo.e(""+e);}
}
Lo.w("availProviders: "+availProviders);
return availProviders;
}
/**
* Получить последние координаты (из сервиса или системы)
*/
/* public static String getLastLoc(Context cont){
String locString = "undefined";
if (lastLoc!=null){
locString = stringFromLoc(lastLoc);
}
else{
lastLoc = getLastCopords();
if (lastLoc!=null)
locString = stringFromLoc(lastLoc);
}
return locString;
}
*/
public static void refreshLastLoc(final Context context){
try{
Lo.i("refreshLastLoc / lastLoc = "+lastLoc + (lastLoc!=null? " time: "+new Date(lastLoc.getTime()) : "") );
final boolean gpAvailable = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context)== ConnectionResult.SUCCESS;
Lo.i("isGooglePlayServicesAvailable "+gpAvailable);
// сперва спрашиваем плэй сервис на предмет локации
if(gpAvailable){
Lo.i("gpAvailable");
if (googleLocCallback==null)
googleLocCallback = new LocationsCallback() {
public void onLocationFound(Location location) {
Lo.i("onLocationFound (gp) "+location);
//VS if (location!=null) {lastLoc = location;}
if (location!=null) {
lastLoc = location;
if (lastLoc2 == null){
lastLoc2 = location;
}
}
}
public void onLocationError(ConnectionResult connectionResult) {
Lo.e("onLocationError (gp) "+connectionResult);
}
};
new Locations(context, googleLocCallback).findLocation();
}
// если локация на этот момент еще не найдена - лучше взять хоть какую то старым способом
if (lastLoc==null || lastLoc.getTime() > System.currentTimeMillis()+updTimeCriteria ){
final Location tmpLoc = getLastCopords();
if (tmpLoc!=null) {
lastLoc = tmpLoc;
}
}
//VS
// lastLoc2 = tmpLoc;
Lo.i("LocationHelper.lastLoc: "+LocationHelper.getLastLat(context)+ " / "+LocationHelper.getLastLon(context));
// Lo.i("LocationHelper.lastLoc : "+ lastLoc.getLatitude() + " / "+ lastLoc.getLongitude());
// Lo.i("LocationHelper.lastLoc2: "+ lastLoc2.getLatitude() + " / "+ lastLoc2.getLongitude());
if ((lastLoc2.getLatitude() != lastLoc.getLatitude()) || (lastLoc2.getLongitude() != lastLoc.getLongitude())) {
lastLoc2 = lastLoc;
// Lo.i("loc 2 updated");
// Lo.i("LocationHelper.lastLoc : "+ lastLoc.getLatitude() + " / "+ lastLoc.getLongitude());
// Lo.i("LocationHelper.lastLoc2: "+ lastLoc2.getLatitude() + " / "+ lastLoc2.getLongitude());
}else{
lastLoc = null;
// Lo.i("loc 2 is the same");
}
}catch(Exception e){
Lo.e(""+e);
e.printStackTrace();
}
}
public static String getLastLat(Context context){
// refreshLastLoc(context);
if (lastLoc==null) return "undefined";
return ""+lastLoc.getLatitude() ;
}
public static String getLastLon(Context context){
// refreshLastLoc(context);
if (lastLoc==null) return "undefined";
return ""+lastLoc.getLongitude() ;
}
/**
* Составляет строку из локации
*/
/* private static String stringFromLoc(Location loc){
double lat = loc.getLatitude();
double lon = loc.getLongitude();
Date date = new Date(loc.getTime());
return "lat: "+lat + " lon: "+lon + " time: "+ date+ " "+loc.getProvider();
}
*/
/**
* Берем последние известные в системе координаты
*/
private static Location getLastCopords() {
if (lManager==null) return null;
String[] providers = new String[]{ LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER, LocationManager.PASSIVE_PROVIDER };
Location loc = null;
for (String provider : providers) {
final Location locTmp = lManager.getLastKnownLocation(provider);
Lo.v("provider: "+provider+ " locTmp: "+locTmp);
if (loc == null && locTmp !=null) {
loc = locTmp;
Lo.i("first loc: "+provider);
}
else if (loc != null && locTmp !=null) {
Lo.i("loc pretendent: "+provider
+ " / loc: "+new Date(loc.getTime())+ " / tmp: "+new Date(locTmp.getTime()));
if(loc.getTime() < locTmp.getTime()-updTimeCriteria) {
loc = locTmp;
Lo.i("loc pretendent win by criteria ");
}
}
}
Lo.d("return loc provider: "+(loc==null? "null" : loc.getProvider()) );
return loc;
}
/**
* Включить или выключить вайфай
*/
public static void setWifi(Context cont, boolean active) {
try{
WifiManager wifiManager = (WifiManager) cont.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(active);
}catch(Exception e){
Lo.e("setWifi "+e);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment