在安卓系统中监听应用程序安装/升级的广播消息

13
使用Lookout应用程序(https://play.google.com/store/apps/details?id=com.lookout),我发现每次安装或升级应用程序时,它会自动扫描此应用程序以确保它不是恶意软件。
按照Lookout的指示,我编写了一个简单的应用程序,监听每个应用程序安装或升级时的广播消息。据我所知,有一些类型的IntentFilter用于广播消息,它们是:
- Intent.ACTION_PACKAGE_ADDED - Intent.ACTION_PACKAGE_CHANGED - Intent.ACTION_PACKAGE_INSTALL
我希望Intent.ACTION_PACKAGE_ADDED是正确答案,但实际上它是错误的(ACTION_PACKAGE_ADDED:设备上已安装新的应用程序包。数据包含软件包的名称。请注意,新安装的软件包不会接收此广播)。而Intent.ACTION_PACKAGE_INSTALL已被弃用。
有人能告诉我更好的方法吗?欢迎任何帮助。

为什么ACTION_PACKAGE_ADDED是错误的? - zapl
1
因为“请注意,新安装的软件包不会接收此广播”。 - anticafe
1
如果你只是安装了它,那么你自己不会收到消息。我猜这不是你想要的。 - zapl
1
zapi是正确的 - 您不能使用ACTION_PACKAGE_ADDED来了解您自己的应用程序是否已安装。 - CommonsWare
据我所知,在安装时很难获得广播。但是我有一些技巧,也许这可以帮助您。如果您设置一些其他的广播接收器,例如电池状态、电话状态、Wi-Fi状态更改等,这些接收器可以频繁地调用应用程序,因此有可能至少获得其中一个广播接收器,以便您可以在那个时间工作。 - Dharmendra
我真诚地希望新安装的应用程序永远不会收到ACTION_PACKAGE_ADDED广播,因为它可以在安装时启动应用程序。想象一下这可能被恶意软件利用的方式。 - Nar Gar
5个回答

14

如果您安装了应用程序A,则设备上的所有其他应用程序都将收到Intent,表示新安装的应用程序是A,但A本身似乎没有用处。现在,如果稍后安装或更改其他应用程序,则A将接收广播。

如果您想查找自己的应用程序安装时间或某些其他应用程序的最后安装或更新时间,您可以始终使用PackageManager

PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo("app.package.name", 0);
String appFile = appInfo.sourceDir; 
long installed = new File(appFile).lastModified();

这里的app.package.name是您想要查找其安装时间的应用程序的包名称。如果要将其用于您的应用程序,请传递您的应用程序的包名称。


如果您有任何关于想要实现什么的具体问题,请发帖。 - Akhil
2
从 Lookout 我看到,他们也有一个 FileSystemMonitorService 来跟踪新安装的应用程序。也许与您答案中的类似。 实际上,在 Android 中,我认为没有广播消息来跟踪新安装的应用程序。但使用您的方法是可能的。 - anticafe

8
您可以尝试使用这个接收器和权限。(但这似乎只适用于/system/app)^^
<receiver
    android:name="com.your.receiver"
    android:enabled="true"
    android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                    <data android:scheme="package"/> 
                </intent-filter>
 </receiver>
 <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />

1
发送此意图明确是为了系统而设计的。但接收它并不是。 - Mahdi-Malv
1
BROADCAST_PACKAGE_REMOVED 权限仅授予系统应用程序。 - omzer

2

0
你需要有两个应用程序,其中一个监控另一个应用程序的安装和升级。

0

受@Akhil启发,我有了更好的想法

 val pm = packageManager
 val pkgInfo = pm.getPackageInfo(packageName, 0)
 VLog.e("vvv", "firstInstallTime=${pkgInfo.firstInstallTime}")
 VLog.e("vvv", "lastUpdateTime=${pkgInfo.lastUpdateTime}")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接