Mise à jour automatique pour les applications Android (privées)

Je développe une application Android non publique, c’est-à-dire que l’application ne sera pas disponible sur l’Android Market mondial. L’application sera installée sur un nombre limité de clients, par exemple en utilisant un fichier apk. Comment puis-je activer une fonctionnalité de mise à jour automatique dans cette application?

Je vois différentes options possibles (je ne sais pas si celles-ci sont techniquement difficiles ou même impossibles à mettre en œuvre ou s’il existe des fonctionnalités existantes pouvant être réutilisées):

  • A chaque lancement, l’application teste s’il existe une nouvelle version (en demandant un serveur), si tel est le cas, télécharge le nouvel apk et se remplace par la nouvelle version.
  • Utilisez (ou développez?) Une application ou un service séparé qui effectue le processus de vérification et de remplacement des mises à jour.
  • Utilisez (ou développez?) Une application de marché privé avec une option de mise à jour automatique. Cette option est similaire à la seconde, mais plus générique: l’application du marché serait connectée à un référentiel, c’est-à-dire qu’elle traiterait un nombre arbitraire d’applications (privées).

Je préférerais l’option 1 car la fonctionnalité de mise à jour automatique est incluse dans l’application et nécessite moins d’efforts de développement.

    janjonas, dans la société où je travaille, nous avons eu un problème similaire avec Windows Mobile 6.x, et nous utilisons à peu près la même solution que celle proposée par EboMike:

    entrer la description de l'image ici

    L’application principale vérifie si elle est mise à jour, contre un WebService. Il reçoit la version actuelle et l’URL d’où télécharger la nouvelle version, si nécessaire. L’application principale lance alors l’application Updater, en passant l’URL et quitte.

    Le programme de mise à jour effectue le téléchargement du nouveau programme, via HTTP, en montrant à l’utilisateur le% téléchargé. L’utilisateur peut annuler le téléchargement à tout moment, de manière contrôlée, et le programme de mise à jour peut enregistrer cette annulation.

    Depuis le téléchargement de la nouvelle application, Updater exécute la nouvelle application et quitte.

    Je pense que l’option 1 est la moins coûteuse pour vous, et en fait la plus propre, car elle utilisera le bon programme d’installation du programme d’installation intégré d’Android qui inclut la notification de l’utilisateur et la possibilité pour l’utilisateur d’annuler l’installation si voulu.

    Vous avez déjà tout décrit – recherchez une nouvelle version sur un serveur (ce serait bien de donner à l’utilisateur la possibilité de l’éteindre), et s’il ya une nouvelle version, vous pouvez soit lier l’URL avec l’APK (qui, IIRC, utilisera le gestionnaire de téléchargement du navigateur pour le télécharger) ou vous pourrez le télécharger avec votre application, puis pointer l’intention dans votre fichier local. L’utilisation du lien HTTP est techniquement moins efficace et plus propre – plus vous laissez le système d’exploitation agir, mieux c’est – sauf s’il y a une raison de ne pas le faire.

    L’activation de “Installer l’application non commerciale” est toujours nécessaire pour toute application en dehors de Google Play. S’il n’est pas activé, le processus d’installation le demandera et redirecta l’utilisateur vers les parameters de l’application. Ensuite, l’utilisateur pourra installer l’application.

    Selon vos besoins, vous pouvez déléguer à une troisième partie lib.

    Certaines des permissions que nous utiliserons pour ce faire sont les suivantes:

        

    Laissez-moi vous expliquer un peu … Le dernier, WRITE_EXTERNAL_STORAGE, est explicite. Avec ACCESS_SUPERUSER, nous indiquons au système que nous avons l’intention d’utiliser les privilèges root. READ_EXTERNAL_STORAGE sera nécessaire à l’avenir pour que votre application puisse lire les fichiers sur la carte SD.

    En supposant que vous ayez téléchargé le fichier et que tous ces périphériques puissent être rootés (nombre limité de clients, pas sur Play, etc.), vous pouvez le faire:

     Ssortingng filePath = Environment.getExternalStorageDirectory().toSsortingng() + "/your_app_directory/your_app_filename.apk"; Process installProcess = null; int installResult = -1337; try { installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath); } catch (IOException e) { // Handle IOException the way you like. } if (installProcess != null) { try { installResult = installProcess.waitFor(); } catch(InterruptedException e) { // Handle InterruptedException the way you like. } if (installResult == 0) { // Success! } else { // Failure. :-/ } } else { // Failure 2. :-( } 

    Cela pourrait être une méthode très boiteuse, mais pour certaines entresockets, si cela vous semble applicable, cela pourrait être très facile à mettre en œuvre.

    • Créez un écran de mot de passe (passwordActivity) qui demande un mot de passe pour accéder à l’application.
    • Une fois le mot de passe entré, déclenchez un indicateur (définissez une valeur booléenne de false à true en utilisant sharedpreferences)
    • Placez le fichier .apk sur Google Store.
    • Modifiez le mot de passe une fois que tout le monde a installé l’application et publié une nouvelle mise à jour sur Google Play Store.

    Comme le logiciel va mettre en cache la valeur du drapeau, l’écran du mot de passe ne s’affichera pas même si le mot de passe est modifié. Il ne s’affichera que pour les nouvelles installations, il peut donc être nécessaire de répéter le processus.

    Remarque: cette méthode pourrait mieux s’adapter si l’application ne contient pas des centaines d’utilisateurs. Et n’oubliez pas que cette méthode n’est pas sécurisée. En résumé, si vous cherchez un moyen de garder l’application privée et que vous n’ayez aucun problème de sécurité, c’est ce que je recommande.

    Mise à jour de l’application Assurez-vous d’avoir déjà téléchargé votre nouvel apk sur place

     void installNewVersion(Ssortingng location) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }