IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Débutant en appli Android avec Delphi


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut Débutant en appli Android avec Delphi
    Bonjour,

    Débutant en programmation Delphi, j'ai suivi le cours de Pascal

    J'ai donc installé Delphi 10.4.2 Sydney Community Edition et j'ai parcouru ses exemples d'applications (https://github.com/DeveloppeurPascal...idTVAvecDelphi) et commencé à lire quelques cours (https://delphi.developpez.com/faq/?p...is-pour-Delphi).
    Je pense avoir un peu cerné les contours du langage, enfin j'espère !

    Mon but est de commencer par faire une appli sous Android qui serait une sorte de raccourci pour lancer une autre appli mais en passant d'abord par une commande pour forcer son arrêt.

    Les commandes avec ADB sont:
    adb shell am force-stop com.the.package
    adb shell monkey -p com.the.package 1


    En C++, ca pourrait donner un truc comme çà:
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public abstract OutputStream getOutputStream();
     
    private void kill&Start(){
    try {                
    		Process suProcess = Runtime.getRuntime().exec("su");
                    DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
    		os.writeBytes("adb shell" + "\n");
    		os.flush();
                    os.writeBytes("am force-stop com.the.package");
                    os.flush();
                    os.writeBytes("monkey -p com.the.package 1");
                    os.flush();
    		os.close(); 
    		suProcess.waitFor();		
    		finishAffinity();                   
        }
    }

    Mais en langage Delphi, j'ai beau chercher sur le forum des notions de commandes ADB, je n'ai rien trouvé qui m'aide !

    D'avance merci pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Jamais essayé. Peut -être en partant sur des JNI

    voir cet article

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    Sur Google, on trouve assez vite que Runtime.getRuntime().exec se remplace par TJRuntime.JavaClass.getRuntime.exec ce qui retourne un JProcess

    Tout ça est aussi dans la JNI, c'est juste une approche plus proche de la votre.
    https://developer.android.com/refere.../Runtime?hl=en
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sur Google, on trouve assez vite que Runtime.getRuntime().exec se remplace par TJRuntime.JavaClass.getRuntime.exec ce qui retourne un JProcess

    Tout ça est aussi dans la JNI, c'est juste une approche plus proche de la votre.
    https://developer.android.com/refere.../Runtime?hl=en
    Effectivement, j'avais noté des choses au niveau de la commande root
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure AskRoot;
      var root:JRuntime;
      begin
        root.getRuntime.exec(StringToJString('su'));
      end;

    Mais j'avais bloqué sur le OutputStream. Je vais donc regarder dans cette direction aussi.

    En tout cas, merci pour votre retour efficace.

    Bonne soirée

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sur Google, on trouve assez vite que Runtime.getRuntime().exec se remplace par TJRuntime.JavaClass.getRuntime.exec ce qui retourne un JProcess

    Tout ça est aussi dans la JNI, c'est juste une approche plus proche de la votre.
    https://developer.android.com/refere.../Runtime?hl=en
    Pour la méthode TJRuntime.JavaClass.getRuntime.exec, j'ai réussi à déclarer le getRuntime() et exec comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    type
    JProcess = interface;
    JRunTime = interface;
     
    //----------------------------------JProcess----------------------
    JProcessClass= interface(JObjectClass)
    ['{D1C77950-5890-4897-950F-329331FC6873}']
      {Methods}
      function init: JProcess; cdecl;
    end;
     
    [JavaSignature('java/lang/Process')]
    JProcess = interface(JObject)
    ['{A48155DF-E1E9-4A2C-B832-EBACAED29DB5}']
      {Methods}
      procedure destroy;cdecl;
      function exitValue():integer;cdecl;
      function getErrorStream():JInputStream;cdecl;
      function getInputStream():JInputStream;cdecl;
      function getOutputStream():JOutputStream;cdecl;
      function waitFor():integer;cdecl;
    end;
    TJProcess = class(TJavaGenericImport<JProcessClass, JProcess>) end;
     
     //----------------------------------Jruntime----------------------
    JRunTimeClass= interface(JObjectClass)
    ['{5EE261E7-E8B5-4F5B-A8BA-8DFB2D76F7C4}']
      {Methods}
      function getRuntime(): JRunTime; cdecl;
    end;
     
    [JavaSignature('java/lang/Runtime')]
    JRunTime = interface(JObject)
    ['{0CF96D0C-E9DB-4FC9-8674-B3B2A7C67D08}']
      {Methods}
      function exec( prog:JString):JProcess;cdecl;
    end;
    TJRunTime = class(TJavaGenericImport<JRunTimeClass, JRunTime>) end;

    Je n'ai pas de message d'erreur mais j'ai des points d'exclamation rouges dans la structure:
    Nom : Annotation 2022-02-19 162258.png
