web-dev-qa-db-fra.com

Installer Android APK sans invite

Nous écrivons une Android qui affiche des annonces sur de grands écrans. Nous avons un backend où les annonceurs peuvent sélectionner les annonces, donc elles sont mises à jour presque instantanément. Parce qu'il y aura beaucoup de Android en cours d'exécution (branchées sur des écrans HDMI), nous devrions pouvoir mettre à jour notre logiciel à distance.

C'est le cas:

L'application principale fonctionne en continu (sauf si elle est désactivée) et les utilisateurs ne voient jamais rien Android lié. Nous avons besoin d'une application de mise à jour qui écoute les mises à jour et supprime l'apk principal, installe une nouvelle apk. Pendant la mise à jour nous afficherons une activité avec "Mise à jour, veuillez patienter", jusqu'à ce que la nouvelle apk principale soit installée et affichée.

Ce dont nous avons besoin:

Nous avons besoin d'aide pour implémenter le mécanisme de mise à jour sans demander à l'utilisateur sur ROOTED DEVICE.

Ce que nous avons:

L'application de mise à jour est connectée à l'événement de démarrage reçu, où un service démarre (ce service écoutera les mises à jour, qui seront bientôt mises en œuvre par un collègue). Le service peut démarrer une activité qui demandera les informations de mise à jour lors de la mise à jour.

Dans l'activité de mise à jour

 try {
            Process proc = Runtime.getRuntime().exec(new String[]{"su", "pm install -r /mnt/sdcard/MYFOLDER/testAPK.apk"});
            stringBuilder.append(String.valueOf(proc.waitFor()));
            stringBuilder.append("\n");
        } catch (Exception e) {
            if (e instanceof IOException) {
                Log.d(TAG, "IOException");
            } else if (e instanceof InterruptedException) {
                Log.d(TAG, "InterruptedException");
            } else {
                e.printStackTrace();
            }
        }

Le StringBuilder imprime 11, mais fait de même si je donne une commande aléatoire inexistante.

Dans le manifeste

<!-- Permission to start UpdaterService on boot -->
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />

<!-- Install/delete permissions, only granted to system apps -->
<uses-permission Android:name="Android.permission.INSTALL_PACKAGES" />
<uses-permission Android:name="Android.permission.DELETE_PACKAGES" />

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

Les packages d'installation et de suppression de packages sont inutiles si je n'installe pas mon application en tant qu'application système, ai-je raison?

Pour faire court, pas d'installation de mon APK de test, et je n'ai aucune idée de comment résoudre ce problème. Toute aide serait appréciée!

22
TomCB

Vous pouvez simplement utiliser la commande adb install pour installer/mettre à jour l'APK en silence. Un exemple de code est ci-dessous

public static void InstallAPK(String filename){
    File file = new File(filename); 
    if(file.exists()){
        try {   
            String command;
            command = "adb install -r " + filename;
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
        e.printStackTrace();
        }
     }
  }

[~ # ~] ou [~ # ~]

Veuillez vérifier http://paulononaka.wordpress.com/2011/07/02/how-to-install-a-application-in-background-on-Android/

26
Palak