web-dev-qa-db-fra.com

Blocage des applications Android par programmation

J'ai essayé de développer une telle application, dans le sens où je veux verrouiller toutes les applications de mon appareil avec un mot de passe comme je veux. Mais je n'ai trouvé aucun morceau de code pour la solution. J'ai donc développé un par moi-même et malheureusement, cela n'a pas réussi. J'ai trouvé de nombreuses solutions pour verrouiller les appareils Android mais je n'en ai pas trouvé pour verrouiller une application. Je serai heureux si vous suggérez une solution.

32
thampi joseph

J'ai utilisé un service d'arrière-plan pour vérifier quelle application est au premier plan (ce qui signifie que l'application est utilisée par l'utilisateur). Ensuite, je vérifie si je dois verrouiller l'application ou non.

Pour trouver la liste de toutes les applications installées (à l'exception des applications système):

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

Pour rechercher l'application de premier plan actuelle:

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

Ici, le nom de classe fournit le nom de package de l'application. Je vous suggère d'utiliser le nom du package pour identifier toute application afin que nous sachions que le nom du package est toujours unique.

Maintenant, la fonctionnalité pour verrouiller l'application:

Pour trouver quelle application s'exécute au premier plan et que vous souhaitez la verrouiller, il suffit de démarrer une autre activité qui a un EditText pour le mot de passe et un bouton OK et Annuler.

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

En cliquant sur OK, si le mot de passe est correct, alors simplement terminer l'activité LockScreen. Si le mot de passe est incorrect, utilisez simplement le code ci-dessous, ce qui ferme l'application et affiche l'écran d'accueil de l'appareil:

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

Le même code est également utilisé sur le bouton d'annulation.

51
Amit Gupta

Il semble que cela reste un mystère, comme le suggèrent les commentaires mentionnés ci-dessus. Je mets donc le code qui m'a aidé à résoudre ce problème.

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

Appelez getForegroundApp() et il renverra une chaîne qui contient le nom de currentForegroundApp, y compris le nom du package, par exemple com.example.app

Maintenant, pour utiliser ce code, nous avons besoin de cette ligne de code dans le fichier Manifest

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

et amenez l'utilisateur à Usage Data access Settings:

sageAccessSettingsPage

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

ou manuellement en recherchant dans LockScreen and Security> Other security settings> Usage access data.

Vient maintenant la partie pour bloquer l'application, cette partie est très bien couverte dans la réponse d'Amit. Cependant, si quelqu'un cherche un moyen d'empêcher l'utilisateur d'utiliser une application, une astuce consiste à ouvrir l'écran d'accueil lorsqu'une application particulière est lancée.

Cela pourrait être fait en appelant la méthode suivante lorsque currentApp est égal à une application bloquée

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;
}
10
7geeky