让我们假设用户打开“设置”应用程序,有没有办法“拦截”这个意图,从我的应用程序的服务,以检测“设置”应用程序将被打开?
例如,在SOTI MobiControl应用程序中,您可以(通过web仪表板)管理安装了应用程序(并注册到服务器)的用户的权限。如果您不允许一个用户打开Settings应用程序,当他试图打开它时,会出现一个祝酒词,上面写着“未经授权”。他们是怎么做到的?
发布于 2015-10-23 03:26:48
有没有办法“拦截”这个意图,从我的应用程序的服务,以检测“设置”应用程序将被打开?
正如前面提到的,拦截发射意图是不可能的。
例如,在SOTI MobiControl应用程序中,您可以(通过web仪表板)管理安装了应用程序(并注册到服务器)的用户的权限。如果您不允许一个用户打开Settings应用程序,当他试图打开它时,会出现一个祝酒词,上面写着“未经授权”。他们是怎么做到的?
然而,这是可能的,以确定一个应用程序是否打开和“拦截”该呼叫。截取,我的意思是在开始的应用程序的屏幕上绘制,并呈现一个登录屏幕或未经授权的屏幕。
我还没有想出一个可以运行任何安卓版本的完整样本,但从我对AppLocks的研究来看,我认为它或多或少是这样工作的:
在前Lollipop上,您可以使用它来检索正在运行的进程:
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo info : manager.getRunningAppProcesses()) {
Log.e("TAG", "Running process: " + info.processName);
if ("com.mycompany.mycoolapp".equals(info.processName)) {
// do stuff...
}
}要求:
<uses-permission android:name="android.permission.GET_TASKS"/>或者另一种选择:
for (ActivityManager.RunningTaskInfo recentTaskInfo : manager.getRunningTasks(100)) {
Log.e("TAG", "Recent tasks: " + recentTaskInfo.baseActivity.getPackageName());
}在Lollipop和更高版本上,您可以使用UsageStats来确定应用程序是否在运行:
UsageStatsManager usageStatsManager = (UsageStatsManager)getSystemService(USAGE_STATS_SERVICE);
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
long start = cal.getTimeInMillis();
long end = System.currentTimeMillis();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, start, end);
for (UsageStats stats : queryUsageStats) {
Log.e("TAG", "Usage stats for: " + stats.getPackageName());
}要求:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>我可能会使用AlarmManager来运行这两个循环任务。
我相当肯定这是获得运行应用程序列表的两种方法。如果使用统计数据的权限被拒绝给AppLock,那么它将不再使用Android6.0设备。然而,在预M设备上,它仍然有效,这表明该应用程序有一种获得正在运行的应用程序列表的替代方法(上面描述的第一个选项)。
一旦确定某个应用程序已经启动(它正在运行,上次检查时还没有运行),我们就可以“接管”屏幕。我就是这么做的:http://www.piwai.info/chatheads-basics/
当然,这只是基本的想法,我相信在实现一个可靠的解决方案时会有一些缺陷,但是这应该会给您提供一些开始。
发布于 2015-10-07 08:42:22
这样做违反了Google Play Developer Program Policy,因为它在其系统干扰部分中指出:
发布于 2015-10-22 22:55:24
让我们假设用户打开“设置”应用程序,有没有办法“拦截”这个意图,从我的应用程序的服务,以检测“设置”应用程序将被打开?
不,除非您是第一个调用startActivity()来启动应用程序的人。
https://stackoverflow.com/questions/32987302
复制相似问题