Programowe Blokowanie aplikacji na Androida

Próbowałem stworzyć taką aplikację, w tym sensie, że chcę zablokować wszystkie aplikacje w moim urządzeniu hasłem, jakie tylko chcę. Ale nie znalazłem żadnego kodu na rozwiązanie. Więc opracowałem go sam i niestety nie udało się. Znalazłem wiele rozwiązań do blokowania urządzeń z Androidem, ale nie znalazłem żadnego do blokowania aplikacji. Będzie zadowolony, jeśli zaproponujesz rozwiązanie.

Author: CÅ“ur, 2013-11-08

2 answers

Użyłem usługi w tle, aby sprawdzić, która aplikacja jest na pierwszym planie (co oznacza, że aplikacja jest używana przez użytkownika). Następnie sprawdzam, czy muszę zablokować aplikację, czy nie.

Aby znaleźć listę wszystkich zainstalowanych aplikacji (z wyłączeniem aplikacji systemowych):

PackageManager packageManager = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

List<ResolveInfo> appList = packageManager.queryIntentActivities(mainIntent, 0);
Collections.sort(appList, new ResolveInfo.DisplayNameComparator(packageManager));
List<PackageInfo> packs = packageManager.getInstalledPackages(0);
for (int i = 0; i < packs.size(); i++) {
    PackageInfo p = packs.get(i);
    ApplicationInfo a = p.applicationInfo;
    // skip system apps if they shall not be included
    if ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
        continue;
    }
    appList.add(p.packageName);
}

Aby znaleźć aktualną aplikację pierwszoplanową:

ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
activityOnTop=ar.topActivity.getClassName();

Tutaj nazwa klasy zawiera nazwę pakietu aplikacji. Sugeruję użycie nazwy pakietu do identyfikacji każda aplikacja, więc wiemy, że Nazwa pakietu jest zawsze unikalna.

Teraz funkcjonalność blokowania aplikacji:

Aby dowiedzieć się, która aplikacja jest uruchomiona na pierwszym planie i chce ją zablokować, musimy po prostu rozpocząć kolejną czynność, która ma EditText dla hasła oraz przycisk OK i Anuluj.

Intent lockIntent = new Intent(mContext, LockScreen.class);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(lockIntent);

Po kliknięciu OK, jeśli hasło jest poprawne, po prostu Zakończ działanie LockScreen. Jeśli hasło jest nieprawidłowe, po prostu użyj kodu poniżej, który zamyka aplikację i pokazuje ekran główny urządzenia:

Intent startHomescreen = new Intent(Intent.ACTION_MAIN);
startHomescreen.addCategory(Intent.CATEGORY_HOME);
startHomescreen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(startHomescreen);

Ten sam kod jest również używany na przycisku Anuluj.

 45
Author: Amit Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 19:03:44

Wygląda na to, że to nadal tajemnica, jak sugerują wyżej wspomniani comments.So umieszczam kod, który pomógł mi rozwiązać ten problem.

GetForegroundApp

public String getForegroundApp() {
    String currentApp = "NULL";
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager usm = (UsageStatsManager) this.mContext.getSystemService(Context.USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
        if (appList != null && appList.size() > 0) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : appList) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }
        }
    } else {
        ActivityManager am = (ActivityManager) this.mContext.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        currentApp = tasks.get(0).processName;
    }

    return currentApp;
}

Wywołaj getForegroundApp() i zwróci łańcuch zawierający nazwę currentForegroundApp, w tym nazwę pakietu, np. com.example.app

Teraz, aby użyć tego kodu, potrzebujemy tej linii kodu w Manifest pliku

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />

I zabrać użytkownika do Usage Data access Settings:

UsageAccessSettingsPage

  public void usageAccessSettingsPage(){
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}

Lub ręcznie, znajdując w LockScreen and Security> Other security settings> Usage access data.

Teraz przychodzi część do blokowania aplikacji, ta część jest bardzo dobrze omówiona w odpowiedzi Amita. Jeśli jednak ktoś szuka sposobu, aby ograniczyć użytkownikowi korzystanie z aplikacji, sztuczką jest otwarcie ekranu głównego po uruchomieniu konkretnej aplikacji.

Można to zrobić poprzez wywołanie następującej metody, gdy {[12] } jest równe zablokowanemu app

if(<NameOfBlockedApp>.equals currentApp){
     showHomeScreen();
   }

ShowHomeScreen

 public boolean showHomeScreen(){
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(startMain);
    return true;
}
 8
Author: 7geeky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 21:18:07