German wetter api von visual basic in b4a?

mcmanu

Active Member
Licensed User
Longtime User
Hi,
Ich habe in Visual basic eine Google weather app Programmiert
Meine frage ist ob ich die jetzt auch in b4a benutzen kann?

Die app benutzt die weather api von google

Hoffe jemand kann mir helfen

Hier das Projekt
File-Upload.net - Wetterapppp.rar
 
Last edited:

Roeschti

Member
Licensed User
Longtime User
Nöö kannst du nicht. Schau dir die Verwiese an, du benützt die AnimaOnline.dll, mit welcher B4A nix anfangen kann.

Du musst in B4A eine neuen Schnittstelle implementieren dh zB einen Aufruf zu einem Anbieter machen, welcher dir als Resultat zB eine XML Datei mit den benötigen Werten gibt. WebServices halt :)

Die XML Datei durch den Sax-Parser jagen und Resultate aufbereiten.

SAX: http://www.b4x.com/forum/basic4andr...866-xml-parsing-xmlsax-library.html#post39737

Wetter WebService Beispiel: http://www.b4x.com/forum/basic4andr...n-xml-into-useable-information.html#post72421

Hier nochwas zu Google Wetter API:
http://www.anddev.org/android_weather_forecast_-_google_weather_api_-_description-t337.html

Der Rest übernimmt die Google Suche für dich :sign0089:
 

mcmanu

Active Member
Licensed User
Longtime User
Danke

Super danke dir :) und danke für die Links ich mach mich da mal schlau :)
 

mcmanu

Active Member
Licensed User
Longtime User
Xml parser

Ich versuch die ganze zeit die daten der google api zu parsen, Funktioniert auch nur bekommt er den Text nicht.

Beispiel: normaler weise sieht eine xml zeile so aus
<description>Basic4android - android programming and development</description>
Wunderschön und leicht zu parsen

Nun sieht die google xml zeile so aus
<condition data="Meistens bewölkt"/>
naaaa toooll xD
Wie bekomme ich den Text Meistens bewölkt?
 

Roeschti

Member
Licensed User
Longtime User
Hahaha!!! Nur nicht aufgeben, schau dir folgendes an:

Ausschnitt aus einer meiner XML Dateien:
<kanal name="DSF" kanalnr="2">


B4X:
Sub Parser_StartElement(uri As String, Name As String, Attributes As Attributes)
      If Name = "kanal" Then
            strKanal  = Attributes.GetValue2("", "name")
            strKanalNr  = Attributes.GetValue2("", "kanalnr")
            lstDataHeute.AddSingleLine2(strKanal,strKanalNr)
    End If
End Sub
 

mcmanu

Active Member
Licensed User
Longtime User
Hahaha!!! Nur nicht aufgeben, schau dir folgendes an:

Ausschnitt aus einer meiner XML Dateien:
<kanal name="DSF" kanalnr="2">


B4X:
Sub Parser_StartElement(uri As String, Name As String, Attributes As Attributes)
      If Name = "kanal" Then
            strKanal  = Attributes.GetValue2("", "name")
            strKanalNr  = Attributes.GetValue2("", "kanalnr")
            lstDataHeute.AddSingleLine2(strKanal,strKanalNr)
    End If
End Sub

Haha xD Danke dir :) werds mal testen :)
Danke danke danke :)
 

mcmanu

Active Member
Licensed User
Longtime User
Noch eine Frage

Ich hätte gerne die daten von "forecast_conditions"
Als erstes Mo. danach die. dann mit. dann fr.

Ich bekomme aber immer nur donnerstag

Xml
B4X:
<xml_api_reply version="1">
−
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
−
<forecast_information>
<city data="Munich, Bavaria"/>
<postal_code data="muenchen"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2012-02-20"/>
<current_date_time data="1970-01-01 00:00:00 +0000"/>
<unit_system data="SI"/>
</forecast_information>
−
<current_conditions>
<condition data="Teils bewölkt"/>
<temp_f data="34"/>
<temp_c data="1"/>
<humidity data="Feuchtigkeit: 65 %"/>
<icon data="/ig/images/weather/partly_cloudy.gif"/>
<wind_condition data="Wind: S mit Windgeschwindigkeiten von 8 km/h"/>
</current_conditions>
−
<forecast_conditions>
<day_of_week data="Mo."/>
<low data="-8"/>
<high data="3"/>
<icon data="/ig/images/weather/mostly_sunny.gif"/>
<condition data="Teils sonnig"/>
</forecast_conditions>
−
<forecast_conditions>
<day_of_week data="Di."/>
<low data="-4"/>
<high data="2"/>
<icon data="/ig/images/weather/sunny.gif"/>
<condition data="Klar"/>
</forecast_conditions>
−
<forecast_conditions>
<day_of_week data="Mi."/>
<low data="-4"/>
<high data="6"/>
<icon data="/ig/images/weather/sunny.gif"/>
<condition data="Klar"/>
</forecast_conditions>
−
<forecast_conditions>
<day_of_week data="Do."/>
<low data="4"/>
<high data="5"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="Vereinzelt Regen"/>
</forecast_conditions>
</weather>
</xml_api_reply>

