1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Intent für Navigation, wie am sinnvollsten lösen?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von kleinerkathe, 18.11.2011.

  1. kleinerkathe, 18.11.2011 #1
    kleinerkathe

    kleinerkathe Threadstarter Android-Lexikon

    Beiträge:
    1,365
    Erhaltene Danke:
    219
    Registriert seit:
    23.01.2010
    Hey,

    ich möchte einen Intent abschicken um eine Navigation zu starten :)
    So weit so gut, zwei Möglichkeiten hab ich schon mal:

    Möglichkeit 1 (geo):
    Code:
    String uri1 = "geo:"+ longitude + "," + latitude + "?q=location+adress";
    Intent i1 = new Intent(Intent.ACTION_VIEW, Uri.parse(uri1));
    startActivity(i1);
    
    Möglichkeit2 (google.navigation):
    Code:
    String uri2 = "google.navigation:q=location+adress";
    Intent i2 = new Intent(Intent.ACTION_VIEW,Uri.parse(uri2));
    startActivity(i2); 
    
    Jetzt startet mir Möglichkeit 1 entweder die einzige GEO-Anwendung auf dem Handy, die mit dem Intent was anfangen kann oder stellt mir eine Auswahlliste zur Verfügung, falls mehrere passende Anwendungen vorhanden sind :)

    Möglichkeit 2 startet direkt Google Maps im Navigationsmodus

    Wenn ich Maps nicht installiert hab, gibts bei Möglichkeit 2, so natürlich nen ForceClose, aber das kann man ja verhindern, indem man überprüft ob eine bestimmte Anwendung installiert ist oder ob es eine gibt, die etwas mit dem Intent anfangen kann. (Menüpunkt ausblenden oder per Toast auf GoogleMaps hinweisen)

    Bestimmte Anwendung überprüfen: über PackageManager?
    Intent überprüfen: Wie?

    Bisschen schwierig da die passenden Seiten zu finden, auf denen das erklärt wird, bei "Überprüfen ob Anwendung installiert Android" find ich nicht die Seiten für Entwickler :p Intent wird meistens der umgekehrte Weg beschrieben, d.h. wie man für die eigene Anwendung Intents verarbeitet ...


    Gibt es eine erheblich bessere Methode um eine Navigation zu ermöglichen oder nicht? (laut Internet, gibt es keinen "festen" Intent bei Android für Navigation ... leider)


    //EDIT: Für Google Maps hätte ich schon mal nen kleines Snippet gefunden:
    http://stackoverflow.com/questions/...id-device-whether-it-supports-google-maps-api
    Aber kurz nachgehakt, soetwas per try-catch zu "überprüfen" ist nicht wirklich sauber gelöst oder?
     
    Zuletzt bearbeitet: 18.11.2011
  2. MichaelS, 18.11.2011 #2
    MichaelS

    MichaelS Fortgeschrittenes Mitglied

    Beiträge:
    370
    Erhaltene Danke:
    51
    Registriert seit:
    14.08.2009
    kleinerkathe bedankt sich.
  3. mradlmaier, 20.11.2011 #3
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011

    Das try-catch konstrukt in Java ist exakt für solche Zwecke: Datei vorhanden, Drucker vorhanden, etc. kurz und gut, alles was nicht der direkten Kontrolle des Entwicklers unterliegt....

    Der erste Intent ist implizit, der zweite explizit...
    Im übrigen ist die Frage, warum Du einen Benutzer zwingen willst Google Maps zu installieren. Möglicherweise hat der Benutzer driftige Gründe, ein andere installierte Anwendung zu verwenden als Google Maps...
    Schließlich willst Du ja in erster Linie, daß deine Anwendung installiert wird. Ich würde deshalb einen impliziten Intent für benutzerfreundlich halten. Sparst Dir dann auch ein paar Zeilen Code
     
    kleinerkathe bedankt sich.
  4. kleinerkathe, 21.11.2011 #4
    kleinerkathe

    kleinerkathe Threadstarter Android-Lexikon

    Beiträge:
    1,365
    Erhaltene Danke:
    219
    Registriert seit:
    23.01.2010
    Zunächst einmal danke euch beiden :)

    Ok, wenn das try-catch Konstrukt genau dazu da ist, dann super :) Mir persönlich kommts halt eher so vor, als ob try-catch dazu da ist "Ausnahmefälle" abzufangen, die eben normalerweise eher nicht vorkommen sollten ... Habs jetzt mal mit try-catch gelöst :)

    Es gibt, zumindest hab ich dazu nichts gefunden, keinen impliziten Intent für Navigation :(
    Man findet auch keinerlei Angaben ob und wenn ja, wie bspw. CoPilot, Navigon, iGo, etc. auf Intents reagieren können :/

    Wieso ich jetzt Google Maps vorschreibe? ;) Würde ich die Anwendung in den Market stellen, dann würde ich es über den impliziten Intent lösen und dem User die Wahl lassen ;) Da die App aber 1. nur zu Demozwecken ist und 2. nur auf meinem Gerät vorgeführt wird, kann ich direkt Google Maps im Navigationsmodus vorführen. Kommt bei Angestellten, die eben ihr iPhone gewöhnt sind besser, wenn direkt die Navigation über 1-Klick gestartet werden kann, als sich durch zig Menüs klicken zu müssen :) und auch der Punkt "Navigation funktioniert auf Android auch kostenlos" kann man dabei schön erwähnen :p

    btw. die App wäre ne Firmenapp und die können ihre Geräte ja vorkonfiguriert ausliefern und eben Google Maps überall festsetzen :)


    @MichaelS: Nette Anwendung :) Hatte die ne zeitlang auf dem Handy und hat mehrere Abende herhalten müssen ;)
     
  5. mradlmaier, 21.11.2011 #5
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    "Ausnahmefälle" im Sinne davon, dass Du als Entwickler keine Kontrolle darüber hast. z.B. eine Datei, die sich nicht wie erwartet in einem bestimmten Ordner befindet. Anstelle dass das Program dann unkontrolliert abstürzt, kannst Du im "catch" den Benutzer die Möglichkeit bieten, diese Datei neu zu erstellen oder einen anderen Ordner anzugeben.
    Das verhindert zwar keine Ausnahmesituationen, aber das Programm kann dann solche Situationen eleganter behandeln.

    Bezüglich impliziter Intents:
    Grau ist die Theorie, bunt die Praxis.
    Z.b. habe ich neulich einen Test durchgeführt, welche Browser komplexe Webseiten wie gut darstellen. Unter Android gibts >10 verschiedene Browser. Ergebnis war dass effektiv nur 3 Browser in der Lage waren, komplexe Webseiten korrekt darzustellen (nach Änderung der Browsereinstellungen).
    Unter Android 3.2 waren es der Google Stock Browser, Dolphin und Opera Mobil (Opera mit tolerablen Einschränkungen)
    Unter Android 2.3.3 waren es nur der Ninesky Browser.
    Komplex meint: Javascript, Flash, multiple Windows...etc.
    Es gibt also durchaus Situationen wo ein expliziter Intent Sinn macht. Leider kann man explizit nur eine einzige Anwendungen aufrufen , und nicht mehrere.
    Das zweite Problem spricht Du selbst an. Anwendungen, die generell den gleichen Effekt erfüllen, können im Detail natürlich sehr unterschiedlich sein.

    Ich würde mal sagen, solanges es geht, implizite Intents, und falls es nicht anders geht, explizite Intents
     
    kleinerkathe bedankt sich.
  6. mradlmaier, 21.11.2011 #6
    mradlmaier

    mradlmaier Gewerbliches Mitglied

    Beiträge:
    158
    Erhaltene Danke:
    17
    Registriert seit:
    28.10.2011
    Bezüglich Ausnahmen/Exceptions:
    Es gibt da ein weitere Unterscheidung:
    checked Exceptions und unchecked Exceptions
    Java Practices -> Checked versus unchecked exceptions

    Kurz:
    unchecked Exceptions sind auf Fehler in der Programmlogik zurückzuführen, auf die das Programm nicht in sinnvoller weise reagieren kann.

    checked Exceptions sind die, über die wir gesprochen haben: Fehlende Dateien, Datenbankfehler, fehlende Anwendungen, nicht angesschlossene Drucker, Netzwerk nicht erreichbar, etc.
    Eine Methode ist verpflichtet, checked Exceptions zu behandeln oder auf dem Stack noch oben weiterzugeben (will heissen an den Aufrufer weiterzugeben, der Aufrufer kann die Exception dann entweder behandeln oder an dessen Aufrufer weitergeben, den ganzen Stack hinauf etc.)
    Woran erkenne ich eine checked Exception?
    Die Methode oder Konstruktor verwendet das Keyword "throws":
    public meineMethode(String s) throws{
    // mach irgendwas
    }
    Wenn Du ein solche Methode aufrufst,muss das innerhalb von try-catch passieren.

    Noch was: Es gibt noch ein Keyword "throw new .....Exception()
    Damit kannst Du ein Exception auslösen z.b. :


    public void meineMethode(Object o){
    if (o == null) {
    throw new NullPointerException()
    }
    }
     
    kleinerkathe bedankt sich.

Diese Seite empfehlen