我有一个应用程序,它为您提供了各种应用程序的列表,您可以从Play商店下载和安装这些应用程序以获得好处。现在,我不希望用户通过我的应用卸载以前安装的应用再次下载并获得好吃。
有没有办法找出用户设备上是否先前安装了某个特定应用?
更新 我对安装/卸载的所有应用程序感兴趣,无论我的应用程序何时安装。我不想存储任何关于我的任何应用程序安装的数据,我想知道这些数据是否已经存储在某个地方的设备上以供进一步参考。
注意 我也对我们卸载的应用程序感兴趣。我也可以获得这些数据吗?
答案 0 :(得分:5)
我可以看到你想去的地方,但我认为你需要重新思考一下这个方法。您应始终允许用户根据需要进行安装和卸载。但您可以在应用中查看该应用首次安装的时间。
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
所以你应该拥有所需的一切。
答案 1 :(得分: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());
}
希望它有所帮助!