【问题标题】:Find out if a specific Android app was previously installed查看之前是否安装了特定的 Android 应用
【发布时间】:2014-07-14 11:37:05
【问题描述】:

我有一个应用程序,它为您提供了各种应用程序的列表,您可以从 Play 商店下载和安装这些应用程序来赚取好东西。现在,我不希望用户通过我的应用卸载以前安装的应用并重新下载并赚取好东西。

有没有办法查明用户设备上是否曾安装过特定应用?

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    我可以看到你想去哪里,但我认为你需要重新考虑一下这种方法。您应该始终允许您的用户随意安装和卸载。但是您可以检查应用程序以查看该应用程序的首次安装时间。

    PackageInfo info = pm.getPackageInfo(packageName, 0);
    long firstInstallTime = info.firstInstallTime;
    

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

    PackageInfo 类提供了许多有关设备上应用的其他有用信息,非常值得了解。

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

    ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, 0);
    long mostRecentInstallTime = new File(appInfo.sourceDir).lastModified();
    

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


    补充:
    回应您的评论...
    您不仅限于为您自己的应用程序或在您的应用程序之后安装的应用程序获取 PackageInfo。您可以获取设备上当前所有应用的 PackageInfo,无论它们是何时在“设备生命周期”中安装的。
    here 找到的代码稍作修改版本将为您提供设备上所有应用程序的 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;
        }        
    }
    

    您也可以获取ApplicationInfo,这样您就可以拥有所需的一切。

    【讨论】:

    • 我认为这只能在我的应用安装后才能完成,而且我只能跟踪那些在我的应用安装后安装/卸载的应用。现在,我想跟踪设备生命周期中的所有安装。所以基本上我对所有安装/卸载的应用程序感兴趣,不管我的应用程序是什么时候安装的。
    • 请参阅我的答案的“附加”。
    • Hmm.. 从逻辑上讲,为了让 android 能够检索 firstInstallTime,它必须在某处保留一个包名称列表和卸载后的首次安装时间。我列出的方法一直足以满足我的需求,但是如果您确实需要访问这样的列表并且没有其他选择,那就开始挖掘 android 源代码,看看它们是如何存储这些信息的。这就是开源操作系统的美妙之处。您可以查看源代码并了解它是如何工作的。祝你好运。
    • 这个答案是错误的,如果应用被卸载并重新安装,firstInstallTime被重置。
    • @SoundConception 快速测试将表明这不起作用。卸载并重新安装应用程序并重置 firstInstallTime。
    【解决方案2】:

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

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

    希望对你有帮助!

    【讨论】:

    • 首先,谢谢!现在,这给了我系统上当前安装的应用程序列表,但是有没有办法找出之前安装但在给定时刻不存在的应用程序?
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多