Получение пакетов для установки и удаления

Я пытаюсь обнаружить, когда установлено новое приложение, но только если мое приложение запущено. Мне удалось обнаружить установку приложения, сделав BroadcastReceiver и активировав его в файле AndroidManifest, но это обнаружит, даже если мое приложение будет закрыто. Поэтому мне нужно вручную активировать и деактивировать широковещательный приемник. Для этого у меня есть этот код:

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);

Это должно сделать тост при установке нового приложения. Но, к сожалению, это не так. Он не входит в метод onReceive. Любая помощь приветствуется.

Ответ 1

Я попытался зарегистрировать BroadcastReceiver либо в файле манифеста, либо в коде Java. Но оба эти метода не смогли вызвать метод onReceive(). После поиска этой проблемы я нашел решение для обоих методов из другого потока в SO: Android Notification App

В файле манифеста (этот подход больше не применяется после API 26 (Android 8), он вызывал проблемы с производительностью в более ранних версиях 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>

В коде Java:

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

Это должно работать для вас.

Ответ 2

Чтобы добавить к Huang ответ выше, вот как получить имя пакета для вновь установленного приложения:

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

Ответ 3

Другие ответы указывают на прослушивание ACTION_PACKAGE_ADDED и ACTION_PACKAGE_REPLACED. Это хорошо для Android 7.1 и ниже. На Android 8. 0+ вы не можете зарегистрироваться для этих трансляций в манифесте.

Вместо этого вам необходимо getChangedPackages() вызывать getChangedPackages() в PackageManager, например, через периодическое задание JobScheduler. Это не даст вам результатов в реальном времени, но результаты в реальном времени больше не доступны в Android 8. 0+.

Ответ 4

Этот код предназначен для REMOVED_APPLICATION.

С кодом ниже, U не нужно использовать manifest.Just в вашем классе Java. Напишите этот код.

 BroadcastReceiver  uninstallApplication = new BroadcastReceiver() {

      @Override
      public void onReceive(Context context, Intent intent) {

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
          String packageName = Objects.requireNonNull(intent.getData()).getEncodedSchemeSpecificPart();

       Toast.makeText(context, "USER UNINSTALL : " + packageName, Toast.LENGTH_SHORT).show();




        }
      }
    };
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    intentFilter.addDataScheme("package");
    registerReceiver(uninstallApplication, intentFilter);