Autore Topic: Service che non collaborano :/  (Letto 602 volte)

Offline Gioce90

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Service che non collaborano :/
« il: 25 Settembre 2012, 11:18:20 CEST »
0
Ciao a tutti... Credo che questa sia la sezione giusta.
Io avrei creato un'applicazione per un progetto universitario, solo che sono arrivato a un punto fermo.

In una customDialog ci sono vari tasti.
Il tasto INIZIO dovrebbe far partire un service in background (LogService) che inizia a registrare la posizione gps e i dati dell'accelerometro (per ora li riporta su LogCat).
Inoltre non appena il tasto INIZIO è premuto accade che:
- il tasto INIZIO scompare e appare il tasto NOTE
- il tasto TERMINA si abilita.

Tutto funziona correttamente se il gps è attivato. È perfetto, fa esattamente ciò che voglio.
I problemi giungono però se decido di fare un controllo in più, ovvero... e se il gps fosse disattivato?
1. non voglio che si avviino i service (oppure voglio che si arrestino subito perlomeno)
2. a livello grafico non devono cambiare i tasti: INIZIO rimane così com'è, NOTE non appare, e TERMINA rimane disabilitato.
3. Deve comparire un Toast che mi dica "Impossibile avviare l'intervento: il GPS è disattivato!"

Mi sto trovando seriamente in difficoltà.

Vi mostro il listener di INIZIO nella customDialog. Quello che vedete commentato è il controllo in più che non mi riesce (stavo pensando al sollevamento di un'eccezione inizialmente):

Codice (Java): [Seleziona]
        /* *** LISTENER *** */
        View.OnClickListener startIntervento = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        // Deve partire il servizio di localizzazione + scrittura file di log
                        Intent i = new Intent(getContext(), LogService.class);
                        getContext().startService(i);

                        /*try {
                                //if (CONTROLLO SUL SERVIZIO LogService (che francamente non so più come fare -.- ){*/

                                        Toast.makeText(getContext(), "L'intervento è ora in corso", Toast.LENGTH_SHORT).show();
                                        findViewById(R.id.intervento_start).setVisibility(View.GONE);
                                        findViewById(R.id.intervento_note).setVisibility(View.VISIBLE);
                                        findViewById(R.id.intervento_stop).setEnabled(true);
                                        intervento.setStato(Stato.started);
                                /*}
                        } catch (LogServiceException e) {
                                Toast.makeText(getContext(), "Impossibile avviare l'intervento:\n"+e.getMessage(), Toast.LENGTH_LONG).show();
                                // e.get
                                Log.i("INTERVENTO", "Errore GPS o Accelerometro!");
                                getContext().stopService(i);
                        }*/

                }
        };

Questo è ciò che c'è dentro LogService:
Codice (Java): [Seleziona]
public class LogService extends Service {
       
        private Timer timer;
       
        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        private static Date timestamp = new Date();
        private static double latitude;
        private static double longitude;
        private static double altitude;
       
       
        @Override
        public IBinder onBind(Intent intent) {
                return null;
        }
       
       
        @Override
        public void onCreate(){
                super.onCreate();
                String providerId = LocationManager.GPS_PROVIDER;
                LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
               
                if (locationManager.isProviderEnabled(providerId)){
                        LocationProvider gpsProvider = locationManager.getProvider(providerId);
                        if (gpsProvider != null) {
                                locationManager.requestLocationUpdates(providerId, 30000, 5, myLocationListener);
                                Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                if (location != null)
                                        updateLocationData(location);
                        }
                }
               
                Intent i_acc = new Intent(this, AccelerometerService.class);
                startService(i_acc);
               
                Intervento intervento = Manager.getInterventoChoose();
                final int id = intervento.getID();
               
                Log.i("LogService", "Servizio avviato");
                               
                TimerTask task = new TimerTask() {
                        @Override
                        public void run() {
                                Log.i("Log", "Intervento in esecuzione: " + id);
                                //TIMESTAMP + COORDINATE + ACCELEROMETRO:
                                printOnLog();
                        }
                };
               
                // Ricava da settings.xml il parametro "tempo" per il timestamp (60 secondi)
                long tempo = getResources().getInteger(R.dimen.time_second_timestamp);
                tempo = Long.valueOf(tempo+"000");
                timer = new Timer();
                timer.schedule(task, 0, tempo);
        }
       
       
        @Override
        public void onDestroy(){
                super.onDestroy();
                if (timer!=null)
                        timer.cancel();
                timer = null;
                //stopService(new Intent(getBaseContext(), GpsService.class));
                stopService(new Intent(getBaseContext(), AccelerometerService.class));
                Log.i("LogService", "Servizio arrestato");
        }
       
       
        private void updateLocationData(Location location) {
                timestamp = new Date();
                latitude = location.getLatitude();
                longitude = location.getLongitude();
                altitude = location.getAltitude();
        }
       
       
        public void printOnLog() {
                Log.i("GPS", "Timestamp: "+sdf.format(timestamp));
                Log.i("GPS", "Latitudine: "+String.valueOf(latitude));
                Log.i("GPS", "Longitudine: "+String.valueOf(longitude));
                Log.i("GPS", "Altitudine: "+String.valueOf(altitude));
                Log.i("ACC", "Accelerometro: "+AccelerometerService.getCoordinate());
        }
       
       
        public LocationListener myLocationListener = new LocationListener() {
               
                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {}
               
                @Override
                public void onProviderEnabled(String provider) {}
               
                @Override
                public void onProviderDisabled(String provider) {}
               
                @Override
                public void onLocationChanged(Location location) {
                        updateLocationData(location);
                }
        };
}