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

时间:2018-01-18 06:41:00

标签: android android-studio android-activity service

我正在处理锁定应用程序,当用户打开任何应用程序时。我的应用程序将触发,如果它与我的阻止列表匹配,那么我将向用户显示锁定屏幕。

到目前为止我做了什么。

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上方的设备中获得最佳运行活动。我为此创建了后台服务。

问题我面临:

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

在后台运行服务时。我为所有Google应用(地图,环聊)获得了顶级包名com.google.android.gsf。因此,识别特定应用程序很困难。

我认为问题出在getLollipopFGAppPackageName(),但我无法弄清楚是什么。

2。正如某些SO帖子中提到的那样,getLollipopFGAppPackageName()只能在调试时使用,而不能用于实际实施。因此,如果我不使用这个,那么在棒棒糖上面的设备中实现这种功能(锁定应用程序)的正确方法可能是什么。

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

1 个答案:

答案 0 :(得分:1)

我检查了你的代码, queryUsageStats()方法返回的数组与活动堆栈的顺序不同,此列表的第一项不是最新打开的应用程序。您必须通过 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上下载百万次应用锁定。
一般来说,app-lock的目标是当你想与其他用户(你的女朋友,男朋友,孩子......)分享你的设备,并且仍然保留你想要的某些特定应用程序的隐私。
但是有些情况可以打破app锁定:

  1. 卸载应用:即使您的应用已启用设备管理员 用户,他们可以去设备管理员,禁用您的应用程序,卸载 它,甚至更糟的重新安装app-lock,为它设置新密码。如果 你不知道如何再次卸载它,你将被f_cked:3

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

  3. 之前我曾经写过一个app-lock,这些案例打破了我的梦想:),请将此答案标记为已接受,如果它可以解决您的问题。
    我希望您能够提供更好的锁定应用功能,足够可靠且性能良好。 :)