2010-11-29 11 views
50

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 ex. en utilisant un fichier apk. Comment puis-je activer une fonctionnalité de mise à jour automatique dans cette application?Mise à jour automatique pour les applications Android (privées)

Je vois différentes options possibles (je ne sais pas si ce sont techniquement difficile, voire impossible à mettre en œuvre ou s'il y a des fonctionnalités existantes qui peuvent être réutilisés):

  • Sur chaque lancer les tests d'applications si une nouvelle version existe (en demandant un serveur), si c'est le cas, télécharge la nouvelle apk et se remplace par la nouvelle version.
  • Utilisez (ou développez?) Une application ou un service distinct qui effectue le processus de mise à jour-vérification et de remplacement.
  • Utilisez (ou développez?) Une application du marché privé dotée d'une option de mise à jour automatique. Cette option est similaire à la seconde, mais plus générique: l'application de 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 la première option puisque la fonctionnalité de mise à jour automatique est incluse dans l'application, ce qui nécessite moins d'efforts de développement.

+1

'et se remplace par la nouvelle version' Cela va exiger des privilèges root. Comme probablement toute solution pour cela. Je crois au firmware android par défaut, l'utilisateur est obligé d'interagir pour installer une application. Il n'y a aucun moyen de se moquer de cela sans root ou un firmware personnalisé. – Falmarri

+0

Bien sûr, l'interaction de l'utilisateur pour approuver la mise à jour va être nécessaire - c'est pour tout sur le marché aussi. Si vous voulez vraiment les contraindre, l'ancienne version pourrait refuser de fonctionner après avoir détecté qu'une nouvelle version est disponible. –

+14

Google devrait fournir la fonctionnalité de mise à jour automatique d'une application à partir d'un fichier APK hébergé en privé, de sorte que tout le monde n'a pas besoin de réinventer la roue avec des programmes de mise à jour personnalisés. – Jim

Répondre

6

Je pense que la première option est la moindre quantité de travail pour vous, et en fait la plus propre car elle passera par le canal approprié d'utiliser le programme d'installation intégré d'Android qui inclut la notification de l'utilisateur et l'option annuler l'installation si vous le souhaitez.

Vous avez déjà tout indiqué - vérifiez une nouvelle version sur un serveur (ce serait bien de donner à l'utilisateur la possibilité de l'éteindre), et s'il y a une nouvelle version, vous pouvez simplement lier au URL avec l'APK (qui sera, IIRC, utiliser le gestionnaire de téléchargement du navigateur pour le télécharger), ou vous pouvez le télécharger avec votre application et ensuite pointez l'intention de votre fichier local. L'utilisation du lien HTTP est techniquement moins de travail et plus propre - plus vous laissez le système d'exploitation faire, le mieux - à moins qu'il n'y ait une raison de ne pas le faire.

+0

Merci pour votre réponse. Je vais essayer l'option un: L'application télécharge un fichier apk et commence le processus d'installation. Comme mentionné dans les autres commentaires, une interaction de l'utilisateur est nécessaire pour confirmer la mise à jour. Cette question http: // stackoverflow.com/questions/3938926/android-start-intention-to-view-apk montre comment démarrer le fichier apk téléchargé. – janjonas

18

janjonas, dans l'entreprise 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 pointée par EboMike:

enter image description here

Le contrôle principal de l'application si elle est mis à jour, par rapport à un WebService. Il reçoit la version actuelle & l'URL d'où télécharger la nouvelle version, si nécessaire. L'application principale lance alors l'application Updater, transmet l'URL et quitte.

L'Updater fait le téléchargement du nouveau programme, via HTTP, 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 la nouvelle application téléchargée, le programme de mise à jour exécute la nouvelle application et se ferme.

1

Certaines des autorisations que nous allons utiliser pour obtenir ce fait sont les suivantes:

<uses-permission android:name="android.permission.ACCESS_SUPERUSER" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

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

En supposant que vous avez téléchargé le fichier et que tous ces appareils peuvent être enracinés (nombre limité de clients, et non sur Play, etc.), vous pouvez le faire:

String filePath = Environment.getExternalStorageDirectory().toString() + "/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. :-(
} 
+0

Bonjour Nikola, j'ai suivi votre démarche mais apk n'est pas en train d'être installé. "installProcess.waitFor()" renvoie la valeur 255 et l'installation a échoué. Savez-vous la solution pour cela? –

+0

@SantoshSah: Je ne sais pas quelle est la cause, mais ce code de sortie vous dit ce que vous savez déjà - cette installation n'a pas réussi. L'appareil est-il enraciné? –

3

Activation « Installer non application de marché "est toujours nécessaire pour toute application en dehors du Google Play. Si ce n'est pas activé, le processus d'installation va le demander et rediriger l'utilisateur vers les paramètres de l'application, et après cela, l'utilisateur peut installer l'application.

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

0

Voici peut-être une méthode très boiteuse, mais pour certaines entreprises, si vous croyez que c'est applicable, cela peut ê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 saisi, déclenchez un indicateur (définissez une valeur booléenne de false à true à l'aide de préférences partagées)
  • Placez le fichier .apk sur Google Store.
  • Modifiez le mot de passe une fois que tout le monde a installé l'application et publiez une nouvelle mise à jour sur Google Play Store.

Depuis le logiciel va mettre en cache la valeur de l'indicateur, l'écran de mot de passe apparaissent même gagné le `t le mot de passe est le changement. Il ne s'affichera que pour les nouvelles installations et devra peut-être répéter le processus.

Remarque: Cette méthode peut être mieux adaptée si des centaines d'utilisateurs n'utilisent pas l'application. Et n'oubliez pas que cette méthode n'est pas non plus sécurisée. Pour résumer, si vous cherchez un moyen de garder l'application privée et ne pas avoir de problèmes de sécurité, c'est ce que je recommande.

0

Mise à jour l'application Assurez-vous que vous avez déjà votre nouveau apk téléchargement sur place

void installNewVersion(String 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); 

} 
Questions connexes