Announcement

Collapse
No announcement yet.

Wie kann man eine URL aus einer App aufrufen, ohne ein externen Browser zu starten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann man eine URL aus einer App aufrufen, ohne ein externen Browser zu starten

    Hallo zusammen,

    Ich hoffe Ihr könnt mir helfen.

    Ich möchte aus meiner Application eine URL aufrufen.
    Dies sollte die App selbst tun. Ich möchte nicht, das die App verlassen wird und anschließend ein Browser die URL aufruft.
    Hintergrund:
    Ich habe eine Steuerung für meine Lichter in der Wohnung, die am Heimnetzwerk angeschlossen ist.
    Diese verfügt über eine feste IP-Adresse und kann über den Webbrowser mit diversen befehlen gestert werden.

    Nun möchte ich meine eigene Application erstellen, die wenn ich auf z.B. einen Button klicke, eine
    entsprechende URL verschickt wird, um der Steuerung einen befehl zu schicken.

    Hier sind noch weitere Info:
    http://www.homematic-inside.de/softw...ns/item/xmlapi


    Ich hoffe Ihr könnt mir weiterhelfen


    Gruß Daniel

  • #2
    Über die Klasse Socket eine Verbindung zur IP/Server und dem Port aufbauen. Dann einen GET oder POST Request bauen und diesen senden.
    Für einfache Fälle reicht
    http://docs.oracle.com/javase/tutori...ngWriting.html
    Christian

    Comment


    • #3
      Hallo Christian,

      danke für deine Antwort. Das hat mir schon weitergeholfen.

      Nur leider Funktionier es nicht und ich weiss nicht woran das liegt. Die App stürzt einfach nur ab.
      Sieht vielleicht jemand einen Fehler? Eclipse markiert mir keine Fehler in dem Quellcode.
      Die uses-permission android:name="android.permission.INTERNET" habe ich im Manifest eingetragen.

      Ich habe mal einen ganz einfachen Quelltext geschrieben.
      Code:
      public class MainActivity extends Activity {
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      befehlsenden(); //aufrufen der Methode befehlsenden beim Programmstart
      }
      
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
      }
      
      String antwort;
      
      private void befehlsenden()
      {
      try
      {
      antwort=""; 
      AndroidHttpClient client = AndroidHttpClient.newInstance("Request");
      HttpGet request = new HttpGet("http://192.168.1.102/config/xmlapi/statechange.cgi?ise_id=1265&new_value=true");
      HttpResponse response = client.execute(request);
      HttpEntity entity = response.getEntity();
      InputStreamReader reader = new InputStreamReader(entity.getContent(),"utf-8" );
      int c = reader.read();
      antwort += (char)c;
      while(c > -1)
      {
      antwort += (char)c;
      c = reader.read();
      }
      
      client.close();
      }
      
      catch (IOException e)
      {
      antwort = "Fehler"; 
      }
      
      } //ende von methode befehlsenden
      } //ende von class MainActivity
      Ich bin echt am verzweifeln und freue mich über jeden Tipp.


      Gruß Daniel

      Comment


      • #4
        Versuch doch mal die Anwendung zu debuggen? Ich vermute Du kannst Dich mit dem SDK an Dein Handy und Deine App hängen und dann durchs Programm steppen. Dann siehst Du vermutlich an welcher Stelle der Fehler auftritt und kannst Maßnahmen treffen

        Comment


        • #5
          Das sollte mit einer IDE (Intelli, Netbeasn, Eclipse) auch ohne Handy zu debuggen sein.
          Christian

          Comment


          • #6
            Hallo,

            ich habe mich ein wenig in den Debugger eingearbeitet. Ich bin zwar kein Profi, weiß nun allerdings welche Zeile das Programm abstürzen lässt.
            Der Debugger bleibt an Folgender Zeile mit einem Fehler stehen:

            Code:
            HttpResponse response = client.execute(request);
            Sprich in dem Moment, wenn der http Request verschickt/ausgeführt wird.

            Ich bekomme allerdings eine Fehlermeldung, mit der ich nichts angangen kann:
            Es fehlt der "source lookup path"
            Hat das schon mal jemand gehabt? Was muss ich da angeben?


            Und dazu werde ich immer wieder von einem Fenster "Select Source File" aufgefordert -> Choose a select File auszuwählen.
            Hier entscheide ich mich immer für folgendes(in der Hoffnung nichts falsches zu tun):
            ActivityThread.java - D:\ECLIPSE\sdk\android-19\android\app
            -> Das kann doch nicht normal sein....????

            Comment


            • #7
              Es fehlt der "source lookup path"

              Das heisst lediglich Eclipse hat nicht die Sourcen um IN die Methode

              client.execute(request);

              execute reinzudebuggen. Das geht nur, wenn du dir den Sourcecode der Lib holst und Eclipse sagst wo der ist. Das Fenster bedeutet lediglich, dass Eclipse dann doch reindebuggen kann,
              wenn du Eclipse jetzt sagst, wo der Sourcecode liegt. Das dürfte aber nicht erforderlich sein.

              Die Methode execute wirft

              IOException
              ClientProtocolException

              Letztere fängst du nicht...
              Christian

              Comment


              • #8
                Hallo Christian,

                erstmal vielen Dank für die schnelle Antwort.
                Ich fange nun die ClientProtocolException ebenfalls ab, allerdings stüzt mein Programm immer noch ab.
                Laut Debugger an der selben stelle.

                Ich bekomme im CAT-Logger folgende Fehlermeldungen. Lässt sich an denen eventuell erkennen, woran es liegen könnte?


                03-01 09:04:51.935: D/AndroidRuntime(1376): Shutting down VM
                03-01 09:04:51.935: W/dalvikvm(1376): threadid=1: thread exiting with uncaught exception (group=0xb4a93ba8)
                03-01 09:04:51.975: E/AndroidRuntime(1376): FATAL EXCEPTION: main
                03-01 09:04:51.975: E/AndroidRuntime(1376): Process: http.example.internetzugriff, PID: 1376
                03-01 09:04:51.975: E/AndroidRuntime(1376): java.lang.RuntimeException: Unable to start activity ComponentInfo{http.example.internetzugriff/http.example.internetzugriff.MainActivity}: android.os.NetworkOnMainThreadException
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2195)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.ActivityThread.handleLaunchActivity(Ac tivityThread.java:2245)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.ActivityThread.access$800(ActivityThre ad.java:135)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1196)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.os.Handler.dispatchMessage(Handler.java:10 2)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.os.Looper.loop(Looper.java:136)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.ActivityThread.main(ActivityThread.jav a:5017)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at java.lang.reflect.Method.invokeNative(Native Method)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at java.lang.reflect.Method.invoke(Method.java:515)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:779)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:595)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at dalvik.system.NativeStart.main(Native Method)
                03-01 09:04:51.975: E/AndroidRuntime(1376): Caused by: android.os.NetworkOnMainThreadException
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.os.StrictMode$AndroidBlockGuardPolicy.onNe twork(StrictMode.java:1145)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java: 84)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at libcore.io.IoBridge.connectErrno(IoBridge.java:144 )
                03-01 09:04:51.975: E/AndroidRuntime(1376): at libcore.io.IoBridge.connect(IoBridge.java:112)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:192)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:459)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at java.net.Socket.connect(Socket.java:843)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.conn.scheme.PlainSocketFactory.con nectSocket(PlainSocketFactory.java:119)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.conn.DefaultClientConnectionO perator.openConnection(DefaultClientConnectionOper ator.java:144)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.conn.AbstractPoolEntry.open(A bstractPoolEntry.java:164)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.conn.AbstractPooledConnAdapte r.open(AbstractPooledConnAdapter.java:119)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.client.DefaultRequestDirector .execute(DefaultRequestDirector.java:360)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.client.AbstractHttpClient.exe cute(AbstractHttpClient.java:555)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.client.AbstractHttpClient.exe cute(AbstractHttpClient.java:487)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at org.apache.http.impl.client.AbstractHttpClient.exe cute(AbstractHttpClient.java:465)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.net.http.AndroidHttpClient.execute(Android HttpClient.java:252)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at http.example.internetzugriff.MainActivity.befehlse nden(MainActivity.java:44)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at http.example.internetzugriff.MainActivity.onCreate (MainActivity.java:22)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.Activity.performCreate(Activity.java:5 231)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.Instrumentation.callActivityOnCreate(I nstrumentation.java:1087)
                03-01 09:04:51.975: E/AndroidRuntime(1376): at android.app.ActivityThread.performLaunchActivity(A ctivityThread.java:2159)
                03-01 09:04:51.975: E/AndroidRuntime(1376): ... 11 more
                03-01 09:04:58.915: I/Process(1376): Sending signal. PID: 1376 SIG: 9

                Comment


                • #9
                  Würde den Fehler hier sehen

                  Unable to start activity ComponentInfo{http.example.internetzugriff/http.example.internetzugriff.MainActivity}: android.os.NetworkOnMainThreadException

                  Kenne nun die Androidentwicklung nicht im Detail, aber es könnte ein Hinweis sein, dass deine Anwendung nicht das Recht hat, eine Internetverbindung aufzubauen.

                  Ggf. würde ich nach obigen Fehler mal google befragen
                  Christian

                  Comment


                  • #10
                    Hallo,

                    ich habe meiner Anwendung den Zugriff auf internet erlaubt.

                    Sprich, habe folgendes ins Manifest geschrieben:
                    Code:
                    <uses-sdk
                            android:minSdkVersion="19"
                            android:targetSdkVersion="19" />
                        <uses-permission android:name="android.permission.INTERNET"/>
                    Das sollte ja ausreichen

                    Comment


                    • #11
                      https://www.google.de/search?q=java....GKmF8QfkhIHwBA


                      das wird ohne Code nicht lösbar sein....
                      Christian

                      Comment


                      • #12
                        Es gibt soweit ich weiss für Android die Klasse netview. Genaieres müsstest du googlen.

                        Comment


                        • #13
                          Eine Klasse netview finde ich nicht in der API. des Weiteren war keine View-Komponente gewünscht, sondern der Code um den Source zu laden
                          Christian

                          Comment


                          • #14
                            Hi,

                            einfach bei Google android.os.NetworkOnMainThreadException eingeben

                            Methode 1:
                            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().buil d();
                            StrictMode.setThreadPolicy(policy);

                            Methode 2:
                            Asynchroner Task

                            Beide Varianten sind in folgendem Link ausführlich erklärt (mit Beispiel):
                            http://stackoverflow.com/questions/6...hreadexception

                            Gruß
                            Sebastian

                            Comment

                            Working...
                            X