Aller au contenu

Communication avec une application tierce


smith

Recommended Posts

Bonjour à tous,

Je voudrais savoir comment procéder pour appeler une fonction d'une application à partir de son application.

Je m'explique :

Sous Windows il existe des API, des DLL et autres pour lancer des appels aux fonctions d'une application.

Là, je souhaiterais savoir comment communiquer avec une application à partir de son apk. Exemple : j'appuie sur un bouton et ça lance un appel skype (skype android).

Merci d'avance :)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Tout d'abord il faut savoir que les applications Android sont dans des bacs à sable (sandbox) et ne peuvent donc pas dialoguer entres elles par défaut.

Cependant, Android fournit un composant IPC (communication inter-processus) nommé Binder qui permet aux applications de partager des espaces mémoires communs. A partir de ce composant, on retrouve grosso-modo trois implémentations Java pour faire communiquer les applications entre elles :

- les Intents qui sont des "messages" permettant de déclencher des événements sur d'autres applications/composants (démarrer une activité, récupérer l'état de la batterie, ...) ;

- les interface AIDL qui permettent de s'interfacer avec des Services (ex : contrôle d'un lecteur audio) ;

- les ContentProvider qui permettent d'exposer des données aux autres applications (l'application Contact qui partage la liste des contacts) ;

Chaque implémentation correspond à un besoin. Par contre il est nécessaire que l'application tierce est définie des "ouvertures" pour communiquer avec d'autres applications.

Pour Skype, je ne sais pas. Mais il doit y avoir probablement une action à la réception d'un évènement Intent.CALL. Essaie un truc dans ce genre :

public static void call(Activity activity) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:010000000"));
activity.startActivity(intent);
}

Bon courage,

ichpa

Lien vers le commentaire
Partager sur d’autres sites

Ou alors, tu peux décompiler l'apk :P

Il y a souvent des infos utiles dans le Manifest: Activity qui s'ouvre à partir d'une "url", etc...

Tu peux trouver aussi les paramètres Intent à donner dans les classes décompilées (mais c'est un peu plus dur).

J'ai fais ça pour 3-4 applis Twitter, et l'appli Facebook officielle

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Il n'y a pas de secret : il faut que ce soit documenté.

ichpa

Où peut-on trouver l'info ?

En décompilant l'APK Skype, j'ai 3 principaux dossiers "lib" (composé de "\armeabi\libpcmhost.so"), "res" (design sûrement) et "smali" avec beacoup de classe on dirait.

Je dois sûrement réutiliser les classes pour appeler les fonctions Skype, non ?

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

/lib: le code natif, pas utile pour toi

/res: les images, layouts, etc...

/smali: les fichiers .java, mais en code "dex", c'est ce qu'il te faut

Essaye de déterminer quelle Activity est lancée lors d'un appel (grâce à logcat) et regarde le code de la classe correspondante.

Avec un peu de chance, tu trouvera dans le "onCreate" le décodage de l'intent et les paramètres à passer.

Lien vers le commentaire
Partager sur d’autres sites

/lib: le code natif, pas utile pour toi

/res: les images, layouts, etc...

/smali: les fichiers .java, mais en code "dex", c'est ce qu'il te faut

Essaye de déterminer quelle Activity est lancée lors d'un appel (grâce à logcat) et regarde le code de la classe correspondante.

Avec un peu de chance, tu trouvera dans le "onCreate" le décodage de l'intent et les paramètres à passer.

Avec tout ces fichiers smali je suis complétement perdu... Je ne reconnais pas trop la syntaxe du langage utilisé (JAVA sûrement) et j'ai vraiment du mal à comprendre les algorithmes.

Fichier a.smali par exemple :

.class final Lcom/flurry/android/a;
.super Ljava/lang/Object;
.source "SourceFile"

# interfaces
.implements Ljava/lang/Runnable;


# instance fields
.field private synthetic a:Landroid/content/Context;

.field private synthetic b:Lcom/flurry/android/FlurryAgent;


# direct methods
.method constructor <init>(Lcom/flurry/android/FlurryAgent;Landroid/content/Context;)V
   .locals 0
   .parameter
   .parameter

   .prologue
   .line 461
   iput-object p1, p0, Lcom/flurry/android/a;->b:Lcom/flurry/android/FlurryAgent;

   iput-object p2, p0, Lcom/flurry/android/a;->a:Landroid/content/Context;

   invoke-direct {p0}, Ljava/lang/Object;-><init>()V

   return-void
.end method

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...