PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → [Android] Intégrer un retour via onActivityResult
[Android] Intégrer un retour via onActivityResult
Débuté par Thierry, 01 fév. 2018 11:06 - 9 réponses
Posté le 01 février 2018 - 11:06
Bonjour,

J'intègre du code natif java dans WM21.

Comment intégrer/modifier une fonction "onActivityResult".

J'ai essayé de créer une fonction en code java mais elle n'est pas appellée. ;(

Des idées ?
Membre enregistré
151 messages
Popularité : +7 (7 votes)
Posté le 01 février 2018 - 17:05
Bonjour,

il faut tout d'abord aller contrôler dans le manifest, dans la branche "activity", si "action" et "category" sont bien renseignés.

Dans le code Java, le contexte courant peut être récupéré avec getContexteApplication(), et l'activité avec getActiviteEnCours(). Attention, ce sont des méthodes Java. Plus d'infos : https://doc.pcsoft.fr/fr-FR/?9000108&name=Particularites_des_applications_pour_Android

Ensuite il faut créer une classe qui surcharge Activity.

public static class MaClasse extends Activity {


Là dedans, une fonction qui regroupe tout.

Context cnt   = getContexteApplication();
Intent intent = new Intent(cnt, MainActivity.class);
cnt.startActivity(intent);


"com.tondomaine.tonapp" est le fameux "action" du manifest.

Cette classe contient aussi le "onActivityResult".

Ensuite, vous appelez la fonction, et surtout vous croisez les doigts. Faudrait que je retrouve le code qui fait ça correctement, ce que je vous ai fourni est juste une piste.
Membre enregistré
23 messages
Posté le 01 février 2018 - 18:10
Merci pour cette réponse.

J'ai l'impression au vu de la technicité qu'on frôle les limites de windev.

Pour bien être sûr :
- Etape 1 : contrôler dans le manifest, dans la branche "activity", si "action" et "category" sont bien renseignés
- Etape 2 : faire une classe qui surcharge Activity avec la fameuse fonction onActivityResult
=> Il faut le créer un .JAR c'est bien cela ?
- Etape 3 : Dans Windev en code natif, au lieu de passer par getContexteApplication() passer par cnt avec :
Context cnt = getContexteApplication();
Intent intent = new Intent(cnt, MainActivity.class);
cnt.startActivity(intent);
- Etape 4 : croiser les doigts

J'ai tout bon ?

Si j'arrive à faire cela je ferais un retour détaillé.
Membre enregistré
23 messages
Posté le 01 février 2018 - 18:46
Dans le manifest, dans "application", j'ai une tripotée d'"activity" sans "action" et "category". Que dois-je exactement vérifier ?

Après avoir créé la classe qui surcharge directement après une fonction native et en intégrant le code proposé j'obtiens :
error: cannot find symbol MainActivity.class
Intent intent = new Intent(cnt, MainActivity.class);


Merci encore pour l'aide
Message modifié, 01 février 2018 - 18:57
Membre enregistré
23 messages
Posté le 05 février 2018 - 15:08
Je ne suis pas arrivé au bout de ce sujet qui est bloquant pour moi et je fais un topo car j'apprends des choses qui pourraient être utiles à d'autres.

J'ai deux pistes :
- Piste 1 : récupérer les arguments de lancement de l'app :
Ce que j'essaye de faire revient je pense à récupérer les paramètres de lancement de l'app (myapp://test?param1=123&param2=456). Je ne trouve rien dans la doc à ce sujet concernant Android. ;(
Avez-vous déjà fait ça ?

- Piste 2 : modifier l'Activity principale instanciée par Windev
La classe en question extends WDAbstractLanceur. WDAbstractLanceur.class se trouve dans le dossier de génération. J'arrive sans difficulté à la décompiler et là, je retrouve bien la fonction onActivityResult que je peux donc modifier comme je souhaite.
J'espère pouvoir la recompiler et remplacer l'originale.
Mais comment recompiler ce fichier ?

Je suis ouvert à toute idée/commentaire... :merci:

Merci
Message modifié, 05 février 2018 - 15:09
Posté le 07 février 2018 - 10:48
Bonjour, Thierry

J'ai suivi ce fil avec intérêt car mon problème, sans être similaire, peut trouver solution dans les même démarches.
Jusqu'à ton post du 1er février, j'ai suivi les étapes à ceci près que :
- La classe où je travaille (qui correspond à celle où tu devrais placer onActivityResult), je l'ai nommé MainActivity.
Et pour faire face à la dernière erreur que tu indiques au 1er février, j'ai carrément placé ma class MainActivity en code java dans une procédure globale du même nom.
De ce fait j'arrive à compiler et il semble retrouver ma class.
Mais à l'exécution, l'application ne trouve pas la class dans le manifeste.

- Le souci est donc maintenant au manifeste.
De ce que j'ai lu nous devrions ajouter l'activity au manifeste et avoir ça :
<activity
android:name=".Nom_de_l'activity" >
<intent-filter>
<action android:name="com.exemple.appexemple.GWDCProceduresGlobales$MainActivity" />
//(Le nom de l'action m'a été signifié par l'erreur windev à l'exécution)
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Le souci est que je ne peux pas compiler avec le symbole "$" dans le manifeste, mais si je le remplace par un ".", mon application compile mais ne trouve pas mon activity.

Si on pouvait connaître comment faire référence à une class déclarée en procédure globale, peut être que nous pourrions achever ce que nous proposais Gaël
Membre enregistré
23 messages
Posté le 07 février 2018 - 19:24
Bonjour Florian,
Content de savoir que je ne suis pas tout seul dans cette galère. Je suis assez surpris de ne pas retrouver trace de problèmes analogues sur le forum.
J'ai par ailleurs posé la question au support technique il y a quelques jours...

Je vais essayer de poursuivre à partir de là où tu en es et on se tiens au jus. (je suis preneur d'info si tu avances).

Concernant la piste "ésotérique" qui consiste à modifier une classe du core Windev, j'avance et ne dois pas en être très loin.
Mais tant d'effort pour ça ! Il doit y avoir une solution plus simple...
Posté le 09 février 2018 - 10:35
Justement j'ai du nouveau, au niveau du manifeste je l'ai changé pour ça :

<activity
android:name=".wdgen.GWDCProceduresGlobales$MainActivity" >
<intent-filter>
<action android:name="androi.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Ce qui en fait un manifeste reconnu valide au lancement.

Résultat, une activity se lance, ce qui est génial ! Mais elle retourne une erreur et plante avant que je ne puisse lire l'erreur.
Mais je ne vais plus dans cette direction car ce que j'ai besoin de faire concerne plutôt les services android car je ne veux pas d'interface utilisateur.

Si je réussis à faire tourner totalement une activity je l'écrirai.
Posté le 14 octobre 2018 - 11:24
Bonjour,

Avez-vous réussi ?
Je ne parviens pas à indiquer au manifest, le nom de la méthode Java qui étend Activity.

J'ai créé une collection de procédure COL_JAVA, dans laquelle j'ai écrit le code suivant en Java :

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.net.Uri;
import android.widget.Toast;

public static class ReceptionImage extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

Integer entier = 1/0;

...
}
}

Dans le manifest, j'ai ajouté ceci :

<activity android:name="com.masociete.express_receptionimage.wdgen.GWDCPCOL_JAVA$ReceptionImage" android:label="Envoi photos vers WD">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:name=""
android:mimeType="image/*" />
</intent-filter>
</activity>


"GWDCPCOL_JAVA" est le nom du fichier .java généré par WD.

Lorsque je souhaite partager une photo depuis la galerie, j'ai bien "Envoi photos vers WD" qui m'est proposé. Lorsque je clique dessus, une fenêtre s'ouvre avec le nom du label et puis rien ne se passe. L'application ne plante pas, malgré mon 1/0. J'ai essayé d'afficher un Toast, d'ouvrir une fenêtre depuis un appel à une fonction en WL... Le résultat est toujours le même. Je me demande s'il comprend quelle classe utiliser.

Avez-vous une idée ?

Avec mes remerciements,

Caroline.
Posté le 26 avril 2019 - 11:19
Bonjour
avez vous plus d'information à communiquer sur l'utilisation d'une classe java qui surclasse l'activity d'Android ?

un projet exemple si possible :)

Merci beaucoup