Android studio

BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Android studio

Příspěvek od BigSandy » čtv 15. dub 2021 6:50:22

Zdarec tu všici :mrgreen:
Když tu mame tu sekci java, neumí někdo v Android studiu?
Uživatelský avatar
PetrSmetana
Příspěvky: 310
Registrován: pon 22. črc 2019 9:06:45
Bydliště: Mnich
Dal poděkování: 28 poděkování
Dostal poděkování: 60 poděkování
Kontaktovat uživatele:

Re: Android studio

Příspěvek od PetrSmetana » čtv 15. dub 2021 11:18:44

Shodou náhod jsem ho už párkrát použil pro vývoj aplikace pro tracking a výměnu informací přes síť. Co bys potřeboval?
Modré z nebe na počkání, zázraky do dvou dnů.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » čtv 15. dub 2021 12:15:27

Vše ohledně te výměně informací přes síť :mrgreen:
Hlavně ssh a web.

Co třeba třeba přes ssh?
Toto je funkční a hodně použivam.

channelssh.setCommand("lsusb > /home/pi/test1.txt");
channelssh.setCommand("sudo reboot");
package com.example.myapplicationssh;

import android.os.AsyncTask;
import android.os.Bundle;
import java.io.ByteArrayOutputStream;
import java.util.Properties;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import android.app.Activity;
import android.view.View;

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public static String executeRemoteCommand(String username,String password,String hostname,int port)
throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, port);
session.setPassword(password);

// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);

session.connect();

// SSH Channel
ChannelExec channelssh = (ChannelExec)
session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
channelssh.setOutputStream(baos);

// Execute command
//channelssh.setCommand("lsusb > /home/pi/test1.txt");
channelssh.setCommand("sudo reboot");
channelssh.connect();
try{Thread.sleep(10000);}catch(Exception ee){};
channelssh.disconnect();

return baos.toString();
}