Affichages : 1377
Taille : 11,3 Ko

    J'ai tenté différentes méthodes pour lancer le runtime (dont celle ci-dessous) mais ca ne fonctionne pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Forcer l'arrêt de l'application via la commande ADB
    Process:=TJRuntime.JavaClass.getRuntime.exec(StringToJString('am force-stop com.the.package'));
    Process.waitFor;
    Input := Process.getInputStream;
    bufflen := Input.available;
    buff := TJavaArray<Byte>.Create(bufflen);
    Input.read(buff);

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Bonsoir,

    Sinon, est il possible de passer par un moyen détourner en ouvrant la fenêtre de paramétrages de l'application et de chercher le bouton "Forcer l'arrêt" sur le menu ?

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par 306xshdi Voir le message
    Bonsoir,

    Sinon, est il possible de passer par un moyen détourner en ouvrant la fenêtre de paramétrages de l'application et de chercher le bouton "Forcer l'arrêt" sur le menu ?
    je pense que tu fais fausse route, tu réfléchis comme un développeur Windows

    sous Android, le cycle de vie des applications n'est pas le même, l'OS peut geler, arrêter et redémarrer une appli s'il estime que c'est bien de le faire...tu n'as pas ça sous Windows...par ailleurs les droits entre applications sont bcp plus strictes que sous Windows, et c'est heureux, tu ne voudrais pas que n'importe quelle application du Playstore vienne décider de stopper tes applications, lire tes paramètres, vider ton cache etc...donc tu peux oublier toutes ces rustines (sauf à travailler sur un mobile rooté qui te permet de tout faire).

    donc le seul moyen qu'il te reste c'est de chercher dans la doc Google s'il est possible de stopper une appli tiers.

    après une rapide recherche il semblerait que depuis Android 2.2 ce n'est plus possible.
    D'ailleurs l'aide de killBackgroundProcesses indique
    Have the system immediately kill all background processes associated with the given package. This is the same as the kernel killing those processes to reclaim memory; the system will take care of restarting these processes in the future as needed.
    c'est à dire que tu ne fais que forcer ce que fait le système déjà automatiquement, à savoir stopper des services en tâche de fond quand le mobile arrive à cours de ressources...et il peut très bien les redémarrer s'il considère que c'est pertinent ^^

    Est-ce qu'on peut savoir dans quel contexte tu cherches à faire ça ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Jamais essayé. Peut -être en partant sur des JNI

    voir cet article
    Merci pour le retour. Je confirme que j'ai pu lancer mon application avec cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Intent.setPackage(StringToJString('com.the.package'));
    Intent.setAction(TJIntent.JavaClass.ACTION_MAIN);
    SharedActivity.startActivity(Intent);
    Par contre, il faut que je regarde en détails la compilation du programme car je me retrouve avec une APK qui fait 33Mo avec uniquement ce bout de code !

  9. #9
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    j'ai un doute là, tu veux lancer un shell adb sur Android sous root ?

    d'une part il faudrait que le mobile soit rooté et d'autre part que adb soit installé, je ne pense pas que ce soit le cas...adb est installé sur le poste de développement pour communiquer en USB ou TCP/IP avec un périphérique Android dont le mode développeur a été activé.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Bonjour

    Merci pour la réf sur ce que j'avais montré pour Android TV, mais si tu veux juste faire une application Android tu n'as pas de raison de manipuler ADB (en dehors de la connexion) : crée un projet FireMonkey, dessine tes écrans et compile sur le périphérique Android connecté à l'ordinateur.

    Si ton programme doit lancer une autre application, tu peux tout simplement utiliser l'unité suivante : https://github.com/DeveloppeurPascal.../u_urlOpen.pas

    Son but de départ était d'ouvrir des URL, mais si on fournit le chemin vers un APK, il se lance de la même façon.

    Enfin, si tu veux faire une borne interactive sous Android, tu voudras peut-être la verrouiller sur ton application. C'est faisable en activant le mode kiosque. Un exemple et des explications sont fournis sur GetIt (en téléchargement gratuit depuis l'IDE de Delphi) pour ça.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Citation Envoyé par pprem Voir le message
    Bonjour


    Merci pour la réf sur ce que j'avais montré pour Android TV, mais si tu veux juste faire une application Android tu n'as pas de raison de manipuler ADB (en dehors de la connexion) : crée un projet FireMonkey, dessine tes écrans et compile sur le périphérique Android connecté à l'ordinateur.

    Si ton programme doit lancer une autre application, tu peux tout simplement utiliser l'unité suivante : https://github.com/DeveloppeurPascal.../u_urlOpen.pas

    Son but de départ était d'ouvrir des URL, mais si on fournit le chemin vers un APK, il se lance de la même façon.

    Enfin, si tu veux faire une borne interactive sous Android, tu voudras peut-être la verrouiller sur ton application. C'est faisable en activant le mode kiosque. Un exemple et des explications sont fournis sur GetIt (en téléchargement gratuit depuis l'IDE de Delphi) pour ça.
    Bonjour,

    Merci Pascal et Paul pour votre retour.

    A la base, je souhaite simplement créer une application (A) qui ferait 2 choses:
    1. forcer l'arrêt de l'appli com.the.package.B
    2. lancer l'appli com.the.package.B

    J'avais réussi via des commandes ADB (effectivement, pas besoin des droits su) et n'y connaissant rien à Delphi, je mettais imaginé que reproduire ces commandes serait le plus facile pour un débutant.

    Mais en fait, je me rencontre que ce n'est peut-être pas la bonne solution.

    Pour l'étape 2, avec le lien de Sergio, j'ai pu lancer l'appli com.the.package.B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Intent.setPackage(StringToJString('com.the.package'));
    Intent.setAction(TJIntent.JavaClass.ACTION_MAIN);
    SharedActivity.startActivity(Intent);
    Maintenant, je vais chercher comment:
    - forcer l'arrêt de l'appli B (étape 1)
    - fermer ma nouvelle appli (A) une fois l'appli B lancée.
    - réduire la taille de ma nouvelle appli (A) car actuellement, 33Mo.

    Merci à tous pour vos conseils et passez une bonne journée
    A+

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 593
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par 306xshdi Voir le message
    - réduire la taille de ma nouvelle appli (A) car actuellement, 33Mo.
    En virant System.RTTI (si c'est possible), et en faisant une version release et non debug

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 54
    Par défaut
    Maintenant, je vais chercher comment:
    - forcer l'arrêt de l'appli B (étape 1)
    - fermer ma nouvelle appli (A) une fois l'appli B lancée.
    - réduire la taille de ma nouvelle appli (A) car actuellement, 33Mo.

    Merci à tous pour vos conseils et passez une bonne journée
    A+
    Bon, j'ai réussi à trouvé comment fermer l'appli A qui sert de lancement à l'appli B.
    Par contre, je n'ai rien trouvé de concret pour forcer l'arrêt de l'appli B avant de la relancer !

  14. #14
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Citation Envoyé par 306xshdi Voir le message
    - forcer l'arrêt de l'appli B (étape 1)
    toujours une mauvaise idée de planter une application : risque de pertes de données, regarde plutôt comment la remettre en premier plan

    Citation Envoyé par 306xshdi Voir le message
    - fermer ma nouvelle appli (A) une fois l'appli B lancée.
    Close sur la fiche principale ou au pire Application.Terminate, mais de toute façon une fois que tu as déclenché l'ouverture de l'autre application il est possible que la tienne soit passée en arrière plan selon les appareils et ne puisse donc plus rien faire d'autre.

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/08/2016, 18h05
  2. Réponses: 0
    Dernier message: 10/10/2014, 19h18
  3. [Débutant] Développer et Déployer une Appli Android avec VS2013
    Par Dan972 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 11/05/2014, 17h01
  4. WD mobile appli Android avec Publicité
    Par Genko dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 23/03/2013, 19h33
  5. Réponses: 3
    Dernier message: 07/02/2011, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo