2011-08-30 178 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)'方法的解釋嗎? –