public void zmacklTlacitko(View view) {
new AsyncTask<Integer, Void, Void>(){
@Override
protected Void doInBackground(Integer... params) {
try {
executeRemoteCommand("pi", "xxxx","192.168.1.5", 22);


} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(1);
}
}
Při brouzdaní po netu jsem minulý týden našel toto.
https://www.codenong.com/47438181/

Uplně na stejnem principu ale pokud jsem to pochopil, tak

channel1.setCommand("ls /home/pi/pic | sed -n 5p");
aaaa = new String(baos.toByteArray());

By to mělo načist obsah adresaře do aaaa

A nedo třeba channel1.setCommand("echo "$(cat /home/pi/teplota)" | sed -n 5p");

Nějak se mi nedaři, upravit ten muj zdrojak.
Vidim v logu že jsem na raspi připojen ale řetězec aaaa je prazdy. :|

Nemusi to byt zrovna přes tu jsch.
Uvitam cokoliv.
Uživatelský avatar
PetrSmetana
Příspěvky: 310
Registrován: pon 22. črc 2019 9:06:45
Bydliště: Mnich
Dal poděkování: 28 poděkování
Dostal poděkování: 60 poděkování
Kontaktovat uživatele:

Re: Android studio

Příspěvek od PetrSmetana » čtv 15. dub 2021 13:22:45

co ti vrátí

ls /home/pi/pic | sed -n 5p

Když to pošleš do commandlajny?
Modré z nebe na počkání, zázraky do dvou dnů.
Uživatelský avatar
jiri.tusla
Příspěvky: 75
Registrován: ned 08. zář 2019 15:45:09
Dal poděkování: 8 poděkování
Dostal poděkování: 19 poděkování

Re: Android studio

Příspěvek od jiri.tusla » čtv 15. dub 2021 14:23:02

Kód: Vybrat vše

sed -n 5p
způsobí, že se neopisuje vstup a ze vstupu se vytiskne pouze pátý řádek.
Máš tolik souborů v

Kód: Vybrat vše

~pi/pic
?
Dej člověku rybu a nebude mít hlad jeden den.
Nauč jej chytat ryby a bude celý den sedět na pramici a chlastat pivo.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » čtv 15. dub 2021 18:37:26

Tak bych chtěl poprosit někoho, kdo umí Javu.
Upozorňují, že android studio jsem viděl týden před 2 roky a týden teď a Javu neumím, takže mně berte s rezervou

Kód: Vybrat vše

package com.example.myapplicationssh;

import android.os.AsyncTask;
import android.os.Bundle;
import java.io.ByteArrayOutputStream;
import java.text.BreakIterator;
import java.util.Properties;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import android.app.Activity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
    
    //private String aaaa;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public static String executeRemoteCommand(String username,String password,String hostname,int port)
            throws Exception {
        JSch jsch = new JSch();
        Session session = jsch.getSession(username, hostname, port);
        session.setPassword(password);

        // Avoid asking for key confirmation
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);
        session.connect();
        ChannelExec channelssh = (ChannelExec)
                session.openChannel("exec");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        channelssh.setOutputStream(baos);

        // channelssh.setCommand("lsusb > /home/pi/test1.txt");
       // channelssh.setCommand("sudo reboot");
        channelssh.setCommand("cat /home/pi/teplota");
        channelssh.connect();
        try{Thread.sleep(10000);}catch(Exception ee){};
        channelssh.disconnect();

        return baos.toString();

    }
    
    public void zmacklTlacitko(View view) {
        final TextView Label1 = (TextView) findViewById(R.id.Label1); //Získejte ID pro textiew
        new AsyncTask<Integer, Void, Void>(){
            @Override
            protected Void doInBackground(Integer... params) {
                try {
                    executeRemoteCommand("pi", "xxxxxx","192.168.1.5", 22);


                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute(1);
        Label1.setText("After Clicking");

    }
}
Je tam public static String executeRemoteCommand
a dole return baos.toString();
Tim padem vraci string

V tom baos je načtena ta teplota.
Jak ji dostanu do toho Label1.setText co je v tom public void zmacklTlacitko?
Uživatelský avatar
PetrSmetana
Příspěvky: 310
Registrován: pon 22. črc 2019 9:06:45
Bydliště: Mnich
Dal poděkování: 28 poděkování
Dostal poděkování: 60 poděkování
Kontaktovat uživatele:

Re: Android studio

Příspěvek od PetrSmetana » pát 16. dub 2021 9:51:28

Nech si vypsat System.out.println(baos.toString()); do komandlajny, ať víš jistě co tam máš.
Modré z nebe na počkání, zázraky do dvou dnů.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » pát 16. dub 2021 10:03:16

Vim co tam mam.
Ono stači pustit Debug Shift + F9 a nechat to zastavit pod return baos.toString();
Přimo za tým přikazem se zobrazi načtena hodnota v baos.
A dole ve Variables take vidim baos = 24.4
Uživatelský avatar
PetrSmetana
Příspěvky: 310
Registrován: pon 22. črc 2019 9:06:45
Bydliště: Mnich
Dal poděkování: 28 poděkování
Dostal poděkování: 60 poděkování
Kontaktovat uživatele:

Re: Android studio

Příspěvek od PetrSmetana » pát 16. dub 2021 11:08:15

Tam jí dostaneš blbě, když to voláš asynchronně na pozadí :) Když se ti provádí metoda setText u toho labelu, tak nemáš ještě výstup u toho ssh. Je problém to volat synchronně? Pokud ano, tak si udělej fci pro překreslení tlačítka a volej jí zevnitř toho asynchronního bloku.
Modré z nebe na počkání, zázraky do dvou dnů.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » pát 16. dub 2021 12:13:20

U toho druheho zdrojaku jsem psal.
Upozorňují, že android studio jsem viděl týden před 2 roky a týden teď a Javu neumím, takže mně berte s rezervou
Je mi uplně jedno jestli asynchronně nebo synchronně.

Jeden buttom, při kliknuti by zavolal nějakou metodu, ta by načetla tu teplotu a vratila ji a pak by se vykreslila v tom labelu.
Potom to pujde předělat , misto buttonu timer
Jeden timer, ktery by třeba co 5 vteřin načital tu teplotu a vykresloval v labelu
Uživatelský avatar
PetrSmetana
Příspěvky: 310
Registrován: pon 22. črc 2019 9:06:45
Bydliště: Mnich
Dal poděkování: 28 poděkování
Dostal poděkování: 60 poděkování
Kontaktovat uživatele:

Re: Android studio

Příspěvek od PetrSmetana » pát 16. dub 2021 13:16:32

Dovolí ti to místo:

Kód: Vybrat vše

        new AsyncTask<Integer, Void, Void>(){
            @Override
            protected Void doInBackground(Integer... params) {
                try {
                    executeRemoteCommand("pi", "xxxxxx","192.168.1.5", 22);


                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute(1);
tohle:

Kód: Vybrat vše

                try {
                    executeRemoteCommand("pi", "xxxxxx","192.168.1.5", 22);
                } catch (Exception e) {
                    e.printStackTrace();
                }
Modré z nebe na počkání, zázraky do dvou dnů.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » sob 17. dub 2021 4:30:54

Nefunguje to a k raspi se to vubec nepřipoji.
Jsem našel na netu podle čeho jsem to dělal před těma 2 roky.
https://stackoverflow.com/questions/143 ... -with-jsch
Je tam řešeni proč nu to nejede.
Tento kód musíte spustit v jiném vlákně.
Uživatelský avatar
jiri.tusla
Příspěvky: 75
Registrován: ned 08. zář 2019 15:45:09
Dal poděkování: 8 poděkování
Dostal poděkování: 19 poděkování

Re: Android studio

Příspěvek od jiri.tusla » sob 17. dub 2021 18:30:13

A v tom labelu se Ti text "After clicking" objeví?
Ostatně...
V asynchronním volání návratovou hodnotu z executeRemoteCommand co? Zahazuješ.
Takže si ji ulož do proměnné a tu pak nastav jako text do toho labelu. A to ještě uvnitř toho try bloku.

Kód: Vybrat vše

protected Void doInBackground(Integer... params) {
                try {
                    String temp = executeRemoteCommand("pi", "xxxxxx","192.168.1.5", 22);
                    Label1.setText(temp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

Nevím, jak je to na Androidu s vláknama pro manipulaci s GUI prvky.
Ve Swingu se to to muselo pustit ve SwingUtilities.invokeLater, aby se to překreslilo správně.
Dej člověku rybu a nebude mít hlad jeden den.
Nauč jej chytat ryby a bude celý den sedět na pramici a chlastat pivo.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » sob 17. dub 2021 18:43:22

Ano, objeví.
V tom asynchronním volání jsem zkoušel aaaa = new String(baos.toByteArray());
Řetězec aaa je prazdny.
Tu jsem něco našel.
https://stackoverflow.com/questions/109 ... -asynctask
Uživatelský avatar
jiri.tusla
Příspěvky: 75
Registrován: ned 08. zář 2019 15:45:09
Dal poděkování: 8 poděkování
Dostal poděkování: 19 poděkování

Re: Android studio

Příspěvek od jiri.tusla » ned 18. dub 2021 14:20:14

BigSandy píše:
pát 16. dub 2021 10:03:16
Vim co tam mam.
Ono stači pustit Debug Shift + F9 a nechat to zastavit pod return baos.toString();
Přimo za tým přikazem se zobrazi načtena hodnota v baos.
A dole ve Variables take vidim baos = 24.4
Trochu si odporuješ. Jestliže v baos i ve Variable, cokoliv to v AndroidStudiu je, vidíš
správně očekávanou hodnotu, tak se musí vrátit z metody executeRemoteCommand.
Tedy ji musíš dokázat nastavit do Label1, jak jsem ve snippetu kódu navrhl.
Dej člověku rybu a nebude mít hlad jeden den.
Nauč jej chytat ryby a bude celý den sedět na pramici a chlastat pivo.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » ned 18. dub 2021 15:20:26

On je problem že to vlakno ma problem se zapisem do toho Labelu.

I tak jak jsi napsal to funguje.
String temp = executeRemoteCommand("pi", "xxxxxx","192.168.1.5", 22);
Label1.setText(temp);

Ale musim několikrat kliknout na button, než se to vykresli.

Tady s týmto zapasim.
https://stackoverflow.com/questions/148 ... 8#14827618
Uplně dole.
Kam s tým? Ten poslední patři do main activity. Ten je ok.
Ten druhy by měl jit do vlakna, ale furt tam ma chybu.
Uživatelský avatar
jiri.tusla
Příspěvky: 75
Registrován: ned 08. zář 2019 15:45:09
Dal poděkování: 8 poděkování
Dostal poděkování: 19 poděkování

Re: Android studio

Příspěvek od jiri.tusla » ned 18. dub 2021 18:38:17

A to je to, že musíš najít, jak se tohle dělá na androidu.
Nějakému GUI vláknu podáš Runnable nebo něco takového, které vytvoříš
s hodnotou získanou skrz ssh call a ono si to ve volném čase překreslí label.
Dej člověku rybu a nebude mít hlad jeden den.
Nauč jej chytat ryby a bude celý den sedět na pramici a chlastat pivo.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » pon 19. dub 2021 4:40:25

Ja to nechci vykreslovat do labelu z toho vlakna, ale poslat načteny vysledek zpatky do toho buttonu a až pak vykreslit v labelu.
https://stackoverflow.com/questions/109 ... -asynctask
Uživatelský avatar
jiri.tusla
Příspěvky: 75
Registrován: ned 08. zář 2019 15:45:09
Dal poděkování: 8 poděkování
Dostal poděkování: 19 poděkování

Re: Android studio

Příspěvek od jiri.tusla » pon 19. dub 2021 6:15:07

BigSandy píše:
pon 19. dub 2021 4:40:25
...poslat načteny vysledek zpatky do toho buttonu...
Nechápu. Nevidím důvod. Button je UI widget s nápisem a umí se mačkat, pokud je povolený.
Buttonům by se neměly měnit texty.
Tady ^ máš nápovědu - pošli si to přes nějaký message bus mezi vlákny.

Hele, ta aplikace je v principu vícevláknová:
  • hlavní vlákno - to aby běžela a neukončila se
  • GUI vlákno - reaguje na klikání, psaní a podobně a taky překresluje
  • ve Tvém případě je tu ještě ono asynchronní vlákno, které vykonává dlouhotrvající (obecně) činnost
Takže celý životní cyklus vypadá asi takto:
  • Klikneš na button a odpovídající listener (zmacklTlacitko) vytvoří a spustí AsyncTask.
  • AsyncTask by měla být extendována a jako parametr předán label, kam chceš výsledek zobrazit. Tedy asi takhle

    Kód: Vybrat vše

    public class DisplayResult extends AsyncTask<...> {
     private Label destinationLabel;
     public DisplayResult(Label destinationLabel) {
      this.destinationLabel = destinationLabel;
     }
     private String result;
     doInBackground(){
     	result = jakákoliv akce vracející zrovna string
     }
     
     onPostExecute(){
     	Activity.runOnUiThread(() -> destinationLabel.setText(result));
      }
    }
    
  • akce se spustí a běží jako další vlákno a GUI není blokované rovněž tak hlavní vlákno není blokované
  • po dokončení tasku se pustí onPostExecute, který do fronty GUI vlákna založí jinou asynchronní úlohu, která nastaví text do labelu
Takhle se to dělá v desktopových aplikacích a předpokládám, že to takhle bude fungovat i v Androidu.
Dej člověku rybu a nebude mít hlad jeden den.
Nauč jej chytat ryby a bude celý den sedět na pramici a chlastat pivo.
BigSandy
Příspěvky: 196
Registrován: úte 13. srp 2019 8:07:32
Dal poděkování: 1 poděkování
Dostal poděkování: 12 poděkování

Re: Android studio

Příspěvek od BigSandy » pon 19. dub 2021 7:31:17

Necham to nějakou dobu uležet, už mi asi zakrněl mozek. :cry:
Dik všem za snahu pomoct.

To poslat načteny vysledek zpatky do toho buttonu jsem myslel to vratit zpatky do public void zmacklTlacitko odkud se to vlakno volalo.

Snahou tohoro všeho bylo nepouštět to vlakno přes button ale přes timet.
Volal bych AsyncTask i s přikazy.
"cat /home/pi/teplotavoda"
"cat /home/pi/teplotakotel"
atd

Timer by zavolal AsyncTas s přikazen "cat /home/pi/teplotavoda" - vratila by se mu ziskana teplota - tu by vypsal do Label1
pak by zavolal AsyncTas is přikazen "cat /home/pi/teplotakotel" - vratila by se mu ziskana teplota - tu by vypsal do Label2
atd
Odpovědět