了解以前是否安装了特定的Android应用

pat*_*uza 4 android

我有一个应用程序,它为您提供了各种应用程序的列表,您可以从Play商店下载和安装以获得好吃的东西.现在,我不希望用户卸载以前安装的应用程序并通过我的应用程序再次下载并获得好吃.

有没有办法找出以前是否在用户的设备上安装了特定的应用程序?

更新 我对安装/卸载的所有应用程序感兴趣,无论我的应用程序何时安装.我不想存储任何关于我的任何应用程序安装的数据,我想知道这些数据是否已经存储在某个地方的设备上以供进一步参考.

注意 我也对我们卸载的应用程序感兴趣.我也可以获得这些数据吗?

Sou*_*ion 5

我可以看到你想去的地方,但我认为你需要重新考虑一下这个方法.您应始终允许用户根据需要进行安装和卸载.但您可以检查应用程序以查看应用程序首次安装的时间.

PackageInfo info = pm.getPackageInfo(packageName, 0);
long firstInstallTime = info.firstInstallTime;
Run Code Online (Sandbox Code Playgroud)

这将存储应用程序首次安装的firstInstallTime 时间.此时间戳不会随任何数量的后续卸载和重新安装而更改.

PackageInfo类提供一堆其他有用的信息有关的设备上的应用程序,是非常值得去了解.

您可以将此与上次修改应用程序源目录时的时间戳(换句话说,最近安装应用程序时)进行比较,您可以通过以下方式获取:

ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
long mostRecentInstallTime = new File(appInfo.sourceDir).lastModified();
Run Code Online (Sandbox Code Playgroud)

我还使用这种方法为用户提供1周的应用程序完整功能试用版,然后再恢复到较小的"免费模式",并且他们无法通过卸载和重新安装来解决问题.


附加:
回复您的评论...
您不仅限于为自己的应用程序或应用程序之后安装的应用程序获取PackageInfo.您可以获取设备上当前所有应用程序的PackageInfo,无论它们何时安装在"设备生命周期"中.
此发现的代码稍加修改版本在这里会给你设备上的所有应用程序的firstInstallTime:

// Get PackageInfo for each app on the device
List<PackageInfo> packageInfoInstalledPackages = getPackageManager().getInstalledPackages(0);

// Now iterate through to get the info you need.
long[] firstInstallTimes = long[packageInfoInstalledPackages.size()];
for(int i=0;i<packageInfoInstalledPackages.size();i++) {
    PackageInfo p = packageInfoInstalledPackages.get(i);
    if (p.versionName != null) {
        firstInstallTimes[i] = p.firstInstallTime;
    }        
}
Run Code Online (Sandbox Code Playgroud)

您也可以获得所需的ApplicationInfo一切.

  • 这个答案是错误的,如果应用程序被卸载并重新安装,firstInstallTime 将被重置。 (2认同)
  • @SoundConception 快速测试将表明这不起作用。卸载并重新安装应用程序并重置 firstInstallTime。 (2认同)

小智 0

此代码段将记录您设备上安装的应用程序的所有主要活动,您只需检查给定应用程序的列表

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List <ResolveInfo> pkgAppsList = getPackageManager().queryIntentActivities( mainIntent, 0);

for(ResolveInfo resolve : pkgAppsList)
{
    Log.d("MY_APP", resolve.toString());
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!