B4X:
If parser.Parents.IndexOf("forecast_conditions") < -1 Then
      If Name="day_of_week" Then
      conditionaktuellertag = Attributes.GetValue2("","data")
      label6.text=conditionaktuellertag
      End If

Wie bekomme ich die daten von oben nach unten? also die current conditions bekomme ich :) aber den rest da bekomme ich nur do.
und was hat es sich mit dem indexof aufsicht versteh das nicht wirklich
 
Last edited:

Kiffi

Well-Known Member
Licensed User
Longtime User
Ich bekomme aber immer nur donnerstag
Du bekommst IMO alle Daten. Da Du label6.text aber ständig überschreibst,
steht schlussendlich der letzte Wochentag (hier: Donnerstag) da drin. Meines
Erachtens müsstest Du beispielsweise eine Liste haben, der Du dann die
Wochentag hinzufügst.

Grüße ... Kiffi
 

Roeschti

Member
Licensed User
Longtime User
Yoo weils der Letzte ist in deiner Datei. Die XML Datei / Stream wird mit dem SAXer von A-Z durchgerödelt, auch wenn das was du brauchst am Anfang ist. So als würde das ganze Zeug auf einem Förderband an dir vorbeipfeiffen und du im richtigen Moment zugreiffen musst, damit du das Richtige erwischen kannst (zuviel Rotwein, ich weiss ;-)

Du musst nach jedem Durchlauf eines Elements die Daten zwischenalgern zB in eine Liste oder Map. Du kannst ja fragen if Attributes.GetValue2("","data") = "Di." then speichere alles irgendwo hin, else do nothing wenn du nur ein bestimmtes Teilstück brauchst.

Diese Parser_StartElement und EndElemnt Sub werden jedesmal aufgerufen, so kannst du eben deine Daten herausfischen. Mach mal eine Globale Variable sagen wir dim intCnt as int, bei der Activity_Create schreibst du rein intCnt = 0,
dann innerhalb der Parser_StartElement schreibst du rein intCnt = intCnt + 1 und am Ende kannst du zB eine Messagebox ausgeben mit dem intCnt. So kannst du sehen, wie oft die Routine aufgerufen wird.
 

mcmanu

Active Member
Licensed User
Longtime User
danke

Klingt absolut logisch was ihr beiden sagt :) Danke euch :)
haha zu viel Rotwein xD ganz ehrlich bräuchte ich jetzt auch xD
Wikipedia api und google api macht mich wahnsinnig xDDD


Jetzt ist nur die frage wie ich die unter daten von "Di." bekomme xD
ich kann ja nicht sagen if attributes.getvalue2("","data")="-1" xD sonst müsste ich alle grad zahlen berücksichtigen
gott ey warum schreibt google nicht condition data2 dann condition data3 xDD wär leichter
Wie speichere ich den alle daten von mo bis freitag?
Danke nochmal
 
Last edited:

mcmanu

Active Member
Licensed User
Longtime User
Hi

Ich frag echt ungern, weil ihr mir schon super geholfen habt, aber ich verzweifle immer noch daran die letzten daten auszulesen.
Könnt ihr mir noch sagen wie ich die daten am besten in eine liste schreibe und diese dann in labels fülle?

xml beispiel:
B4X:
<forecast_conditions>
<day_of_week data="Mi."/>
<low data="3"/>
<high data="10"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="Vereinzelt Regen"/>
</forecast_conditions>
−
<forecast_conditions>
<day_of_week data="Do."/>
<low data="1"/>
<high data="10"/>
<icon data="/ig/images/weather/cloudy.gif"/>
<condition data="Bewölkt"/>
</forecast_conditions>
−
<forecast_conditions>
<day_of_week data="Fr."/>
<low data="4"/>
<high data="11"/>
<icon data="/ig/images/weather/mostly_sunny.gif"/>
<condition data="Teils sonnig"/>
</forecast_conditions>
−
<forecast_conditions>
<day_of_week data="Sa."/>
<low data="-2"/>
<high data="7"/>
<icon data="/ig/images/weather/chance_of_rain.gif"/>
<condition data="Vereinzelt Regen"/>
</forecast_conditions>
 

kvolstorf

Member
Licensed User
Longtime User
Ich mache es mit einem Zähler.

