web-dev-qa-db-fra.com

Réception des événements d'installation et de désinstallation de packages

J'essaie de détecter quand une nouvelle application est installée, mais uniquement si mon application est en cours d'exécution. J'ai réussi à détecter l'installation de l'application en créant un BroadcastReceiver et en l'activant dans le fichier AndroidManifest, mais cela détectera même si mon application est fermée. C'est pourquoi je dois activer et désactiver manuellement le récepteur de diffusion. Pour ce faire, j'ai ce code:

br = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.i("Enter", "Enters here");
        Toast.makeText(context, "App Installed!!!!.", Toast.LENGTH_LONG).show();
    }
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
registerReceiver(br, intentFilter);

Cela devrait porter un toast lorsqu'une nouvelle application est installée. Mais malheureusement non. Il n'entre pas dans la méthode onReceive. Toute aide est appréciée.

51
Petre Popescu

J'ai essayé d'enregistrer le BroadcastReceiver dans le fichier manifeste ou dans le code Java code. Mais ces deux méthodes n'ont pas réussi à déclencher la méthode onReceive(). problème, j'ai trouvé une solution pour les deux méthodes à partir d'un autre thread dans SO: Android Notification App

Dans le fichier manifeste ( cette approche ne s'applique plus depuis l'API 26 (Android 8), cela causait des problèmes de performances sur les versions antérieures Android Android ):

<receiver Android:name=".YourReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.PACKAGE_INSTALL" />
        <action Android:name="Android.intent.action.PACKAGE_ADDED" />
        <data Android:scheme="package"/>
    </intent-filter>
</receiver>

Dans Java code:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
intentFilter.addDataScheme("package");
registerReceiver(br, intentFilter);

Cela devrait fonctionner pour vous.

103
Huang

Pour ajouter à la réponse de Huang ci-dessus, voici comment obtenir le nom du package de l'application nouvellement installée:

public class YourReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String packageName = intent.getData().getEncodedSchemeSpecificPart();
    }
}
25
THANN Phearum

D'autres réponses soulignent l'écoute des émissions ACTION_PACKAGE_ADDED Et ACTION_PACKAGE_REPLACED. C'est très bien pour Android 7.1 et inférieur. Sur Android 8.0+), vous ne pouvez pas vous inscrire à ces émissions dans le manifeste.

Au lieu de cela, vous devez appeler getChangedPackages() sur PackageManager périodiquement, par exemple via un travail périodique JobScheduler. Cela ne vous donnera pas de résultats en temps réel, mais les résultats en temps réel ne sont plus une option sur Android 8.0+.

23
CommonsWare