GPS requestLocationUpdates minTime

GPS requestLocationUpdates minTime
2013-10-07T23:12:26+02:00
2013-10-16T21:23:09+02:00
2022-11-29T21:15:35+01:00
bancza
Sziasztok!

Service-ben valósítanék meg LocationListener-t.
A requestLocationUpdates paraméterében beállítok 10 másodpercet minTime-nak.
Egy ideig rendben megy a dolog. 10 másodpercenként feljön a GPS icon és frissül a hely adatai. Viszont ha egy ideig nem nyúlok a telóhoz, akkor ez az idő kitolódik 20, 40, 120 mp-re.
Még akkor is ez van ha haladok a telóval együtt.
Mi lehet ennek az oka?
És hogyan lehet megszüntetni?
Mutasd a teljes hozzászólást!
Az onlocationchange-be egy globál változónak átadod a a koordináta értékeit és ezt küldöd egy szálban a feldolgozónak vagy mented fájlba vagy amit szeretnél...

A külön szálad nem fog leállni lelassulni se. Gondolom ez azért történhet, mert a processnek leveszi az android az id-jét így nincs meg a megfelelő prioritás ezért történhet a csúszás.
Mutasd a teljes hozzászólást!

  • Hagyd a listenert dolgozni, egy thread-el kérdezd ki inkább időzítve az adatokat és azt jelenítsd meg vagy továbbítsd! Egy kis kód részlet nem ártana!
    Mutasd a teljes hozzászólást!
  • Az azért nem jó mert lezabálja az aksit.
    Mutasd a teljes hozzászólást!
  • Használj AlarmManager osztályt.
    Felébreszted 10 másodpercenként a GPS programodat.

    Keeping a GPS service alive and optimizing battery life

    3. válasz.
    Mutasd a teljes hozzászólást!
  • Ebbe a topicba beszállok én is. Korábban nekem is hasonlót kellett volna megvalósítanom, de én az istennek se tudtam kiismerni ezt a függvényt. Ugye két min értéket is megadsz neki (minTime, minDistance). Én valahol úgy olvastam, hogy az egyik kritérium (nem Criteria) a másik pedig egy javaslat, hogy melyik melyik azt nem tudom. Én úgy véltem logikusnak ezt, hogy a minTime letelte után megnézi a minDistance-t és ha az nagyobb mint a megadott érték, akkor visszatér. De sajnos nekem a valóságban nem így működött. Az első néhány időpont nagyjából ugyan olyan időbeli különbségre voltak egymástól, de a későbbiekben ez elcsúszott nekem. Lehet amiatt, hogy mikor letelt az idő nem talált rögtön műholdat és kis időbe beletelt mire lett koordináta. De én másképp valósítottam meg a dolgot, ellenőrzötten, ahogy én szerettem volna:
    Ugyanúgy szervizben futott mint előtte és a te esetedben. Volt egy saját timerem, a beállított minTime értékkel. Amikor az idő letelt, akkor lekértem az éppen aktuális koordinátát, nem requestUpdatettel, hanem single módon. Megjegyeztem a korábbi koordinátát. Ha a kettő távolsága nagyobb volt mint a minDistance akkor tároltam az új koordinátát és attól mértem a következőt.
    Mondom nekem sem sikerült kiismerni a metódust, jó volna rájönni ha valaki elárulja. Egyébként nekem kollégám úgy mondta, hogy nem gond ha be van kapcsolva a gps, nem fogyasztana akksit, csak akkor ha lekéri a koordinátát. Amikor hosszan nem kapott koordinátát bent az épületben, akkor kezdett el melegedni a telefonom és gondolom akkor is fogyott jobban az akksi. Sajnos kódból nem tudod bekapcsolni, így a felhasználót kell megkérni rá a program elején. Ezáltal végig bekapcsolva kell lennie a gpsnek a program futása alatt a szervizben. Bár nem tudom, hogy ez mennyire követelmény, mert nálam nem volt megengedve, hogy mindig mikor le akartam kérdezni a koordinátát, akkor riasszam a felhasználót, hogy "légy szíves kapcsold be a gps-t nekem".

    Fokozott figyelemmel kísérem a topicot.
    Mutasd a teljes hozzászólást!
  • Jogos!
    Viszont semmi információt nem kaptam a kódodró. Csak azt írtad,hogy "szenved" a listener! Azért sem feltétlen küldhet csak x,2x esetleg 3x időnként adatot neked, mert nem volt új koordinátád, aminek a tűrését szintúgy a kódból meglehetne állapítani.
    Én nem javasolom altatni a GPS-t.Több időbe telhet, majd még magához tér, jelet talál, már ha magához tér egyáltalán, aztán lehet resetelgetni stb... ha gps akkor plusz aksi vagy folytonos töltés sajnos.
    Mutasd a teljes hozzászólást!
  • Rosszul fogalmaztam!

    Természetesen én sem kapcsolgatom ki-be a GPS-t a konfig activity segítségével a felhasználóval. Úgy tudom csak az, hogy fizikailag be van kapcsolva az nem meríti az akksit. Viszont amikor fent van az ikon akkor van ténylegesen használatban.

    Tetszik a single mód mint ötlet, bár még nem néztem utána hogyan kell. Csak lekérdezéskor indul be a GPS, vagy folyamatosan fen van az ikonja.

    A kód nem túl érdekes, mert onLocationChange-ban csak az adatok egy objektumba másolása történik.

    public class Szerviz extends Service implements LocationListener, GpsStatus.Listener{ .... .... @Override public void onLocationChanged(Location aLocation) { JelentesObj id=JelentesObjectKeszites(aLocation); if(id.GpsInfo==1) gpsJelentes=id; else if(id.GpsInfo==2) netJelentes=id; SendToMain(UZENET_MAIN_INFO, "Provider: "+aLocation.getProvider());//adatok megjelenítése if(FutJelkeszites){ JelKezelo.AddToKuldendok(id);//fájlba mentés } } private void GpsFigyeloOff(){ if(lmGPS!=null){ lmGPS.removeGpsStatusListener(this); lmGPS.removeUpdates(this); lmGPS=null; } } private void GpsFigyeloOn(){ lmGPS=(LocationManager)getSystemService(Context.LOCATION_SERVICE); lmGPS.requestLocationUpdates(LocationManager.GPS_PROVIDER, Refresh*1000, 0, this); lmGPS.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, Refresh*1000, 0, this); lmGPS.addGpsStatusListener(this); } @Override public void onGpsStatusChanged(int event) { switch(event){//GPSState 0:OFF 1:ON 2:STOPPED 3:STARTED 4:FIX case GpsStatus.GPS_EVENT_STOPPED: GPSState=2; break; case GpsStatus.GPS_EVENT_STARTED: GPSState=3; break; case GpsStatus.GPS_EVENT_FIRST_FIX: GPSState=4; break; } if(lmGPS!=null){ GpsStatus gpsStatus = lmGPS.getGpsStatus(null); if((gpsStatus!=null) && (event==GpsStatus.GPS_EVENT_SATELLITE_STATUS)){ SatelliteDb = 0; for (GpsSatellite sat : gpsStatus.getSatellites()) if(sat.usedInFix()) { SatelliteDb++;//fixált }else{ //nem fixált } } gpsStatus=null; } } ... ... @Override public int onStartCommand(Intent intent, int flags, int startId) { SendToMainAllapot(); // jelzés hogy fut a szervíz return START_STICKY; }

    A feladat megköveteli, hogy a Refresh változtatható legyen menet közben is. Ezért

    GpsFigyeloOff(); Refresh=XXXX; GpsFigyeloOn();

    Akkor is jelentkezik a hiba ha olyan helyen haladok ahol van szerintem GPS lefedettség.

    Amíg a program activityje előtérben van minden rendben megy, viszont ha bezárom akkor jelentkezik.
    A lementett adatokból úgy tűnik mintha az Android kilőné a szervízt, majd valamikor újrainditaná.

    Ráadásul a fixált műholdak lekérdezése sem működik csak az összes műholdat tudom lekérdezni:


    if(lmGPS!=null){ GpsStatus gpsStatus = lmGPS.getGpsStatus(null); if((gpsStatus!=null) && (event==GpsStatus.GPS_EVENT_SATELLITE_STATUS)){ SatelliteDb = 0; for (GpsSatellite sat : gpsStatus.getSatellites()) SatelliteDb++; } gpsStatus=null; }
    Mutasd a teljes hozzászólást!
  • Hirtelen ránézésre látom, hogy kezeled a GPS állapotokat, az nem zavarhat be neked, hogy pl nincs GPS jel és akkor nem küld? Jelezném amit látsz GPS jelző ikont az nem feltétlen azonos a GPS regiszterében lévő értékkel így időben lehet eltérés(azt mutatja van jel és közben már nincs és fordítva)
    Mutasd a teljes hozzászólást!
  • Ha a GPSState-ra gondolsz az csak informális jellegű!
    Mutasd a teljes hozzászólást!
  • Amíg a program activityje előtérben van minden rendben megy, viszont ha bezárom akkor jelentkezik.


    Ezt részleteznéd kérlek
    Mutasd a teljes hozzászólást!
  • Tehát a MainActivity-t figyelve 10 mp-enként feljön az GPS icon és frissül az adat, de ha hagyom kikapcsolni a kijelzőt akkor már nem frissül az adat 10 mp időközönként. Függetlenül attól hogy kilépek-e a progiból (visszalépek a menübe) vagy sem előtte.
    Mutasd a teljes hozzászólást!
  • Igen ezért kéne a thread! A listenered a az activityddel fut ha azt lelövöd akkor meg áll az is. Egy külön szálra volna szükséged
    Mutasd a teljes hozzászólást!
  • Nem áll le a frissítés csak belassul.
    Mit tegyek külön szálba?
    vagy a <service android:procces=":valami"-re gondolsz?
    Mutasd a teljes hozzászólást!
  • Az onlocationchange-be egy globál változónak átadod a a koordináta értékeit és ezt küldöd egy szálban a feldolgozónak vagy mented fájlba vagy amit szeretnél...

    A külön szálad nem fog leállni lelassulni se. Gondolom ez azért történhet, mert a processnek leveszi az android az id-jét így nincs meg a megfelelő prioritás ezért történhet a csúszás.
    Mutasd a teljes hozzászólást!
  • Már azt is próbáltam.
    Az OnLocationChange-ben csak az objektumot hoztam létre, majd
    külön szálon figyeltem, hogy az obj!=null.
    Nem változott semmi.
    Lehet állítani a szerviz prioritását?
    Mutasd a teljes hozzászólást!
  • nekem úgy tűnik hogy a szervizzel történik valami
    Mutasd a teljes hozzászólást!
  • Amikor ezt (22:18) a hozzászólásodat olvastam a GpsState-ra gondoltam. De nem teljesen világos, hogy mi a gond szerinted. nem a tényleges állapot van a GpsState-ban? Amikor teszteltem ezt a részt nekem jó volt.
    Mutasd a teljes hozzászólást!
  • Hát kódot sajnos nem tudok nektek mutatni, mert az az előző cégnél maradt. Nekik írtam a kódot. Egy listviewban feldobálta az aktuális pozícióidat, ha az nagyobb távolságra volt, mint a felhasználó által beadott minDistance. A program ment, mert rendere adogatta hozzá a lista elemeket. Erre csak azért volt szükség, hogy ha a felhasználó rápillant, akkor lássa, hogy nem fagyott ki a program és rögzülnek a koordináták. Nos én nem szálkezeléssel oldottam meg, hanem szervizzel. Amikor a felhasználó elindította a programot, akkor elkezdtem rögzíteni a koordinátákat. Ha mászkált is bármerre akkor az folyamatosan rögzült. Ha akarta nézni, hogy működik-e a program, akkor felhívta a programot és látta. De amúgy ha például vezetés közben telefonált( tudom nem szabad) vagy mást csinált, mondjuk elindított egy zenét akkor a szerviz attól futott a háttérben, nem kellett neki foglalkoznia vele.

    Írtam egy osztályt, ami megvalósította a gps kezelést. Le tudtam kérdezni, hogy be van-e kapcsolva a gps meg ilyenek. A requestSingleUpdate-tel tudtam lekérni a koordinátát ha jól emlékszem. Majd ha megjött a koordináta és az nagyobb volt, mint 200 méter vagy amit beállítottál akkor visszadobta a koordinátát a felületnek, plusz mentette egy log fileba. Ez azért volt így jó, mert ha például bementél egy étteremben és ott fél órán keresztül ettél, akkor az idő alatt nem keletkezett új bejegyzés, vagy ha otthon lefeküdtél aludni és elfelejtetted kikapcsolni. A következő koordinátánál úgyis láttad, hogy mikor létesült (mentettem az időpontokat is), így tudtad követni, hogy itt most fél órán keresztül megálltam (ja akkor ebédelni voltam) utána meg itt 8 órán keresztül nem mentem sehova( ja az már egy másik napi dátum a következő), akkor valószínűleg elfelejtettem kikapcsolni előző nap este. Plusz összeadogattam a távolságokat a koordináták között, hogy lássa a felhasználó mennyit utazgatott egész nap.
    Mutasd a teljes hozzászólást!
  • Azt mondom, hogy nem feltétlenül egyezik meg a rendszer által mutatott ikon álapotával
    Mutasd a teljes hozzászólást!
  • Közben rájöttem, hogy a service áll le valami miatt!
    Új témát indítottam Stabil sevice néven.
    Bár a probléma nem oldódott meg számomra a legtöbb infot adó meklod400 válaszát fogadom el.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd