package org.hansel.myAlert; /*This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. Created by Javier Mejia @zenyagami zenyagami@gmail.com */ import org.hancel.http.HttpUtils; import org.hansel.myAlert.Log.Log; import org.hansel.myAlert.Utils.PreferenciasHancel; import org.hansel.myAlert.Utils.Util; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient; import com.google.android.gms.location.LocationClient; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.location.Geocoder; import android.location.Location; import android.location.LocationManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; //import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.provider.Settings; import android.support.v4.app.NotificationCompat; import android.telephony.TelephonyManager; public class LocationManagement extends Service implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener { private boolean mLocationTracking = true; // private String fileName=Environment.getExternalStorageDirectory()+"/hansel.txt"; private boolean mDisableTracking = false; private LocationManager mLocationManager; private static final int TWO_MINUTES = 1000 * 60 * 5; protected Location mLocation; private final Handler handler = new Handler(); private int minutos=5; private TelephonyManager tMgr; private int TrackId; // File file = new File(this.fileName); private LocationRequest mLocationRequest; private LocationClient mLocationClient; public LocationManagement() { // if file doesnt exists, then create it /*file.delete(); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); }*/ } public void setMinutos(int tiempo) { this.minutos=tiempo; } private final Runnable getData = new Runnable() { public void run() { getDataFrame(); } }; private void getDataFrame() { Log.v("Inicia Handler de Rastreo"); final boolean gpsEnabled = mLocationManager .isProviderEnabled(LocationManager.GPS_PROVIDER); if(mLocationTracking && !mDisableTracking) { if (!gpsEnabled && isGPSToggleable()) { enableGPS(); } mLocationTracking = true; } // escribe("Obteniendo datos"); //mLocationManager.removeUpdates(this); //enviamos URL al WS URL debemos mejorar el WS /*String url = Util.URL_TRACKING+"idAndroid="+TrackId+"&id=0&idCel="+CelId+"&latitude="+Latitud +"&longitude="+longitud+"&nivbat="+Util.getBatteryLevel(getApplicationContext())+"&fechas=&horas="+ "&usn="+mUser; Log.v("Enviamos URL de rastreo: "+url); */ new conexionWS().execute(); handler.postDelayed(getData,1000*60*minutos); /* * ID android * telefono * lat * long * bat * */ } private void getLocation() { if (mLocationClient!=null && mLocationClient.isConnected() && isBetterLocation(mLocationClient.getLastLocation(), mLocation)) { mLocation = mLocationClient.getLastLocation(); }else { mLocation = mLocationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER); } if(mLocation!=null) { // escribe(mBestProvider+ " http://maps.google.com/?q="+mLocation.getLatitude()+"," // +mLocation.getLongitude()); Log.v(""+ " http://maps.google.com/?q="+mLocation.getLatitude()+"," +mLocation.getLongitude()); } else { try { Log.v("error tomando el GPS vamos a hacerlo por celdas "); String posicionCeldas = tMgr.getCellLocation().toString().replace("[", "").replace("]", ""); System.out.println(posicionCeldas); //09-14 12:14:37.599: I/System.out(1980): ....> [8,2703,8,19.4311,-99.16801] try{ if(!posicionCeldas.equals("")){ // Vector<String> celdas = Util.splitVector(posicionCeldas, ","); //Latitud = Double.valueOf(celdas.get(3)); //longitud = Double.valueOf( celdas.get(4)); // escribe("Celdas: http://maps.google.com/?q="+Latitud+","+longitud); } }catch (ArrayIndexOutOfBoundsException a) { // TODO: handle exception System.out.println("No se encontro tampoco por las celdas -> " + a.getMessage()); }catch (Exception e) { Log.v("Error usando Celdas:"+e.getMessage()); } }catch(Exception ex) { Log.v("Error obteniendo celdas:"+ex.getMessage()); } } } public void stopGPS() { Log.v("Detenmos Rastreo"); //mLocationManager.removeUpdates(this); } public void startGPS(String provider) { //escribe("inicia rastreo StartGps: " + provider); Log.v("Buscando provider"+provider); // mLocationManager.requestLocationUpdates(provider, NORMAL_INTERVAL,NORMAL_DISTANCE , this); } public void disableTracking() { // If the client is connected if (mLocationClient.isConnected()) { mLocationClient.removeLocationUpdates(this); } /* * After disconnect() is called, the client is * considered "dead". */ mLocationClient.disconnect(); mDisableTracking = true; handler.removeCallbacks(getData); stopGPS(); } private boolean isGPSToggleable() { PackageManager pacman = getApplication().getPackageManager(); PackageInfo pacInfo = null; Log.v("Intenamos ver si se puede activar GPS"); try { pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS); } catch (NameNotFoundException e) { return false; } if (pacInfo != null) { for (ActivityInfo actInfo : pacInfo.receivers) { if (actInfo.name .equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported) { return true; } } } return false; } private void enableGPS() { Log.v("Intentamos Activar el GPS(no funciona en todas las versiones) "); String provider = Settings.Secure.getString(getApplication().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (!provider.contains("gps")) { final Intent poke = new Intent(); poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory(Intent.CATEGORY_ALTERNATIVE); poke.setData(Uri.parse("3")); getApplication().sendBroadcast(poke); } } protected boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { return true; } long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; if (isSignificantlyNewer) { return true; } else if (isSignificantlyOlder) { return false; } int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation .getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } /** Checks whether two providers are the same */ private boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); } public void StartTracking() { handler.post(getData); } @Override public void onLocationChanged(Location location) { Log.v("On Loc Change"); if(location!=null) { String geoCodedLocation; geoCodedLocation = Util.geoCodeMyLocation(location.getLatitude(), location.getLongitude(),getApplicationContext()); if (isBetterLocation(location, mLocation) && Geocoder.isPresent()) { try { //enviamos al servidor el mensaje de reastreo Log.v("Cambio de Localizacion: "+geoCodedLocation); } catch (IllegalArgumentException e) { } mLocation = location; } } } /*private void escribe( String contenido) { try { Calendar c = Calendar.getInstance(); FileWriter fw = new FileWriter(file.getAbsoluteFile(),true); BufferedWriter bw = new BufferedWriter(fw); bw.append(c.getTime()+" "+contenido); bw.newLine(); bw.close(); System.out.println("Done"); } catch (IOException e) { e.printStackTrace(); } }*/ @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { tMgr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); mLocationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); showNotification(); /* CelId = Util.getIMEI(getApplicationContext()); if(CelId.length()>=5 ) { CelId = CelId.substring(0, 5); }*/ minutos = intent.getIntExtra("minutos", 5); long UpdateInterval = ( minutos *60)*1000 -(4000) ; //inicia actualizacion 20 segundos antes de obtener nuestros datos long fastUpdate = UpdateInterval - (60*1000); // actualiza el fast a la mitad de tiempo TrackId = intent.getIntExtra("track", 0); //new google PLay service api mLocationRequest = LocationRequest.create(); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); mLocationRequest.setInterval(UpdateInterval); mLocationRequest.setFastestInterval(fastUpdate); mLocationClient = new LocationClient(this, this, this); mLocationClient.connect(); handler.post(getData); //indicador si el servicio esta iniciado,nos servir� si se reinicia el dispositivo //o alg�n otro metodo de inicio return(START_STICKY); } @Override public void onDestroy() { disableTracking(); stopForeground(true); } private void showNotification() { Intent i=new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP); i.addCategory(Intent.CATEGORY_LAUNCHER); PendingIntent pi=PendingIntent.getActivity(this, 0, i, 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle(getResources().getString(R.string.app_name)) .setContentText("Hansel Running") .setContentIntent(pi) ; Notification notif = mBuilder.build(); notif.flags = Notification.FLAG_NO_CLEAR; startForeground(1337, notif); } private class conexionWS extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { try { getLocation(); HttpUtils.sendTrack(PreferenciasHancel.getDeviceId(getApplicationContext()) , String.valueOf( TrackId) , String.valueOf(PreferenciasHancel.getUserId(getApplicationContext())) , String.valueOf(mLocation.getLatitude()) , String.valueOf(mLocation.getLongitude()) , String.valueOf(Util.getBatteryLevel(getApplicationContext()))); } catch (Exception e) { } return null; } } @Override public void onConnectionFailed(ConnectionResult arg0) { if(mLocationClient!=null) { mLocationClient.connect(); } } @Override public void onConnected(Bundle arg0) { mLocationClient.requestLocationUpdates(mLocationRequest, this); } @Override public void onDisconnected() { if(mLocationClient!=null) { mLocationClient.connect(); } } }