Получение пакетов для установки и удаления
Я пытаюсь обнаружить, когда установлено новое приложение, но только если мое приложение запущено. Мне удалось обнаружить установку приложения, сделав 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);