2011-08-30 9 views
26

Jestem tutaj nowy i szukałem pytań, aby mi pomóc, ale nie mam jednoznacznych odpowiedzi.Android Lock Apps

Muszę złożyć wniosek o zablokowanie innych aplikacji w telefonie. Widziałem kilka na rynku, ale chcę je zrobić. Czy jest jakiś sposób na poznanie, kiedy użytkownik próbuje otworzyć aplikację i przenieść działanie? (aby umieścić hasło).

Próbowałem z FileObserver, ale działa tylko z plikami i katalogami (oczywiście). Czy mogę utworzyć detektor przechwytujący zamiar innych aplikacji przed rozpoczęciem?

Przepraszam za mój angielski i dziękuję za pomoc!

+0

Ta usługa, która sprawdza co sekundę, wyczerpuje baterię w ciągu kilku godzin. Czy nie byłoby lepiej zrobić aplikację uruchamiającą/home? – Erdal

+0

masz rację! Ale nie tego chcę. Dzięki za odpowiedź! – ngbl

Odpowiedz

38

Nie można dowiedzieć się, kiedy inna aplikacja zostanie uruchomiona bez jakiegoś hackowania. Wynika to z tego, że aplikacje nie są emitowane.

Co można zrobić, to utworzyć usługę działającą w stałych odstępach czasu, na przykład 1000 milisekund, która sprawdza, która aplikacja nie jest systemowa. Zabij tę aplikację, a wyskakując z usługi, uruchom okienko wprowadzania hasła. Jeśli hasło jest prawidłowe, że wznowienie że aplikacja

Oto przykładowy kod

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); 

A oto 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

dziękuję, spróbuję tego, a dam ci znać .. – ngbl

+0

Dzięki Weakwire! to jest naprawdę przydatne! Potrzebuję trochę pracy, aby zrobić to, co chcę, ale to ogólny pomysł! Dziękujemy! – ngbl

+0

Nie ma za co. – weakwire

9

istnieje sposób, aby to zrobić. możesz wiedzieć, kiedy uruchamia się aplikacja. możesz użyć klasy packagemanager, aby uzyskać wszystkie informacje o zainstalowanej i nieużywanej aplikacji. i skorzystać z poniższego kodu, aby wiedzieć whwn że aplikacja jest uruchomiona

  @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

czy działa .... wykryć wszystkie inne aplikacje ???? – Vikky

+3

tak ...... jest jedynym sposobem wykrywania innych aplikacji na urządzeniu –

+0

Próbuję użyć tego kodu, ale jest coś, co robię źle. Czy możesz podać więcej kodu, aby go użyć. dzięki. screenshot: http://oi57.tinypic.com/28b8gmd.jpg –

4

Możesz teraz użyć AccessibilityService który pozwala dowiedzieć się, który aktywny jest na górze.

W klasie 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()); 
     } 
    } 
} 

Trzeba będzie zwrócić na dostępność w ustawieniach telefonu, co można zrobić, przechodząc do Ustawienia> Dostępność> Usługi> aplikacji. W twoim Manifeście musisz też dodać kilka uprawnień. Wiele informacji można znaleźć na stronie dla programistów Androida: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

Mam nadzieję, że to pomoże!

+0

dzięki za twój dobry pomysł. czy możesz powiedzieć coś więcej na temat metody 'tryGetActivity (componentName)'? –