Beiträge von Marco Feltmann

    Du beschreibst jetzt weniger einen analogen Recorder als viel mehr ein VoiceMemo-Schnittsystem.
    Zumindest nach meinem Verständnis.


    Du hast also im Groben drei Kernkomponenten:
    – VoiceMemo aufnehmen
    - VoiceMemo abspielen
    - VoiceMemo verwalten


    VoiceMemo aufnehmen) dürfte klar sein. VoiceRecorder starten, drauf los brabbeln, stoppen, speichern, fertig.


    VoiceMemo abspielen) bedarf etwas mehr Überlegung. Am Sinnvollsten wäre wohl, auf eine Selektion zu prüfen. Keine Selektion: alles in der Reihenfolge der Liste abspielen. Selektion: nur die Selektion abspielen. Multiple Selektion: alle selektierten Files in der Reihenfolge der Liste abspielen


    VoiceMemo verwalten) wird dann die Komponente mit dem meisten Hirnschmalz. Liste mit manueller Sortierung, die gemäß der Sortierung im Dateisystem initial befüllt wird, Auswahl der Schnippsel, Löschen und Hinzufügen von Daten, eventuell noch das Berücksichtigen der .nomedia Datei und entsprechend die Verwaltung der Activities VoiceRecorder und MediaPlayer. (Man muss ja nicht alles selbst basteln.)


    Ein ansprechendes UI für diese dritte Komponente stelle ich mir am Kompliziertesten vor, das Projekt an sich ist auf jeden Fall realisierbar.

    Also wer angeordnet hat, das ganze müsse via C/C++ realisiert werden, hat von App-Entwicklung unter Android keine Ahnung.


    Aus eigener Erfahrung kann ich sagen: 'nativer' C/C++ Code wird auf dem Gerät arschlangsam laufen. Android und das zu Grunde liegende Dalvik (die virtuelle Maschine, auf dem das Android läuft) sind so dermaßen für Java optimiert, dass 'nativer' C/C++ Code auf den Geräten ewig lange braucht.


    Hinzu kommt, dass Du nicht einfach so C/C++ Code eintippen und loslegen kannst. Du musst zu jeder C/C++ Funktion eine Java-Methode erstellen und das Ganze dann brücken.
    Die (verlinkte) Dokumentation sagt dazu:

    Zitat

    Don’t assume you’ll increase your application’s performance just because you’re using native code. The Java<->Native C exchanges add some overhead, so it’s only really worthwhile if you’ve got some intensive processing to do.


    Das ist leider wirklich so. Ich hatte seinerzeit™ vor, ein bisschen CPU-hungrige GSP-Berechnungen in C auszulagern. Da ich Werte an den C-Code übergeben und die Ergebnisse an den Java-Bridgecode zurückgeben musste, dauerte das Ganze ungelogen 3x so lange wie mit Java.
    Es ist also auf keinen Fall empfehlenswert.


    Eventuell weiß der Auftraggeber das nicht. So etwas zu evaluieren gehört auch zu Deinen Aufgaben in der Angewandten Informatik. ;)
    Generell ist ein reibungsloses Einbinden von C/C++ Code weder in Android noch in Windows Phone möglich.
    Wie es bei Blackberry aussieht kann ich nicht beurteilen. Ubuntu Phone und iOS hingegen sind ausgesprochen offen für diese Dinge.


    Weiterhin klingt 'fernsteuern' so, als ob Du einerseits Aktionen definieren können musst als auch die Resultate ersichtlich sein sollen.
    Sprich: Du tippst auf das Gas und willst gleichzeitig sehen, wie die Umgebung schneller an Dir vorbei rauscht.
    Analoge Eingaben wie die Druckkraft auf das Gas stelle ich mir sehr schwer zu realisieren vor. Und die Echtzeitdarstellung via Stream dürfte auch alles Andere als einfach werden.


    Die erhaltenen Informationen in dem Beiblatt sind sehr dürftig. Es gibt zwar einen Bereich, der sich an Entwickler richtet, doch ist dieser ausschließlich für die Manipulation der Wegstrecken gedacht. Das alles hilft Dir in keinster Weise weiter.


    Befürchtung: das ganze System ist eine BlackBox, das heißt, alles läuft darin gekapselt von der Außenwelt ab. Du kannst also höchstens per mit Kabeln angeschlossener Peripherie (Gaspedal, Bremspedal, Lenkrad) den Simulator steuern und bekommst die Anzeige ausschließlich über Grafikausgänge wie DVI oder HDMI präsentiert.


    In dem Fall wird die App das kleinste Übel und es ist dann auch völlig egal, ob das in Ruby, Phython, Java oder ASM realisiert wird. In dem Fall brauchst Du nämlich eine Hardware mit Zugriffsmöglichkeit ((W)LAN oder Bluetooth z.B.), die je nach erhaltenem Signal die Informationen an den Simulator sendet.
    Diese Hardware muss dann eine API liefern, mit derer Hilfe sie den Simulator beeinflusst.


    Als allerersten Schritt solltest Du die Softwareentwicklung des Herstellers kontaktieren und in Erfahrung bringen, ob die Fernsteuerung des Simulators bereits in einem Modul implementiert wurde, dieses Modul und die Dokumentation anfordern und um die API dieser Dokumentation herum eine App basteln.


    Falls es die Fernsteuerung des Simulators nicht gibt, benötigst Du die API für die einzelnen Steuerelemente (Gas, Bremse, Lenkung, Blinker...) und musst Dir darum eine fest verdrahtete Hardware basteln, die dann per Netzwerk gemäß einer eigenen von Dir ausgedachten API gesteuert wird.


    Ersteres ist ja noch machbar, bei Zweiterem wird es ein Aufwand, mit dem Du Deiner Uni locker zehn Mitarbeiter für 6 Monate abluchsen kannst. Alleine in einem Semester mit Vorlesungen, Klausuren und all dem Schmiss wird das Projekt mit eigener Hardware mehr als sportlich. :)

    Wenn Du dein Layout mit je einer neuen Activity versiehst, dann kannst Du ja bequem über die dazugehörige Methode onBackPressed() gehen.
    Je nach Activity machst Du halt irgendwas anderes.


    Arbeitest Du hingegen mit Fragments, dann kannst Du beispielsweise an Hand des getBackStackEntryCount() deines FragmentManagers entscheiden, ob der User gerade in der Hauptansicht oder einer Unteransicht ist.


    Die erste interessante Frage ist, wie genau Du das Ganze bis jetzt implementiert hast.

    Also in IntelliJ/Android Studio:
    - Module Settings
    -> Dependencies
    -> +
    -> Library Dependency
    -> Auswählen und 'Add Selected'


    In Eclipse:
    - Project Properties
    -> Java Build Path
    -> Libraries
    -> Importieren
    (solltest Du das bereits getan haben, aber die Library liegt nicht im libs/ Unterordner deines Projektes:)
    a) Library in den libs/ Unterordner deines Projektes kopieren
    b) Das Häkchen vor der Lib setzen, um dem Projekt mitzuteilen, dass die Lib exportiert ist.
    (http://tools.android.com/recen…ndenciesinandroidprojects)

    Hi Christian!


    WebApps bieten meiner Meinung nach für den Nutzer ausschließlich Nachteile. Meine Frau war beispielsweise letzte Woche in Fuchshofen. GSM-Empfang = 0.
    Im Urlaub super, doch um dort mal eben das Gemeinschaftsfahrzeug zu nutzen: nahezu unmöglich.
    Mit einer nativen App auf einem an der Rezeption des Gasthauses ausliegenden Tablets wäre die Arbeit mit der App problemlos möglich.
    Jetzt müsste das Tablet mindestens WLAN haben. Kann man natürlich als Service anbieten, beispielsweise als Infoterminal. Nur mal eben das Tablet mitschleppen, um die Abstellposition des Fahrzeugs zu markieren, läuft in solchen Orten einfach nicht.


    Natürlich muss man als Entwickler sich nicht damit herumschlagen, drei Programmiersprachen und -konzepte zu lernen, um die gängigste Mobilhardware zu unterstützen.
    Ich persönlich glaube allerdings nicht an die Zukunft der Web Apps. Eben weil die Geräte immer schneller werden, wird auch der Anspruch an optische Spielereien stetig wachsen. Da werden die Web Apps dann auf Grund der Optik hinten über fallen.


    Aber das ist nur meine Meinung und die Zeit wird zeigen, wie sich alles entwickelt.


    Zum Sharing:
    ich glaube, Du hast mich missverstanden.
    Es ist schon klar, dass die Daten irgendwo verteilt werden müssen.
    Nur statt das bei Euch auf dem Server abladen zu müssen, hätte ich gern einen eigenen Server konfiguriert.
    Ihr könntet also eine API rausbringen, an Hand derer man sich dann seinen eigenen Server aufsetzt und alles bleibt inhouse geschützt.
    Ich denke da wieder an die Rezeption eines Gasthauses. ;)


    Natürlich wird dieser Ansatz ungleich komplexer, wenn via WebApps gearbeitet wird.

    Moin!


    Also mir wirft die App kurz nach dem Start einen Alert um die Ohren:
    'Cordova Facebook Connect plugin fail on auth.status!'


    Liegt vermutlich daran, dass ich dank der bescheuerten vorinstallierten Drecksapps auf meinem HTC (hab ich schon erwähnt, dass ich damit unzufrieden bin?) zwar die Facebook App drauf habe, allerdings habe ich keinen Facebook Account.
    Das mag ein Sonderfall sein, ich wollte es nur erwähnt haben. :)


    Die Sache mit der Anmeldung missfällt mir. Hier wäre es mir lieber, man könnte einen eigenen Server aufsetzen und nutzen.
    Ich mag es, wenn meine Daten bei mir bleiben. ;)
    Insofern teste ich nur mit den Demodaten.


    Auffällig ist, dass es relativ langsam läuft. Mag am HTC One V liegen, ist ja nicht sooo der Renner.
    ('relativ langsam' meint: Klicken auf den VW Bus – ca. 15 Sekunden bis zur nächsten Ansicht. Drücken des Zurückbuttons – tut sich gar nichts.)


    Beim Drücken der Hardwaretaste für 'Zurück' sieht es übrigens so aus, als würde links ein Menü eingeblendet. Der Content schiebt sich nach rechts raus. Mehr passiert aber nicht. Ein weiteres Drücken der Hardwaretaste für 'Zurück' stellt dann den Ursprungszustand wieder her.

    Ein paar Tipps zum Thema gibt es hier:
    http://stackoverflow.com/quest…start-on-rotation-android


    Schau einmal nach, welche Informationen im übergebenen Bundle "savedInstance" liegen, eventuell hilft Dir das weiter.


    Die Einrückungen schaffst Du mit den so genannten Code-Blöcken.

    Code
    [code]Einfach ein Code()
    // Mit Kommentar.[/ code]
    [code=php]phpCode() {
      $mitVariable = 12;
      // und Kommentar;
    }


    Java
    public static int main(String[] args) {
      String type = "Java Code";
      // Ebenfalls mit Kommentar.
    }


    HTML
    <p><span>Dies ist HTML</span></p>
    <!-- Und ein Kommentar. //-->


    SQL
    select u.mail, u.login, l.pass from user u inner join login l using u._id = l.user_id where u.login = frjaeger220


    CSS
    stylesheet {
      color = #ffffff;
      #Kommentar
    }


    XML
    <type name="Codetyp">XML</type>
    <!-- Kommentar. Mal wieder. //-->>


    C
    int main(int argc, char* argv[]) {
      int revision = 1;
      char* type[] = "C/C++";
      // Der letzte Kommentar
    }

    [/code]


    Code
    Einfach ein Code()
    // Mit Kommentar.


    PHP
    phpCode() {
      $mitVariable = 12;
      // und Kommentar;
    }


    Java
    public static int main(String[] args) {
      String type = "Java Code";
      // Ebenfalls mit Kommentar.
    }


    HTML
    <p><span>Dies ist HTML</span></p>
    <!-- Und ein Kommentar. //-->


    SQL
    select u.mail, u.login, l.pass from user u inner join login l using u._id = l.user_id where u.login = frjaeger220


    CSS
    stylesheet {
      color = #ffffff;
      #Kommentar
    }


    XML
    <type name="Codetyp">XML</type>
    <!-- Kommentar. Mal wieder. //-->>


    C
    int main(int argc, char* argv[]) {
      int revision = 1;
      char* type[] = "C/C++";
      // Der letzte Kommentar
    }

    Zu 1)
    Saugut. =)


    Zu 2)
    Versuch doch mal, den MediaStore zum neu Einlesen der Ordner zu bewegen:
    [url=http://developer.android.com/reference/android/media/MediaScannerConnection.html#scanFile(android.content.Context,%20java.lang.String[],%20java.lang.String[],%20android.media.MediaScannerConnection.OnScanCompletedListener)]scanFile()[/url] sollte das können.


    Dennoch bin ich der Meinung, dass das Verschieben am System vorbei geht – es sollte nämlich eigentlich völlig wurst sein, wo die Dateien liegen. ;)
    Eventuell kann man irgend einem Content Provider, Media Store oder weiß der Geier wem noch mitteilen, dass er die Verschiebearbeit für einen erledigen soll um sich selbst nicht mehr darum kümmern zu müssen...

    Sieht auf den ersten Blick total cool aus, wenn ich mal Zeit habe teste ich das Ganze ausführlicher. :)


    1) Klingt nach einem Problem mit dem Reuse der Views. Dazu bräuchte man eventuell ein bisschen Code. ;)
    Ein kleiner Tipp wäre das ViewHolder Pattern, solltest Du es noch nicht eingesetzt haben.


    2) Das klingt nach einem unschönen Eingriff in die Systemtiefen. Auch dazu bräuchte man eventuell ein bisschen Code. ;)
    Benötigst Du wirklich die Datei an sich und die Verschiebung, oder kannst Du einfach über das Medien Center beziehungsweise den Media Content Provider gehen?

    Also mit deiner ListPreference schreibst du doch Daten in deine SharedPreferences. Das musst du tun, geht gar nicht anders.
    Mit deinem Spinner möchtest du Daten aus deinen SharedPreferences lesen. Du kannst und sollst das gar nicht untereinander verbinden, da es komplett unabhängig voneinander ist.


    Das nennt sich MVC – Model-View-Controller – und ist ein sogenanntes Entwurfsmuster in der Softwareentwicklung.


    Model: deine SharedPreferences Daten (1 Modell)
    View: deine Anzeigen, also ListPreference und Spinner (2 Views)
    Controller: der Code, der Modell und Anzeigen verbindet, also meinetwegen PreferencesActivity und MainActivity (2 Controller)


    Du füllst deine ListPreference ja mit Vorgaben, die du dir ausgedacht hast (ein eigenes Modell, dass aber ausschließlich in der PreferencesActivity vorkommt).
    Natürlich musst du deine ListPreference so gestalten, dass man dort eine bestimmte Sache auswählen kann.


    Diese bestimmte Sache publizierst du dann an deine SharedPreferences.
    Irgendwie so:

    Java
    SharedPreferences pref = getSharedPreferences("MyApplicationPreferences", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();
    editor.putString("IndentifierKey", "PreferenceValue");
    editor.commit();


    Damit hat ein Controller mit Daten aus dem View auf das Modell schreibend zugegriffen.


    Für deinen Spinner rufst du dann dieselben Preferences auf und liest die Daten aus.
    Ungefähr so:

    Java
    SharedPreferences pref = getSharedPreferences("MyApplicationPreferences", Context.MODE_PRIVATE);
    String preferenceValue = pref.getString("IndentifierKey", "DefaultStringValue");


    Damit hat dein Controller Daten aus dem Modell gelesen und in das View geschrieben.