如何停止在Android中打开默认应用程序?

时间:2018-07-12 07:34:47

标签: android android-studio locking

我正在尝试为用户创建一个Android应用,以便用户可以激活儿童保护。例如,用户打开我的应用程序,他可以查看他拥有的所有应用程序 (包括默认值)。现在,如果用户阻止默认消息或调用应用程序,则所有内容都应该相同,即使任何人多次轻按这些应用程序,也不能打开。它看起来应该什么都没有发生。我不想在该应用上使用隐私PIN码或图案。我只想通过打开用户通过我的应用程序选择的任何移动应用程序来阻止孩子。 这可能吗?如果是,那么关于如何实现此目标的任何想法?

1 个答案:

答案 0 :(得分:1)

这个问题与回答here的问题非常相似,这就是我回答这个问题的来源。我无法尝试此代码,但希望它能给您一个大致的思路,让您首次尝试并看看自己是否可以正常工作。

想法

基本思想是创建一个Background Service,以不断检查是否有打开的应用程序。如果这些应用程序在用户锁定的列表中,则显示锁定屏幕。。我不知道是否有可能关闭已打开的应用程序¹(我希望不是!),但要针对您的父母控制功能,锁定屏幕应具有相同的效果。

选择要锁定的应用。

要从系统中检索所有已安装的应用程序

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;
    /* Uncomment this to exclude system apps
    if ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
        continue;
    } */
    appList.add(p.packageName);
}

现在appListList<ResolveInfo>,您可以向用户显示ListView,让她选择要锁定的应用。将它们保存在某个地方(SharedPreferences是个主意)。

服务

服务要做的是:

检查当前打开的应用程序:

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

检查activityOnTop是否在锁定的应用列表中。

for(String appName : appList) {
    if(appName.equals(activityOnTop)) {
        // This app is locked!
        LockApp(); // Defined later
        break;
    }
}

如果是这样,请在您的Intent活动中启动LockScreen(不允许进行任何操作)

private void LockApp() {
   Intent lockIntent = new Intent(mContext, LockScreen.class);
   lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   mContext.startActivity(lockIntent);
}

我认为很多事情都是理所当然的:您必须在某个地方启动服务,必须进行一些活动,并且此过程无法避免聪明的孩子在后台关闭该过程的问题...但是我认为这可以作为起点。

¹显然是可能的。看一下this的答案,一个想法是用类似的东西替换LockApp()中的代码。 但这并没有改变,我认为锁定屏幕更优雅