Beiträge von Marco Feltmann

    Also meine Webzeit ist ewig her.
    (Sieht man unter Anderem auch daran, dass meine Website selbst ein hässliches leeres Etwas ist... ^^)


    Ich bilde mir ein mich zu erinnern, dass das Unterfangen nicht allzu simpel ist.
    Die Bandbreite eines Anschlusses können diverse Testportale nur durch eine ganz simple Methode ermitteln: Zeitstempel setzen, xMB Daten senden, Zeitstempel setzen, zurückrechnen.
    Das fällt für deinen Anwendungsfall natürlich völlig aus. Wenn du dem User eh erst mal 5MB Testdaten geben willst kannst du ihm auch gleich das 7,34MB Video senden. ;)


    Soweit ich mich erinnere ist HTTP aus Serversicht ja ein komplett asynchrones Protokoll.
    Es kommt was rein, es geht was raus, es kommt was rein, es geht was raus.
    Während 'es geht was raus #1' noch empfangen wird (Beispiel: Download) ist 'es geht was raus #2' bereits fertig ausgeliefert (Beispiel: weitere Seite desselben Servers über dieselbe Session)


    Kurz: mir ist keine schnuffige Lösung bekannt, mit der der Webserver herausfindet, welche Bandbreite sein Client unterstützt.
    Gemäß Protokoll ist dem Server das auch vollkommen egal.
    Sorry. :(

    +hm+
    Ein Problem habe ich nach wie vor noch.
    1) Mein Simulator sagt permanent, dass kein GPS verfügbar sei. Gut, okay, mag sein. Ist ja kein Empfänger drin.
    (hasGPS ist in der AVD eingestellt.)


    2) Meinem Gerät kann ich die Daten nicht unterjubeln, da der Reiter ausgegraut ist, sobald ich mich nicht auf einem der Emulatoren befinde.


    Jedwede Hilfe ist willkommen. :)

    Hei matthias,


    danke für den Tipp mit dem DDMS.
    Den hab ich zwar meistens aus, weil er mir oft die ADB zerschießt und demnach habe ich da auch nur maximal auf den FileExplorer geschaut.
    Jedenfalls tut es offenbar genau das, was ich brauche. Hervorragend, danke! :)


    [schymura]
    Daten fertiger Tracks sind eine supergute Idee. Nur wird es von dem Gebiet noch keinerlei fertigen Tracks geben. ;)
    Ich möchte die FIndigkeit und Fuchsigkeit der Wanderer, Jogger und GeoCacher natürlich nicht in Frage stellen. Da das betreffende Gelände allerdings seit Jahren komplett abgesperrt ist und extrem umgebaut wird bin ich mir sicher, dass keinerlei Daten dafür existieren. =)

    Hallo Lucas de Vil und CdWechsler,


    Lucas de Vil:

    Ja, die Geodaten sind frei, und die Kacheln (Tiles) snd es auch. Nur wenn man sie irgendwo als Bild veröffentlicht, muss man das Copyrigth reinschreiben.


    Ich fürchte, wir reden hier aneinander vorbei.
    Die Kacheln gibt es in unterschiedlichen Ausführungen. Die einen Tiles sind Graphiken, Images, Bilder... was auch immer. Also binäre Datenformate mit Repräsentationen der OSM Daten. Und diese sind nicht frei.


    Deine PBF Dateien sind nichts weiter als die reinen OSM Daten im Protocollbinary Buffer Format.
    http://wiki.openstreetmap.org/wiki/DE:PBF_Format


    Es gibt keine Vectorgraphiken. Du hast nichts weiter als die XML-Daten von OSM stark komprimiert.


    Und ich möchte zumindest auf nem Smartphone mit Kacheln abrbeiten, denn die brauche viel zu viel Speicherplatz....
    Und online ist auch keine gute Idee für mich, denn ich möchte die App, die mir vorschwebt vor allem im Wald und in Tälern benutzen, allerdings auch in Ortschaften.


    Sehr löblich. Ich habe allerdings keine 64GB µSD Karte, auf der ich die Kacheln unterbringen könnte. ;)
    Genau genommen habe ich nicht einmal eine 8GB µSD Karte... :-/


    ich meine, wie komme ich bei Vektorkarten, die es ja etwa bei http://download.geofabrik.de/ als osm.pbf-Dateien gibt frei und die nur etwa 10% des Speicherplatzes wegnehmen aus der GPS-long, bzw. lat Angabe erstnes zu der betreffeden PBF-Datei und zweitens, wie muss ich mit den Daten dann ev. noch die Karte rendern????


    Ich wiederhole mich an dieser Stelle gern, weil es so wichtig ist.
    1) Du hast keine Vektorkarten. Bei dem Link gibt es keine freien Vektorkarten. Du bekommst die OpenStreetMap Daten in einem stärker komprimierten Format als XML. Dennoch bekommst du nur und ausschließlich die OpenStreetMap Daten!


    2) Daraus folgt: du kannst nicht an Hand einer Latitude/Longitude Angabe irgendwelche Dinge aus den Daten ziehen. Vielmehr müsstest du die Datei komplett parsen (Das wird bei 10GB allein für Deutschland ein weniglich dauern...) und dann on-the-fly Bilder daraus rendern.
    Das wird sicherlich keine Hardware mitmachen.


    Bisher habe ich mit OSMAND gearbeitet (beim wandern). Gefällt mir auch sehr gut, man kann es wirklich offline benutzen (selbst im Fluzeugmodus), wenn man vorher die Vektorkarten vom PC aus Smartphone geschoben hat. Der GPS-Empfänger verbraucht nicht viel Strom, dumm ist nur, da ja OSMAND ein Navi ist, dass die ganze Zeit der Screen an bleibt, außer man schaltet das Programm ab.


    OSMAND klingt erst einmal gut. Welche Vektorkarten hast du denn vom PC aus aufs Smartphone geschoben?
    Ebenfalls die unglaublich große OSM-Daten beinhaltende .pbf Datei? Oder hast du mit zusätzlichen Programmen daraus Karten rendern lassen?


    Also wenn du eh ~10GB Platz auf der SD-Karte voraussetzt (um die .pbf darauf zu bekommen), dann kannst du dich auch an TileMill setzen und die Tiles selbst erstellen sowie auf die SD packen lassen.
    Da kommt dann wieder die Betitelung der Ordner an die Oberfläche und schon kann man mit vorhin verlinktem Algorithmus die Daten herausfinden.

    Moin,


    ich suche nach einer Möglichkeit, GPS Werte den Simulator oder Gerät unterzuschieben.


    Hintergrund:
    eine ziemlich komplexe App soll Schnitzeljagdfunktionalitäten haben.
    Leider fürchte ich, dass ich als alter Sesselpupser mit Laptop im Freien nicht sehr gut aufgehoben bin – ganz abgesehen davon, dass ich echt keinen Bock habe, mehrere Kilometer Fußweg zurückzulegen.


    Ich brauche also eine bequeme Möglichkeit, mit der ich dem Simulator (oder wenigstens dem Gerät) mitteilen kann, an welcher Position es sich zu befinden glauben soll.


    Gibt's da was von Ratiopharm?

    [CdWechsler]
    Das sind doch gute Nachrichten. :)


    [schymura]
    Nun, das Hauptproblem bei deiner Frage ist, dass es sich rein rechtlich nicht um GPS handelt.
    Die Kartendarstellung ist halt so ein spezielles Problem.


    Google Maps bietet seinen Kartenservice soweit ich informiert bin nur über die eigenen Apps an. Wer sonst irgend welche Karten benötigt, darf sie nicht einfach rauskopieren und woanders benutzen.
    Noch ein bisschen härter ist der Fall bei OpenStreetMaps. Dort sind nur die Geodaten offen, die Karten unterliegen anderen und je nach Hersteller speziellen Bedingungen. Leider habe ich grad 0 Übersicht, welcher Kartenanbieter welche Lizenz bedingt.


    Was die Umrechnung betrifft:
    zumindest für OpenStreetMap gibt es da eine Anleitung, wie aus den Positionsdaten die Pfade zu den Bildern erstellt werden können.
    http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Java

    Moin,


    ich werd irre mit Android. Mal wieder.
    Nach etlichem Hin und Her habe ich jetzt endlich ein paar Modellklassen fertig (so 15 Stück), die ich gern unverändert lassen möchte.
    Natürlich werden sich diese ganz gewaltig ändern, liegt ja in der Natur von Modellen.


    Beim bösen Feind aus Cupertino läuft das alles ganz flüssig, die legen mir automatisch eine Testklasse an, ich schmeiß da meinen Scheiß rein, klicke auf 'Testing' und – et voilá – fertig.


    Bei Android bin ich offenbar nicht einmal fähig einen einzigen Unit Test für ein einziges Modell anzulegen. Das Internet ist voll von Tutorials, mit denen ich meine Activity getestet bekomme – was mir allerdings erst mal völlig wurscht ist, weil die alles Andere als fertig ist.


    Die Testing Fundamentals sind ebenfalls alles Andere als aufschlussreich. So sehe ich zwar, dass mir ein 'TestCase' reichen sollte, nur sagt mir niemand, wie ich das alles verdrahtet bekomme oder wie ich Selbigen starten kann.


    Und wenn ich dann noch Informationen wie Speicherverbrauch oder Zeitübersicht haben möchte, bin ich völlig aufgeschmissen.


    Hat jemand für mich einen Tipp, wie ich ziemlich zielgerichtet zumindest meine 15 Modelle getestet bekomme?
    Ohne ActivitySchnickSchnackGelöt, bitte.

    Moin,


    also ich persönlich habe die Feststellung gemacht, dass Performanceprobleme immer und ausschließlich an mir liegen. ;)
    Und auch bei dir würde ich behaupten, dass das Problem nicht die Aufteilung der Klassen ist.
    Ich persönlich versuche ja, die Apps auf den langsamsten und grottigsten Geräten zügig zum Laufen zu bekommen und dem User möglichst nicht mit irgendwelchen Dingen auf die Nerven zu gehen.


    Insofern sehe ich in deinem Konzept schon einmal mindestens zwei Fallstricke, die ich meinen Usern nicht zumuten möchte.


    1) Du machst viel über das Internet. Sehr viel. Verdammt viel. Viel zu viel.
    Wenn ich deinen Mediaplayer jetzt im Ausland nutzen möchte, dann werde ich dabei vermutlich arm. Die Kosten für Auslandsroaming werden mich auffressen.


    2) Weiterhin ist das Gerät nur am Arbeiten, permanent. Wenn der wirklich 1x je Sekunde $irgendwas im Netz macht, dann braucht er dafür Strom (den Datenteil des GSM-Modems starten und verwalten), RAM (die Connection speichern, Daten holen, die noch verarbeiten) und CPU Leistung. Alles in Allem also alles Andere als performant.


    Navigon und Konsorten rufen die Ortsbestimmung ab, doch das geschieht über Location Services, nicht über das Internet. Generell ist es so, dass das GPS Modem im Hintergrund agiert, sobald eine App darauf zugreift. Das ist völlig okay und der Stromverbrauch ist konstant hoch. Das wird nicht weniger, wenn du einen Zeitintervall einstellst. GPS funktioniert nur mit permanenter Verbindung. Die Timeouts, die du einstellst, sind lediglich Schwellwerte an denen das Betriebssystem dir die neuen Daten mitteilt. Ob du jetzt jede geänderte Location mitnimmst oder dich nur alle 15 Minuten informieren lässt ist irrelevant für den Stromverbrauch des GPS Modems.

    Doch natürlich sieht das Ganze komplett anders aus, wenn du nur alle 15 Minuten mal mit Google quatscht um die Position anzeigen zu lassen oder ob du das jede Sekunde tust. Deine Internetlastigkeit dürfte hier das Hauptproblem sein.


    Was bezweckst du eigentlich genau mit dieser App?
    Mein erster Gedanke wäre, eine Art Kombiapp für Jogger anzubieten. Einerseits ein Musikplayer und andererseits können sie ihre Laufstrecke per GPS tracken.
    In dem Fall wäre natürlich der Medienplayer als Service eine gute Idee. Gibt es da keine fertige Komponente im OS?
    Und in dem Fall bräuchtest du auch überhaupt keine Map mitlaufen lassen. Das wird den Jogger ebenso wenig interessieren wie die Position des aktuellen Titels.
    (Auf seiner Strecke sieht er ungefähr wie weit er ist und bei seinem Titel hört er es vermutlich ungefähr, da er ja seine bekannte Joggingliste abspielt.)
    Das Speichern der GPS-Koordinaten würde trotzdem funktionieren und am Ende kann er das ja meinetwegen als GPX oder KML exportieren und sich online oder mit Google Earth anschauen.


    Wie dem auch sei, hier Tipps zu geben wird schwierig, wenn man das Anwendungsgebiet deiner App nicht kennt. :)

    Stimmt, du hast recht. Habe ich völlig vergessen. Die Threads werden ja parallel im Hintergrund ausgeführt, während der UI-Thread weiter macht. Wenn ich den blockieren würde, bis die Threads abgearbeitet und geschlossen wurden, wäre das keine gute Lösung. ok... dann mache ich das mal anders.


    Das ist etwas, dass ich an Androids Zwang zum Nebenthread für Netzwerkkommunikation hasse. ;)
    Am Einfachsten wäre es wohl, wenn du nur eine 'Konnektivität wird geprüft'-Activity vorschaltest und nach erfolgreichem Prüfen der Server die wahre MainActivity startest.



    Eine andere Frage: ich dachte mit dem handler ein callback-mechanismus implementiert zu haben!? (siehe code: handler.post(new Runnable() { ... }); ). Könntest du mir einen Beispiel geben wie du das gemeint hast? (allgemein gefragt)


    Nun, dein Callback-Mechanismus ist kein Callback-Mechanismus.
    Du führst deine Aktion lediglich auf dem Mainthread aus. Das bedeutet aber eben nicht, dass deine Activity ihre Objekte manipuliert – sie ändert nur die Objekte aus deinem Thread.


    Ein 'richtiges' Callback besteht im Groben aus zwei Komponenten.
    1) Einem Java Interface
    2) der Zuweisung eines Objekts dieses Interfaces


    Beispiel:

    Java
    public interface StatusChecker
    {
      public void serverIsOnline(ServerOnlineCheck theServer);
      public void serverIsOffline(ServerOnlineCheck theServer);
    }


    Deine Activity muss nun dieses Interface implementieren und damit auch die Methoden bereitstellen.
    (Finde ich ein bisschen dämlich, weil es keine optionalen Methoden gibt, man also ALLES aus dem Interface implementieren muss. Java ist nun einmal so starr.)


    Deinen Thread gibst du jetzt noch ein Objekt mit, dass eben dieses Interface implementieren muss.

    Java
    public class ConnectionControlThread implements Runnable 
    {
      private StatusChecker callbackObject;
    //...


    In deiner Activity setzt du entsprechend diese Instanzvariable:

    Java
    //...
    			Thread thread1 = new Thread(ccThread);
    			thread1.setCallbackObject(this);
    			thread1.start();
    //...


    Und in deinem Thread hast du nicht mehr allzu viel zu tun:


    Es wäre übrigens noch um Längen geiler, wenn du statt eines blöden Threads lieber einen ASyncTask nützest.


    Aber mir kam es ja eigentlich darauf an irgendeine Funktion zu haben, die schon durch ihren Namen sagt, was sie macht. Etwa so wie das Gegenteil von tostring(), damit ich auch noch mit Alzheimer verstehen kann, was ich mal gewollt habe, ohne dass ich da einen Kommentar setzen müsste...


    Da bist du bei Java vermutlich falsch aufgehoben.
    Ich persönlich komme jedenfalls bei dictionary.put(String,String) immer durcheinander – und das ist halt ein Standardgedöns.
    Sprechender wäre da dictionary.putKeyValuePair(String, String)...


    Wie dem auch sei, ein fachkundiger Dritter weiß, dass die ASCII-Representation eines Zeichens im Typen 'char' gespeichert wird. Char wie Character = Buchstabe.
    Insofern ist string.charAt(position) ausreichend sprechend. ;)

    block_
    habe dein post gerade gelesen. Ähm.. ja genau so sieht es aus :)
    Aber wie können die werte false sein? diese werte gebe ich doch über den thread? bei der deklaration habe ich zumindestens keine werte zugewiesen (siehe code). wie sollte/könnte man das dann lösen?


    Der Programmablauf ist doch der:
    onCreate wird ausgeführt
    Thread wird erstellt
    Thread wird gestartet
    onCreate wird weiter verarbeitet.


    Was im Thread passiert muss da noch gar nicht existieren.
    Entweder du machst statt eines Threads eine Runnable und vergleichst dann die Zustände am Ende der Runnable.
    Oder du machst es richtig und stellst für die Threads noch Callback-Funktionen ein, die aufgerufen werden, wenn die Status ordentlich geprüft wurden.

    Deine Klasse hat offentsichtlich keinen Zugriff auf das TextView.
    Entweder gibst du deiner Klasse eben dieses TextView als Referenz mit (würde ich lassen) oder du baust eine Callback-Funktion ein.


    Diese rufst du im OnClickListener auf und der gibt dann einfach den String zurück.