gpt4 book ai didi

android - 方法为所有 Google 应用程序返回相同的包名称

转载 作者:行者123 更新时间:2023-11-29 01:04:30 25 4
gpt4 key购买 nike

我正在开发锁定应用程序,当用户打开任何应用程序时。我的应用程序将触发,如果它与我的黑名单匹配,那么我将向用户显示锁定屏幕。

到目前为止我做了什么。

public static String getTopAppName(Context context) {
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String strName = "";
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
strName = getLollipopFGAppPackageName(context);


} else {
strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName();
}}
}

private static String getLollipopFGAppPackageName(Context ctx) {

try {
UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService("usagestats");
long milliSecs = 60 * 1000;
Date date = new Date();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime());
if (queryUsageStats.size() > 0) {
Log.i("LPU", "queryUsageStats size: " + queryUsageStats.size());
}
long recentTime = 0;
String recentPkg = "";
for (int i = 0; i < queryUsageStats.size(); i++) {
UsageStats stats = queryUsageStats.get(i);

if (i == 0 && !"org.pervacio.pvadiag".equals(stats.getPackageName())) {
Log.i("LPU", "PackageName: " + stats.getPackageName() + " " + stats.getLastTimeStamp());
}
if (stats.getLastTimeStamp() > recentTime) {
recentTime = stats.getLastTimeStamp();
recentPkg = stats.getPackageName();
}
}
return recentPkg;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}

我正在关注 this SO Answer在 Lollipop 之上的设备中获得最佳运行 Activity 。我为此创建了后台服务。

我面临的问题:

1. 当用户从我的应用程序中阻止任何应用程序时,我会得到该应用程序的包名称。例如(com.google.android.talk、com.google.android.apps.maps、com.android.chrome)。

服务在后台运行时。我正在为所有谷歌应用程序( map 、视频群聊)获取顶级包名称 com.google.android.gsf。所以我很难识别特定的应用程序。

我认为问题出在 getLollipopFGAppPackageName() 中,但我不知道是什么。

2. 正如一些 SO 帖子中所述,getLollipopFGAppPackageName() 只能在调试时使用,不能用于实际实现。因此,如果我不使用它,那么在 Lollipop 以上的设备中实现这种功能(锁定应用程序)的正确方法可能是什么。

任何帮助或指导都会很棒。谢谢

最佳答案

我检查了您的代码,queryUsageStats() 方法返回的数组与 Activity 堆栈的顺序不同,此列表的第一项不是最新打开的应用程序。您必须通过 getLastTimeUsed 手动重新排序此列表。

按 rxJava 排序:

 List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, currentTime - milliSecs, currentTime);
rx.Observable.from(queryUsageStats)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.toSortedList((usageStats1, usageStats2) -> compareTo(usageStats2.getLastTimeUsed(), usageStats1.getLastTimeUsed()))
.subscribe(usageStats -> {
Toast.makeText(ctx, usageStats.get(0).getPackageName(), Toast.LENGTH_SHORT).show();

});

正常排序:

Collections.sort(queryUsageStats, (usageStats1, usageStats2)
-> compareTo(usageStats2.getLastTimeUsed(), usageStats1.getLastTimeUsed()));

Toast.makeText(ctx, queryUsageStats.get(0).getPackageName(), Toast.LENGTH_SHORT).show();

private int compareTo(long a, long b) {
return a == b ? 0 : (a > b ? 1 : -1);
}


不要忘记:

// Declare USAGE_STATS permisssion in manifest

<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />

//TODO: Check if user has already enabled Device Administrator, don't start this intent.
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);


进一步:可以锁定其他应用的应用不是 100% 可靠的,Google Play 上下载量达百万的应用锁定也不是。
通常,应用锁定的目标是当您想要与其他用户(您的女朋友、男朋友、 child ......)共享您的设备并且仍然保留您想要的某些特定应用的隐私时。
但也有一些情况可以打破应用锁:

  1. 卸载该应用:即使您的应用已启用设备管理员用户,他们可以去设备管理员,禁用你的应用程序,卸载它,或者更糟的是重新安装应用程序锁,为它设置新密码。如果你不知道如何再次卸载它,你会被吓死的:3

  2. 打开超省电模式Ultra STAMINA 模式(据我所知至少在三星和索尼设备上是这样),在此模式下只有一些最低限度的应用程序可以显示和运行(消息,电话call...), ALL app-lock 在这种情况下完全没用,共享用户可以轻松阅读您的隐私短信。

我以前写过一个应用程序锁,这些情况打破了我的梦想:),如果它可以解决您的问题,请将此答案标记为已接受。
我希望你能做出更好的锁定应用程序功能,足够可靠且性能良好。 :)

关于android - 方法为所有 Google 应用程序返回相同的包名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48315239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com