2011-08-30 132 views
26

我是新来的人,我搜索了一些问题来帮助我,但我没有明确的答案。Android锁定应用程序

我需要制作一个应用程序来阻止手机上的其他应用程序。 我在市场上见过几个,但我想做一个。 有什么方法可以知道用户何时试图打开应用程序并提出活动? (把密码)。

我试过用FileObserver,但只适用于文件和目录(显然)。 我可以让一个侦听器在启动之前捕获其他应用程序的Intent吗?

我对我的英语表示歉意,感谢您的帮助!

+0

每秒检查一次的服务会在几个小时内耗尽您的电池。制作启动器/家庭应用程序不是更好吗? – Erdal

+0

你是对的!但这不是我想要的。感谢您的回答! – ngbl

回答

38

不,你不知道何时启动另一个应用程序而没有某种破解。 这是因为应用程序启动不播放。

你可以做的是创建一个服务运行在固定的时间间隔,比如1000毫秒,它检查什么是非系统应用程序。杀死该应用程序,并从服务弹出密码输入框。如果密码是正确的重新推出该应用程序

下面是一些代码示例

timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      List<RunningAppProcessInfo> appProcesses= activityManager.getRunningAppProcesses(); 
     for (RunningAppProcessInfo appProcess : appProcesses) { 
      try { 
      if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
      if (!lastFrontAppPkg.equals((String) appProcess.pkgList[0])) { 
      apkInfo = ApkInfo.getInfoFromPackageName(appProcess.pkgList[0], mContext); 
       if (apkInfo == null || (apkInfo.getP().applicationInfo.flags && ApplicationInfo.FLAG_SYSTEM) == 1) { 
        // System app            continue; 
         } else if (((apkInfo.getP().versionName == null)) || (apkInfo.getP().requestedPermissions == null)) { 
        //Application that comes preloaded with the device 
         continue; 
        } else { 
        lastFrontAppPkg = (String) appProcess.pkgList[0]; 
        } 
    //kill the app 
    //Here do the pupop with password to launch the lastFrontAppPkg if the pass is correct 
         } 
         } 
        } 
       } catch (Exception e) { 
        //e.printStackTrace(); 
       } 
       }       
      } 
      }, 0, 1000); 

这里是ApkInfo.getInfoFromPackageName()

/** 
* Get the ApkInfo class of the packageName requested 
* 
* @param pkgName 
*   packageName 
* @return ApkInfo class of the apk requested or null if package name 
*   doesn't exist 
* @see ApkInfo 
*/ 
public static ApkInfo getInfoFromPackageName(String pkgName, 
     Context mContext) { 
    ApkInfo newInfo = new ApkInfo(); 
    try { 
     PackageInfo p = mContext.getPackageManager().getPackageInfo(
       pkgName, PackageManager.GET_PERMISSIONS); 

     newInfo.appname = p.applicationInfo.loadLabel(
       mContext.getPackageManager()).toString(); 
     newInfo.pname = p.packageName; 
     newInfo.versionName = p.versionName; 
     newInfo.versionCode = p.versionCode; 
     newInfo.icon = p.applicationInfo.loadIcon(mContext 
       .getPackageManager()); 
     newInfo.setP(p); 
    } catch (NameNotFoundException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return newInfo; 
} 
+0

谢谢,我会试试这个,我会让你知道.. – ngbl

+0

谢谢Weakwire!这真的很有用! 我需要一些工作来做我想做的事情,但总体思路是! 谢谢! – ngbl

+0

不客气。 – weakwire

9

有办法做到这一点。你可以知道应用程序何时启动。 您可以使用packagemanager类获取有关任何已安装和正在使用的应用程序的所有信息。并使用下面的代码就知道whwn该应用程序启动

  @Override 
    public void run() { Log.i("test","detector run"); 
     try { 
      Process process; 
      process = Runtime.getRuntime().exec(ClearLogCatCommand); 
      process = Runtime.getRuntime().exec(LogCatCommand); 
      br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      String line; 
      // Check if it matches the pattern 
      while(((line=br.readLine()) != null) && !this.isInterrupted()){ 

       Log.d("Detector", "RUN"+line); 

       // Ignore launchers 
       if (line.contains("cat=[" + Intent.CATEGORY_HOME + "]")) continue; 

       Matcher m = ActivityNamePattern.matcher(line); 
       if (!m.find()) continue; 
       if (m.groupCount()<2){ 
        // Log.d("Detector", "Unknown problem while matching logcat output. Might be SDK version?"); 
        continue; 
       } 

       if (mListener!=null) mListener.onActivityStarting(m.group(1), m.group(2)); 

       Log.i("Detector", "Found activity launching: " + m.group(1) + "/ " + m.group(2)); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

它工作....检测所有其他应用程序? – Vikky

+3

是......是检测设备上其他应用程序的唯一方法 –

+0

我试图使用此代码,但有一些我做错了。请你可以提供更多的代码来使用它。谢谢。截图:http://oi57.tinypic.com/28b8gmd.jpg –

4

您现在可以使用AccessibilityService,使您可以找出哪些活动是在顶部。

在AccessibilityService类:

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { 
     ComponentName componentName = new ComponentName(
       event.getPackageName().toString(), 
       event.getClassName().toString() 
     ); 

     ActivityInfo activityInfo = tryGetActivity(componentName); 
     boolean isActivity = activityInfo != null; 
     if (isActivity) { 
      Log.i("CurrentActivity", componentName.flattenToShortString()); 
     } 
    } 
} 

您必须在您的手机设置,可以转到设置>无障碍>服务>您的应用程序来完成转向辅助功能上。您还需要在Manifest中添加一些权限。大量的信息可以在Android开发者网站上找到:http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

希望这有助于!

+0

感谢您的好主意。你能说更多关于'tryGetActivity(componentName)'方法的解释吗? –