2011-06-14 4 views
0

Dans mon application, j'ai des objets avec des positions GPS. Pour le moment, la seule chose que je fais avec eux est de les montrer sur une carte, mais je prévois d'implémenter d'autres fonctionnalités qui nécessitent de connaître l'emplacement des utilisateurs. Je ne souhaite pas ajouter l'autorisation de localisation à mon application, car certains utilisateurs peuvent ne pas vouloir utiliser ces fonctionnalités.Partage du service système à partir d'un plugin pour éviter trop de demandes d'autorisation

Mon idée était d'avoir une apk séparée (une sorte de plugin) qui fournit uniquement l'application principale avec des informations de localisation de sorte que seul le plugin doit demander la permission de localisation.

Est-il possible de laisser le plugin partager un service système (le LocationManager) directement sans créer un service personnalisé avec une interface incompatible afin que l'application principale puisse utiliser le LocationManager du plugin. Cela permettrait d'utiliser des classes existantes comme MyLocationOverlay ou autres. L'application principale pourrait passer un ContextWrapper à ces classes comme ceci:

public static class LocationContext extends ContextWrapper { 

    public LocationContext(Context base) { 
     super(base); 
    } 

    @Override 
    public Object getSystemService(String name) { 
     if (name.equals(LOCATION_SERVICE)) { 
      // Return the LocationManager service of the plugin here... 
     } 
     return super.getSystemService(name); 
    } 

} 

Répondre

2

Je ne sais pas si j'ai bien compris votre question, mais il est possible qu'une application charge des classes à partir d'une autre application et évite ainsi de dépasser les limites du processus. La clé est d'avoir les mêmes attributs android: process et android: sharedUserId dans vos manifestes pour les deux aps. Ensuite, les applications s'exécuteront dans le même processus Linux sur l'appareil. Vous pouvez ensuite utiliser des API de réflexion pour charger par programme les classes de l'application A à partir de l'application B et vice versa. Si l'application A est déjà sur le marché, vous devrez probablement publier une nouvelle version qui ajoute les attributs process et sharedUserId, puis libérer l'application B avec ces mêmes attributs.

+0

Cela semble intéressant. En supposant que les deux fichiers APK ont le même processus et sharedUserId, pouvez-vous donner un exemple de la façon dont l'application principale peut obtenir le LocationManager? – Tom

+0

Je l'ai testé et c'était plus simple que prévu: je viens de créer un projet vide, paramétrer android: sharedUserId et android: process au nom du package de mon application principale et ajouté une balise uses-permission aux plugins AndroidManifest.xml. Maintenant, l'application principale a toutes les permissions définies dans le plugin et a pu obtenir l'emplacement des utilisateurs. Donc, cette approche ne nécessite pas une seule ligne de code dans le plugin. – Tom

+0

Google ne le recommande pas: http://stackoverflow.com/questions/6354035/two-android-applications-with-same-user-id/6354073#6354073 De même, vous rééditez l'application A, il a été démontré que les recommandations étaient erronées , car la nouvelle application A n'aura plus accès aux fichiers qu'elle a enregistrés sous son ID utilisateur d'origine - Android, au moins via la série 2.x, n'a pas changé automatiquement l'ID utilisateur des fichiers lorsque l'ID utilisateur de la application modifiée. – CommonsWare

0

Est-il possible de laisser la part du plugin un service système (LocationManager) directement sans créer un service personnalisé avec une interface incompatible de sorte que la L'application principale peut utiliser le LocationManager du plugin.

Cela ne sera pas possible. LocationManager n'est pas Parcelable, donc vous ne pouvez pas le passer entre les processus.

Ceci permettrait d'utiliser des classes existantes comme MyLocationOverlay ou autres.

Um, no. Vous n'avez pas écrit MyLocationOverlay. Vous ne pouvez pas le forcer à utiliser un faux LocationManager de votre propre conception.

L'application principale pourrait passer un ContextWrapper à ces classes comme celui-ci

ContextWrapper n'est pas Parcelable, vous ne pouvez pas passer entre les processus.

+0

Il n'est pas absolument correct que je ne peux pas forcer MyLocationOverlay à utiliser un autre service. Je ne voulais pas dire que ContextWrapper fait partie du plugin. Il est créé dans l'application principale et transmis à toute classe qui obtient un service système à l'aide de Context.getSystemService(). Le seul travail de ContextWrapper serait alors d'obtenir le LocationManager du plugin. J'ai déjà essayé de sous-classer LocationManager pour créer un proxy mais LocationManager a un constructeur privé donc ce n'est pas possible. – Tom

+0

@Tom: J'ai mal compris votre utilisation de 'ContextWrapper', et c'est certainement une curieuse approche du problème. Cependant, vous ne pouvez pas obtenir 'LocationManager' entre les processus, ni certains des paramètres qu'il utilise (' GpsStatus', 'Looper', etc.). Puisque vous n'avez pas écrit 'MyLocationOverlay', vous ne savez pas comment cela pourrait changer dans les futures versions d'Android, donc votre application pourrait se bloquer si vous, par exemple, créez une sous-classe de' LocationManager' avec une implémentation d'API partielle pour essayer de supporter à travers les limites du processus. – CommonsWare

+0

@Tom: Votre approche de plugin APK lui-même est solide, tant que vous faites quelque chose en matière de sécurité pour empêcher d'autres applications arbitraires d'obtenir des données de localisation de votre plugin. Cependant, je suppose que vous devrez implémenter votre propre API (par exemple, AIDL) et consommer cette même API. – CommonsWare

1

Oui, cela est possible, mais je conseille vivement aux ingénieurs Android OS de désactiver cette possibilité et aussi toute autre manière de 2 applications conviviales (même uuid, même signature) en utilisant les autres fonctionnalités car cela conduit à une sécurité sérieuse. trous "dans le système d'autorisation et de graves problèmes dans la sécurité Android ...

Imaginez 3 applications conviviales. Le premier a la permission de se connecter à internet et rien de plus, le second peut envoyer des SMS mais rien de plus et le troisième peut accéder à votre position .... chaque application seule est relativement inoffensive ... mais l'image que pouvez-vous faites-les tous ensemble, puisqu'ils sont autorisés à communiquer.

Questions connexes