Application android

Résolu
Bonjour à tous.

Je vous pose mon problème :

J'ai récemment fait l'acquisition d'un raspberry (que j'ai installé sous raspbian) sur lequel j'ai installé un serveur. J'ai également des prise radio un petit peu partout dans mon appartement et je peux les contrôler avec mon raspberry grâce à une petite carte RF.

Je voudrai réussir à envoyer une requête à mon raspberry à partir de mon smartphone (ou tablette) via une petite application comme je le fais via mon serveur grâce à un petit site. Le souci, c'est que à partir de mon site, la requête envoyée est une commande system (vu que le serveur tourne sur le raspberry) donc je ne sais pas comment je pourrait faire envoyer la commande à partir d'une application android... ?

(Le lien utilisé pour exécuter l'action à partir du site est du type action.php?engine=id-17&action=CHANGE_STATE&code=3&state=on) et affiche donc une page. Je ne sais pas si il est possible d'exécuter l'action de ce lien sans afficher la page... ?)

Je précise que le java n'est pas mon fort, j'en comprend les bases mais je ne suis pas un as ^^

Pour le moment j'ai fait ça :
public class MainActivity extends AppCompatActivity {
 
    TextView txtMsg;
    Button btnNewMsg;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        txtMsg=(TextView)findViewById(R.id.txtMsg);
        btnNewMsg=(Button)findViewById(R.id.btnNewMsg);
 
        btnNewMsg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String retourDeLaPage = get("http://www.google.fr");
            }
        });
    }
 
    public static String get(String url) throws IOException {
 
        String source ="";
        URL oracle = new URL(url);
        URLConnection yc = oracle.openConnection();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                        yc.getInputStream()));
        String inputLine;
 
        while ((inputLine = in.readLine()) != null)
            source +=inputLine;
        in.close();
        return source;
    }
}

Mais j'ai une erreur à la ligne
String retourDeLaPage = get("http://www.google.fr");

Et j'ai essayé avec try/catch mais ça fait planter l'application dès que l'action s’exécute...

Merci

9 réponses

  1. Bonsoir, j'ai résolu mon problème en executant le code dans un thread différent avec

    new thread ((runnable) () {
    ...
    }).start();

    merci :)
    1. Modérateur
      Toujours pas résolu?
      As-tu fait des recherches sur le type de l'exception que je t'ai indiquée ?
      1. Modérateur
        Le mot clé est ici
        NetworkOnMainThreadException

        Tu lances des requêtes réseau sur le thread UI, ce qu'il ne faut pas faire...
        Regarde des briques comme OkHttpRequest par exemple.
        1. j'ai déjà essayé avec le try/catch je n'ai pas d'erreur de compilation mais à l’exécution, dès que le code est exécute (en cliquant sur mon bouton).
          J’obtiens l'erreur :
          12-08 16:53:55.696 3348-3348/biz.no_ip.littledodger.mamaison D/AndroidRuntime: Shutting down VM
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: FATAL EXCEPTION: main
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: Process: biz.no_ip.littledodger.mamaison, PID: 3348
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: android.os.NetworkOnMainThreadException
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at java.net.InetAddress.getAllByName(InetAddress.java:215)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at biz.no_ip.littledodger.mamaison.MainActivity.get(MainActivity.java:45)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at biz.no_ip.littledodger.mamaison.MainActivity$1.onClick(MainActivity.java:32)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.view.View.performClick(View.java:5198)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:21147)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
          12-08 16:53:55.697 3348-3348/biz.no_ip.littledodger.mamaison E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
          1. Modérateur
            Le message est clair ;) Tu as une exception de type "IOException" que tu ne catche pas...
            Rajoute le try/catch() et vérifies en pas-à-pas ce qui se passe.
            1. Bonjour et merci de t'intéresser à mon problème !
              L'erreur que j'ai est :
              Error:(31, 44) error: unreported exception IOException; must be caught or declared to be thrown