以编程方式阻止android应用程序

我试图开发这样的应用程序,从某种意义上说,我想用我的密码locking设备中的所有应用程序。 但是我没有find解决scheme的任何代码。 所以我自己开发了一个,不幸的是它没有成功。 我发现lockingAndroid设备的许多解决scheme,但没有find一个用于locking应用程序。 如果你提出解决scheme,会很高兴。

Solutions Collecting From Web of "以编程方式阻止android应用程序"

我使用后台服务来检查哪个应用程序在前台,这意味着应用程序正在被用户使用。 然后我检查是否需要locking应用程序。

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

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; } apps.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(); 

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

现在function来locking应用程序

当我们find哪个应用程序在前台运行并想要locking它时,我们只需要启动另一个具有EditText(用于密码)和Ok(确定)和Cancel(取消)button的活动。

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

点击确定,如果密码是正确的,那么简单地完成 LockScreen活动。 如果密码不正确,只需使用下面提到的closures应用程序的代码,并显示设备的主屏幕:

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

取消button上也使用相同的代码。

看起来,这仍然是一个神秘的build议,上面提到的意见。所以我把代码,帮助我解决这个问题。

getForegroundApp

 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) { 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() ,它将返回一个string,其中包含currentForegroundApp的名称,包括包名,例如com.example.app

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

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

并将用户带到Usage Data access Settings

usageAccessSettingsPage

  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 settings > Usage access datafind手动。

现在来阻止应用程序的部分,这一部分是在阿米特的答案很好。 但是,如果有人正在寻找一种方法来限制用户使用应用程序,那么一个窍门就是当一个特定的应用程序启动时打开主屏幕。

当前应用程序等于被阻止的应用程序时,可以通过调用以下方法来完成此操作

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

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; }