Nous développons une application qui envoie des données vers d'autres applications (application écosystème)

Salut les gars!

Ceci est mon deuxième article sur le développement de mon projet . Pour ceux qui n'ont pas lu l' article précédent : il s'agit de savoir comment exporter automatiquement des données d'un lieu (google table) vers un autre (home).

Aujourd'hui, je vais vous dire comment j'ai écrit (et conçu) la bibliothèque afin que les applications tierces puissent recevoir les données envoyées par ma demande. Je demande à tout le monde intéressé par cat.

Partie 1. Problème


En bref sur le projet. Il existe un appareil qui se connecte à un smartphone. Il y a mon application, à l'intérieur de laquelle le réseau neuronal reconnaît les données de l'appareil et donne le résultat. Et il y a d'autres applications qui veulent obtenir ce résultat même.

Le résultat peut être de plusieurs types: données nues de l'appareil, données traitées de l'appareil, informations sur l'état de l'appareil, informations sur les droits d'accès de l'application aux données (par exemple, que l'utilisateur a révoqué les droits d'accès aux données de l'appareil). Il est nécessaire de transférer en quelque sorte ce résultat même vers d'autres applications.

Si soudainement j'explique quelque chose de mal par mon code - voici la documentation de ma bibliothèque.

Partie 2. Planification d'une solution


Il existe un merveilleux mécanisme: les émissions. En bref, il s'agit d'un message d'une application vers d'autres applications. Vous pouvez l'envoyer à tout le monde immédiatement, ou vous pouvez l'envoyer à une personne spécifique.

Pour envoyer et recevoir cette entreprise, vous avez besoin de:

  1. Faire en quelque sorte JSON à partir de l'objet passé
  2. Soumettre la diffusion
  3. Accepter la diffusion dans une autre application
  4. Récupérer un objet transmis depuis JSON

En général, créer un JSON à partir d'un objet n'est pas toujours correct. Vous pouvez envoyer un objet appelé Parcelable via Broadcast ou Serializable. Serializable est une chose standard de Java, Parcelable est une chose similaire, mais optimisée pour les appareils mobiles.

Mes objets sont assez petits. De plus, il est souvent nécessaire d'obtenir du JSON: j'ai moi-même écrit une application tierce pour qu'elle envoie des données brutes au serveur. Par conséquent, j'ai choisi "créer JSON à partir de l'objet passé". Peut-être que je changerai d'avis.

Partie 3. Scier la solution


Paragraphe 1 et paragraphe 4. Dans JSON, puis retour


Ici, tout est simple. Il existe une bibliothèque Gson parfaitement adaptée à nos besoins.

Pour rendre les choses cool, remplacez la méthode toString (). Eh bien, faites fromString () pour récupérer notre objet.

class SecureData(val eeg1: Double?, val eeg2: Double?, date: Date) { override fun toString(): String { val gson = Gson() return gson.toJson(this) } companion object { fun fromString(model: String): SecureData { val gson = Gson() return gson.fromJson(model, SecureData::class.java) } } } 

Point 2. Nous envoyons l'objet


Voici un exemple d'un tel code:

 val intent = Intent() intent.action = BroadcastUtils.BROADCAST_GESTURE intent.putExtra(BroadcastUtils.EXTRA_GESTRE, it.toString()) sendBroadcast(intent) 

Ici, nous créons une intention, définissons son action, mettons l'objet et l'envoyons en tant que diffusion.
BroadcastUtils.BROADCAST_GESTURE est une petite chose par laquelle nous filtrerons les diffusions entrantes dans une autre application (qu'elles soient traitées ou non).

Pour envoyer un message à une application spécifique, vous devez également spécifier les éléments suivants:

  intent.component = ComponentName( PermissionsFetcher.REFACE_APP, "${PermissionsFetcher.REFACE_APP}.receivers.ActionsReceiver" ) 

PermissionsFetcher.REFACE_APP est le APPLICATION_ID de mon application, et $ {PermissionsFetcher.REFACE_APP} .receivers.ActionsReceiver est le chemin d'accès au récepteur.

Point 3. Nous recevons des objets


C'est ainsi que nous enregistrons le récepteur. Si vous l'enregistrez en utilisant le contexte de l'application, il recevra des diffusions jusqu'à la fermeture de l'application. Si vous utilisez le contexte d'activation - jusqu'à sa fermeture.

  registerReceiver(GesturesReceiver(), IntentFilter(BroadcastUtils.BROADCAST_GESTURE)) 

Et voici le GesturesReceiver:

 class GesturesReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Timber.i("Received gesture") val action = BroadcastUtils.reparseGestureIntent(intent) MainApp.actionSubject.onNext(action) } } 

Ici, comme vous le voyez, j'ai reçu l'intention, je l'ai refaite à un objet et je l'ai envoyée quelque part en utilisant RxJava.

Partie 4. Conclusion


Vous lisez un article sur la conception d'applications qui devraient interagir avec d'autres applications. J'espère que cette expérience vous aidera avec quelque chose.

Pour augmenter l'effet, vous pouvez voir les sources de ma bibliothèque et un exemple de travail avec elle et mettre un astérisque au cas où vous en auriez besoin: github.com/reface-tech/CodeSpecialApp

Source: https://habr.com/ru/post/fr467205/


All Articles