41

我试图开发这样一个应用程序,从某种意义上说,我想用我想要的密码锁定我设备中的所有应用程序。但是我没有找到任何解决方案的代码。所以我自己开发了一个,可惜没有成功。我找到了许多锁定 android 设备的解决方案,但没有找到锁定应用程序的解决方案。如果您提出解决方案,将很高兴。

4

2 回答 2

56

我使用后台服务来检查哪个应用程序在前台(这意味着用户正在使用该应用程序)。然后我检查是否需要锁定应用程序。

要查找所有已安装应用程序的列表(不包括系统应用程序):

PackageManager packageManager = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

List<ResolveInfo> appList = packageManager.queryIntentActivities(mainIntent, 0);
Collections.sort(appList, new ResolveInfo.DisplayNameComparator(packageManager));
List<PackageInfo> packs = packageManager.getInstalledPackages(0);
for (int i = 0; i < packs.size(); i++) {
    PackageInfo p = packs.get(i);
    ApplicationInfo a = p.applicationInfo;
    // skip system apps if they shall not be included
    if ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
        continue;
    }
    appList.add(p.packageName);
}

要查找当前的前台应用程序:

ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
activityOnTop=ar.topActivity.getClassName();

这里的类名提供了应用程序的包名。我建议您使用包名来标识任何应用程序,以便我们知道包名始终是唯一的。

现在,锁定应用程序的功能:

要找到哪个应用程序正在前台运行并想要锁定它,我们只需要启动另一个活动,该活动有一个 EditText 密码和 OK 和 Cancel 按钮。

Intent lockIntent = new Intent(mContext, LockScreen.class);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(lockIntent);

单击确定后,如果密码正确,则只需完成LockScreen 活动。如果密码不正确,则只需使用以下代码即可关闭应用程序并显示设备的主屏幕:

Intent startHomescreen = new Intent(Intent.ACTION_MAIN);
startHomescreen.addCategory(Intent.CATEGORY_HOME);
startHomescreen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(startHomescreen);

取消按钮也使用相同的代码。

于 2013-11-08T06:14:22.803 回答
13

看起来这仍然是上面提到的评论所建议的一个谜。所以我正在放置帮助我解决这个问题的代码。

获取前台应用程序

public String getForegroundApp() {
    String currentApp = "NULL";
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager usm = (UsageStatsManager) this.mContext.getSystemService(Context.USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
        if (appList != null && appList.size() > 0) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : appList) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }
        }
    } else {
        ActivityManager am = (ActivityManager) this.mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        currentApp = tasks.get(0).processName;
    }

    return currentApp;
}

调用getForegroundApp()它会返回一个字符串,其中包含 currentForegroundApp 的名称,包括包名称,例如com.example.app

Manifest现在,要使用这段代码,我们需要文件中的这行代码

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

并将用户带到Usage Data access Settings

使用访问设置页面

  public void usageAccessSettingsPage(){
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}

LockScreen and Security或通过在>>中手动查找Other security settingsUsage access data

现在是阻止应用程序的部分,这部分在 Amit 的回答中得到了很好的介绍。但是,如果有人正在寻找一种方法来限制用户使用应用程序,那么一个技巧就是在启动特定应用程序时打开主屏幕。

这可以通过在currentApp等于被阻止的应用程序时调用以下方法来完成

if(<NameOfBlockedApp>.equals currentApp){
     showHomeScreen();
   }

显示主页屏幕

 public boolean showHomeScreen(){
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(startMain);
    return true;
}
于 2016-08-31T11:46:58.897 回答