Android,当其他应用程序启动时检测
我正在尝试开发一个应用程序,防止用户无需密码而到达指定的应用程序。 场景是…
- 用户点击“电子邮件”应用程序(例如)
- 我的应用检测到应用的启动
- 我的应用程序确认这是“电子邮件”应用程序
- 我的应用程序在顶部打开一个视图,要求input密码
- 用户input密码,如果正确,我的应用程序将消失,将“电子邮件”应用程序放在顶部
我可以做剩下的部分,只是第2部分令我感到困惑,而且经过多天阅读广播内容等,并试图在我的试验项目中听“android.intent.action.MAIN”等,我不能似乎检测到除我以外的应用程序启动。
谁能帮忙? 我是否以正确的方式去寻找新的应用程序,广播意图开始,还是应该阅读系统日志中的新意图,或在本地代码中做些什么?
任何指针都会有帮助,即使你不能完全回答,我也可以做更多的研究。 非常感谢。 伊恩
我想我们可以使用logcat
并分析它的输出。
在所有类似的程序中,我发现了这个权限:
android.permission.READ_LOGS
这意味着他们都使用它,但似乎程序启动,之后,我们的程序(应用程序保护)将启动并带前。
使用下面的代码:
try { Process mLogcatProc = null; BufferedReader reader = null; mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"}); reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream())); String line; final StringBuilder log = new StringBuilder(); String separator = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { log.append(line); log.append(separator); } String w = log.toString(); Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); }
并且不要忘记在Manifest文件中添加它的权限。
做一个噱头的方法是有一个定时循环的服务来检查
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
你通过列表来看看手机上运行的是什么。 现在你可以用id和processName来识别它们,所以对于标准的活动,这很容易定制的,除非你停下来很难区分…
注意:这不是一个什么是实际在屏幕上的清单,只是一个什么是正在运行的列表…也许有点取消你的目标,但至less你会知道什么时候开始运行…它将继续在那即使在后台列表虽然。
对于密码的事情,你可以开始你的活动,当你发现一个应用程序保护或任何。
class CheckRunningActivity extends Thread{ ActivityManager am = null; Context context = null; public CheckRunningActivity(Context con){ context = con; am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); } public void run(){ Looper.prepare(); while(true){ // Return a list of the tasks that are currently running, // with the most recent being first and older ones after in order. // Taken 1 inside getRunningTasks method means want to take only // top activity from stack and forgot the olders. List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1); String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName(); if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) { // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME } } Looper.loop(); } }
你可以得到当前正在运行的Activity
并检查这个Activity
对应于Email
应用程序。
在Application
启动(或在设备启动)上运行CheckRunningActivity
Thread
。
new CheckRunningActivity().start();
更新:这个类需要android.permission.GET_TASKS
权限,所以添加下一行到清单:
<uses-permission android:name="android.permission.GET_TASKS" />
主要的问题是,当启动器(主屏幕)通常使用显式意图时,您试图监听隐式意图。
一个隐含的意图是,当你想说“有人玩这个video”,Androidselect一个可以处理这个意图的应用程序。
当您单击主屏幕上的“电子邮件”图标时,会出现一个明确的意图。 它具体告诉Android通过完全限定的名称(即com.android.mail或其他)打开该特定的应用程序。
AFAIK没有办法拦截这种明确的意图。 这是Android内置的安全措施,任何两个活动都不能具有相同的完全限定的软件包名称。 这可以防止第三方克隆应用程序,并伪装成该应用程序。 如果你想做的事情是可能的,你理论上可以安装一个应用程序,可以阻止你所有的竞争对手的应用程序工作。
你所要做的是违背Android安全模式。
你可以做的一件事是与特定的应用程序开发者合作,将意图转发给你的安全系统,但这可能不是你想要处理的事情。
我想,希望这是不可能的。 考虑一下这种function如何被恶意软件滥用。 您可以听取针对您的意图以及广播的意图,但是应用程序启动不应该是广播事件。
你可以做的是取代发射器 。 如果用户同意。
getRunningTasks()
中不推荐使用getRunningTasks()
。
要获取应用程序使用统计信息,您可以使用android.app.usage包中的UsageStats类。
新的应用程序使用统计API允许应用程序开发人员收集与应用程序使用相关的统计信息。 此API提供比弃用的getRecentTasks()方法更详细的使用信息。
要使用此API,您必须首先在清单中声明android.permission.PACKAGE_USAGE_STATS
权限。 用户还必须通过Settings > Security > Apps with usage access
程序Settings > Security > Apps with usage access
启用此应用程序的Settings > Security > Apps with usage access
以下是一个基本的应用程序示例,展示了如何使用App usage statistics API让用户收集与应用程序使用相关的统计信息。
也许你需要一个服务,不断在后台运行。 比你的服务做你所说的。 听android.intent.action.MAIN与类别android.intent.category.LAUNCHER。 然后让广播接收机重写onReceive方法,并检查应用程序的名称等
- Android Webview POST
- java.lang.NullPointerException:尝试调用空对象引用的虚拟方法'int android.view.View.getImportantForAccessibility()'
- 无法打开HAX设备! HAX不工作,仿真器在仿真模式下运行
- Android更新Thread和Runnable中的TextView
- “自动激活bundle com.android.ide.eclipse.adt时发生错误”
- 如何删除Android的textview的顶部和底部空间
- BitmapFactory.decodeResource在Android 2.2中返回一个可变的位图,在Android 1.6中返回一个不可变的位图
- 2个button并排 – android布局
- 使用buildozer将Kivy与numpy库for Android打包时出错