Ich fange mit intCnt = 0 an. IntCnt = 12 beginnen die Daten vom gleichen Tag.
IntCnt = 19 beginnen die Daten vom nächsten Tag.
IntCnt = 25 beginnen die Daten vom übernächsten Tag usw.

mfg
 

mcmanu

Active Member
Licensed User
Longtime User
Danke

Danke schonmal :)

Hab noch ein Kleines verständnis problem
ich mache dies -->

B4X:
dim inctn as int

Sub Parser_startElement (uri As String, Name As String, Attributes As Attributes)
label1.Visible=True
intcnt = intcnt + 1
alist.Initialize
   If parser.Parents.IndexOf("current_conditions") > -1 Then
      If Name = "condition" Then
         Title = Attributes.GetValue2("","data")
         label1.Text=Title
         alist.Add(Title)
      Else If Name = "temp_c" Then
         condition = Attributes.GetValue2("","data")
         label2.Text=condition & "C°"
         alist.Add(condition)
      Else If Name = "wind_condition" Then
         wind = Attributes.GetValue2("","data")
         label3.Text=wind
         Else If Name="humidity" Then
         luftfeucht=Attributes.GetValue2("","data")
         label4.text= luftfeucht
         alist.Add(luftfeucht)
      End If

Muss ich dann so abfragen um die einzelnen daten zu bekommen? -->

B4X:
If parser.Parents.IndexOf("forecast_conditions") > -1 Then
      If Name="day_of_week" and intcnt=12 Then
      conditionaktuellertag = Attributes.GetValue2("","data")
      alist.add(canditionaktuellertag)
      label6.Text=alist.get(12)
      End If
      End If

Fühl mich grad wie ein noob, sorry wenn ich danach frage :sign0013:
 
Last edited:

kvolstorf

Member
Licensed User
Longtime User
ich mache es so:
es ist bestimmt noch verbesserungswürdig, aber ich fange ja auch erst an mit b4a.
B4X:
If intCnt = 12 Then
   If Name = "condition" Then
              condition  = Attributes.GetValue2("", "data")
      Label2.Text = condition
   End If   
   
   
   If Name = "temp_c" Then
           temp_c  = Attributes.GetValue2("", "data")
      Label3.Text = temp_c
   End If

End If      

If intCnt = 16 Then   
   If Name = "icon" Then
               icon  = Attributes.GetValue2("", "data")
      icon = icon.Replace(".gif",".png")

      laenge = st.Len(icon)
      laenge = laenge - 11
      bild = st.Mid(icon,12,laenge)
      
      ImageView5.Bitmap=LoadBitmap(File.DirAssets,bild)

   End If   
End If      

If intCnt = 19 Then         
   If Name = "day_of_week" Then
      day_of_week  = Attributes.GetValue2("", "data")
      Label4.Text = day_of_week & " " & datum
   End If
End If      

If intCnt = 20 Then         
   If Name = "low" Then
             low = Attributes.GetValue2("", "data")
      Label6.Text = low
      Label8.Text = "T:"
   End If
End If

If intCnt = 21 Then      
   If Name = "high" Then
           high = Attributes.GetValue2("", "data")
      Label5.Text = high
      Label7.Text = "H:"
   End If
End If

If intCnt = 25 Then         
   tag_neu =DateTime.getdayofmonth(morgen)
   monat_neu = DateTime.GetMonth(morgen)
   jahr_neu = DateTime.GetYear(morgen)

   If Name = "day_of_week" Then
      day_of_week  = Attributes.GetValue2("", "data")
      Label12.Text = day_of_week & " " & tag_neu & "." & monat_neu & "." & jahr_neu
   End If
End If   
   
If intCnt = 27 Then      

   If Name = "high" Then
      high = Attributes.GetValue2("", "data")
      Label15.Text = high & " / " & low
   End If
End If

If intCnt = 28 Then   
   If Name = "icon" Then
               icon  = Attributes.GetValue2("", "data")
      icon = icon.Replace(".gif",".png")
         
      laenge = st.Len(icon)
            
      laenge = laenge - 11
      bild = st.Mid(icon,12,laenge)
            
      ImageView2.Bitmap=LoadBitmap(File.DirAssets,bild)

   End If   
End If
usw.

mfg

Edit: wie du siehst, mach ich auch keine liste sondern weise die Werte beim Durchlauf direkt zu.
 
Last edited:

mcmanu

Active Member
Licensed User
Longtime User
Danke

Wow cool Danke dir Vielmals :)
Wenn ich des jetzt sehe denk ich mir wie dumm ich bin haha xD
Danke Danke danke :)

Ja das mit der liste ist bei der methode eh nicht nützlich :)

Super nochmals vielen dank :)
 
Top