2010-07-20 80 views
77

我试图开发一个应用程序,可以防止用户无需密码即可获取指定的应用程序。该方案是...Android,当其他应用程序启动时检测到

  1. 用户点击“电子邮件”应用程序(例如)
  2. 我的应用程序检测到启动应用
  3. 我的应用程序确认这是“电子邮件”应用
  4. 我应用打开过顶视图,要求
  5. 用户输入密码,如果正确的话,我的应用程序消失了密码,留下了“电子邮件”应用程序之上

我很好做它的休息,绝对第2部分让我感到困惑,并且经过多天阅读广播内容等并尝试在我的试验项目中听“android.intent.action.MAIN”等,我似乎无法检测到除我以外的应用程序时开始。

任何人都可以帮忙吗?我是否以正确的方式去寻找新的应用程序来广播开始的意图,或者我应该阅读系统日志中的新意图,还是使用本地代码进行操作?

任何指针都会有所帮助,即使你无法完全回答它,我仍然可以做更多的研究。非常感谢。 Ian

+0

@lan如何ü解决您的问题u能请分享你的知识 – nida 2015-01-16 05:11:34

+0

喜有,你得到了解决? – ask4solutions 2016-02-24 06:26:09

+0

我不知道他们是怎么做到的,但像[应用程序保护](http://www.androlib.com/android.application.com-carrotapp-protectdemo12-nFzA.aspx)的应用程序究竟是干什么的你”重新征求意见,所以这确实在技术上是可行的。 – hanspeide 2010-07-20 19:23:22

回答

30

我想我们可以使用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(); 
    } 

而且不要忘了加上它在清单文件的权限。

+0

,我们必须把这个代码放在哪里?在服务?在onStartCommand()? – 2012-05-30 01:22:58

+0

@haythemsouissi你可以在一个线程中运行它。 – 2012-06-03 05:46:35

+0

您好任何一个可以回答这个问题:http://stackoverflow.com/questions/10874904/detect-when-user-lunch-a-new-application-in-android-device/10875633#10875633 它关系到这个主题 – 2012-06-06 11:22:42

9

主要问题是您试图在启动器(主屏幕)通常使用显式意图时侦听隐式意图。

隐含的意图是当你想说“有人播放这个视频”,Android挑选一个可以处理该意图的应用程序。

当您单击主屏幕上的“电子邮件”图标时,会出现一个明确的意图。它特别告诉Android以完全限定的名称(即com.android.mail或其他)打开该特定应用程序。

AFAIK拦截这种明确的意图是没有办法的。这是Android内置的安全措施,任何两个活动都不能具有相同的完全限定的软件包名称。这可以防止第三方克隆应用程序并伪装成该应用程序。如果你想做什么是可能的,你理论上可以安装一个应用程序,可以阻止你的竞争对手的所有应用程序运行。

你试图做的事违背Android安全模型。

你可以做的一件事就是与特定的应用程序开发者合作,将意图转发给你的安全系统,但这可能不是你想要处理的事情。

2

也许你需要一个服务,它会不断在后台运行。比你的服务做你所说的话。听android.intent.action.MAIN也与类别android.intent.category.LAUNCHER。然后让广播接收机重写onReceive方法,并检查应用程序的名称等。

+2

这听起来像只是我正在考虑的方法,但我正在努力接收MAIN(猫。LAUNCHER)广播与一个基本的BroadcastReceiver。 有没有人设法做到这一点? 在这个阶段,我只是想检测应用程序已启动或恢复。然后,我可以将包名称与一个包含我正在查找的名称的字符串进行比较。 – Ian 2010-07-21 13:47:47

10

我想并希望这是不可能的。考虑这些功能如何轻易被恶意软件滥用。您可以收听针对您的意图以及广播的意图,但应用程序启动不应该是广播事件。您可以做的是replace the launcher。如果用户同意。

+2

+ +1解决真正的问题。 – Nate 2010-07-20 14:46:34

+1

为什么它不可能?这是我的设备,我决定在它上面运行。与我们经常授予的其他权限相比,这是多大的问题?替换启动器不会启动所有应用程序,只有那些由其直接启动的应用程序。对这个和类似的线索有很多评论,声称只能看到意图会是一个巨大的问题,但没有人解释问题是什么,为什么它应该被视为如此讨厌以至于现有的权限系统不能用于向用户说明发生了什么。 – 2014-12-01 19:42:20

+0

作为未来的权限去,这是一个乏味。拥有安全模型的关键是启用大多数合法用例,同时防止大多数(理想情况下所有)攻击。不仅仅是你(需要知识渊博的用户)需要受到保护,还需要天真的用户安装应用程序,以及应用程序编写人员不必再考虑另一个攻击媒介。所有的安全性都是权衡的:在这种情况下,公用事业和权力与大规模的可利用性之间。 你可以自由地克隆Android软件开发包,如果你真的想要的自由度为自己的编写自己的系统。 – 2015-01-04 19:44:30

15

噱头的方式来做到这一点是有一个定时循环,检查

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); 

您可以通过该列表运行来看看什么是在手机上运行的服务。 现在你可以找出他们的ID和processName,因此对于标准活动,这是为方便自定义的好,除非你阻止他们所有的努力歧视......

注:这个心不是什么的其实是一个列表在屏幕上,只是一个什么是运行...有点也许抵消你的目标,但至少你会知道什么时候开始运行......它将保持在该列表中,即使在后台虽然。

对于密码的事情,你可以开始你的活动,当你发现一个应用程序 多数民众赞成在受保护或任何。

+0

是否可以获取应用程序启动/恢复的时间? – 0LLiena 2014-07-17 20:44:39

+3

不会在android L上运行,虽然很好的答案。 – JacksOnF1re 2014-12-09 11:17:52

+2

在Android L中使用'android.app.usage'包代替。请https://developer.android.com/reference/android/app/usage/package-summary.html – 2015-09-06 13:37:32

10
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应用。

运行CheckRunningActivityThreadApplication启动(或在设备启动时)。

new CheckRunningActivity().start(); 

更新: 这个类需要android.permission.GET_TASKS权限,这样在下一行添加到清单:

<uses-permission android:name="android.permission.GET_TASKS" /> 
+0

我使用这种方法,但这会打开你的“//在PACKAGE_NAME顶部显示你的活动。ACTIVITY_NAME“一次又一次,因为循环。任何解决方法吗? – 2014-07-18 09:08:06

+0

停止CheckRunningActivity线程,当你得到所需的结果 – 2014-07-18 09:14:00

+0

感谢您的答复,然后如何/当这个线程重新启动?我正在使用一个粘滞服务 – 2014-07-18 09:17:27

5

getRunningTasks()在Android的L.已经过时

为了获得应用使用情况统计你可以使用UsageStats类从android.app.usage包。

新的应用程序使用情况统计信息API允许应用程序开发人员收集与应用程序使用情况相关的统计信息。此API提供比弃用的getRecentTasks()方法更详细的使用信息。

要使用此API,您必须首先在清单中声明android.permission.PACKAGE_USAGE_STATS权限。用户还必须通过Settings > Security > Apps with usage access启用此应用的访问权限。

Here是展示如何使用应用程序的使用统计API,让用户收集有关应用程序的使用统计数据的基本应用的例子。

+0

使用统计信息如何帮助您了解哪个应用处于前台? – Ajay 2015-10-16 11:01:41

+0

@Ajay是这样的:https://gist.github.com/plateaukao/011fa857d1919f2bbfdc – Boy 2016-03-16 13:20:09

相关问题