Je développe une application Android non publique, c'est-à-dire qu'elle ne sera pas disponible sur le marché Android 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 potentielles (je ne sais pas si elles sont techniquement difficiles voire impossibles à mettre en œuvre ou s'il existe des fonctionnalités pouvant être réutilisées):
Je préférerais la première option, car la fonctionnalité de mise à jour automatique est incluse dans l'application, ce qui nécessite moins d'efforts de développement.
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 proposée par EboMike:
L'application principale vérifie si elle est mise à jour par rapport à 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 démarre ensuite l'application Updater en passant l'URL, puis quitte.
Le programme de mise à jour effectue le téléchargement du nouveau programme, via HTTP, en affichant à 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 que la nouvelle application est téléchargée, l'outil de mise à jour exécute la nouvelle application et quitte.
Je pense que la première option représente le moins de travail possible pour vous, et en fait la plus propre aussi, car elle passera par le canal approprié consistant à utiliser le programme d'installation du paquet intégré d'Android, qui inclut la notification de l'utilisateur et l'option permettant à l'utilisateur d'abandonner 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 désactiver cette option), et s'il y a une nouvelle version, vous pouvez simplement créer un lien vers l'URL avec l'APK. (qui, IIRC, utilisera le gestionnaire de téléchargement du navigateur pour le télécharger), ou vous pouvez le télécharger avec votre application, puis pointer l'intention sur votre fichier local. L'utilisation du lien HTTP est techniquement moins laborieuse et plus propre - plus vous laissez le système d'exploitation faire, mieux c'est - à moins qu'il n'y ait une raison pour ne pas le faire.
L'activation de "Installer une application non marchande" 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 redirigera l'utilisateur vers les paramètres de l'application, après quoi l'utilisateur pourra installer l'application.
Selon vos besoins, vous pouvez déléguer à un tiers lib.
Certaines des autorisations que nous utiliserons pour cela 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, s’explique de lui-même. Avec ACCESS_SUPERUSER, nous dirons au système que nous avons l'intention d'utiliser les privilèges root. READ_EXTERNAL_STORAGE sera nécessaire ultérieurement 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 enracinés (nombre limité de clients, pas 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. :-(
}
Cette méthode est peut-être très boiteuse, mais pour certaines entreprises, si vous croyez que cela s'applique, cela peut être très facile à mettre en œuvre.
Comme le logiciel va mettre en cache la valeur du drapeau, l’écran du mot de passe ne sera pas affiché, même si le mot de passe est modifié. Il n'apparaîtra que pour les nouvelles installations, vous devrez peut-être répéter le processus.
Remarque: Cette méthode pourrait mieux convenir s’il n’ya pas des centaines d’utilisateurs utilisant l’application. Et n'oubliez pas que cette méthode n'est pas non plus sécurisée. En résumé, si vous cherchez un moyen de garder l’application privée et que vous n’avez pas de problèmes de sécurité, voici ce que je recommande.
Mettez à jour l'application Assurez-vous que vous avez déjà votre nouveau téléchargement d'apk 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);
}