web-dev-qa-db-fra.com

android mettre à jour par programme apk et voir le résultat de l'installation

J'écris un programme de mise à jour pour mon application. Après m'être assuré d'avoir mon apk sur l'appareil, voici ce que je fais depuis l'application que je tente de mettre à jour:

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
File f = new File(apkLocation);    
promptInstall.setDataAndType(Uri.fromFile(f), "application/vnd.Android.package-archive");
_context.startActivity(promptInstall);

Ceci lance mon programme d’installation qui affiche les autorisations de l’application et je peux cliquer sur "Installer". Mais à partir de là, l'application se ferme tout simplement, je ne reçois aucun message (je m'attendais à ce que la boîte de dialogue m'indique que l'installation a abouti, me permettant d'appuyer sur "Fermer" ou "Ouvrir"). Il va simplement à l'écran principal de l'appareil sans préavis.

Sur une note de côté, l'application est en effet mise à jour lorsque je l'ouvre manuellement à nouveau. Comment faire en sorte que l’installateur aille comme prévu? Y at-il quelque chose à définir sur l'intention?

En écrivant cela, je me demande si la raison en est que l'application actuelle est simplement écrasée sur l'appareil, le fermant ainsi et, dans la mesure où, n'obtenant pas le résultat de l'intention, car sa source a été supprimée?

16
Florin Bombeanu

Tout ce que vous pouvez faire est d’enregistrer un destinataire avec les filtres d’intention tels que Android.intent.action.PACKAGE_INSTALL ou Android.intent.action.PACKAGE_REPLACED à partir duquel vous pouvez redémarrer votre application.

<receiver Android:enabled="true" Android:exported="true" Android:label="BootService" Android:name="com.project.services.BootService">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <data Android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_ADDED"/>
            <data Android:scheme="package"/>
        </intent-filter>
        <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_INSTALL"/>
            <data Android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_CHANGED"/>
            <data Android:scheme="package"/>
        </intent-filter>
         <intent-filter>
            <action Android:name="Android.intent.action.PACKAGE_REPLACED"/>
            <data Android:scheme="package"/>
        </intent-filter>
    </receiver>
</application>

Et 

public class BootService extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(context,Controller.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(serviceIntent);
    } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
        Intent serviceIntent = new Intent();
        serviceIntent.setClass(context, Controller.class);
        serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(serviceIntent);
    }
  }
}
15
Bishwash

Pour réussir la mise à jour, vous devez lancer l'intention avec l'URI en indiquant à votre application de mise à jour une nouvelle tâche. 

 final Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK));
 "application/vnd.Android.package-archive");
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);

Mon post ci-dessous:

Problème de mise à jour d'application Android

2
dawid gdanski

Tout d'abord, vous ne pouvez pas installer sans invite, à moins d'être rooté ou d'avoir des privilèges système. Je ne pense pas que vous demandiez cela, mais l'un de vos paragraphes n'est pas clair.

Deuxièmement, si vous installez une version de mise à jour d'une application en cours d'exécution, le comportement que vous observez est attendu: l'application est fermée de force et mise à jour. Vous ne pouvez pas mettre à jour sur place. Vous pouvez détecter le moment où l'installation a été abandonnée, car l'activité d'appel du programme d'installation sera reprise. 

Afin de mettre à jour une application en cours d'exécution ET de la maintenir en cours d'exécution, vous aurez besoin d'un processus séparé (application) pour surveiller l'installation et redémarrer votre application.

1
323go