web-dev-qa-db-fra.com

Bouton bloquer/désactiver les applications récentes

Je sais que cette question a déjà été posée ici Android Désactiver le bouton de tâche récente comme dans SureLock , mais comme la réponse ne fonctionne pas, certains peuvent peut-être partager un peu de lumière sur ce sujet oublié.

J'ai aussi essayé:

private void closeRecents() {
     activ.sendBroadcast(new Intent("com.Android.systemui.recent.action.CLOSE"));
     Intent closeRecents = new Intent("com.Android.systemui.recent.action.TOGGLE_RECENTS");
     closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
     ComponentName recents = new ComponentName(SYSTEM_UI_PACKAGE_NAME, RECENTS_ACTIVITY);
     closeRecents.setComponent(recents);
     activ.startActivity(closeRecents);
}

mais pas de chance

8
Tazz

Faire cela n'est pas du tout difficile. Je l'ai implémenté dans l'une de mes applications et cela fonctionne parfaitement.

Étape 1

Ajouter cette permission au fichier manifest.xml

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

Étape 2

Placez ce code dans n’importe quelle Activity sur laquelle vous voulez bloquer/désactiver le bouton des applications récentes

 @Override
 protected void onPause() {
        super.onPause();

        ActivityManager activityManager = (ActivityManager) getApplicationContext()
                .getSystemService(Context.ACTIVITY_SERVICE);

        activityManager.moveTaskToFront(getTaskId(), 0);
}

J'ai essayé dans plusieurs appareils et cela fonctionne parfaitement. Appuyez sur le bouton des applications récentes pour que l'écran devienne noir pendant moins d'une seconde, mais que votre activité revienne.

62
Aritra Roy
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(!hasFocus) {

        Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        sendBroadcast(closeDialog);
    }
}
0
Ishan Fernando
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    Log.d("Focus debug", "Focus changed !");

    if(!hasFocus) {
        Log.d("Focus debug", "Lost focus !");

        Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        sendBroadcast(closeDialog);
    }
}

C'est probablement mieux, mais je n'ai toujours rien trouvé de près pour désactiver le bouton!

0
Dhaval Kriplani

Vous pouvez créer une liste noire et ajouter "com.Android.systemui" dans it.then puis démarrer un service, ouvrir une boucle infinie pour vérifier le TopPackageName. ,Désolé pour mon mauvais anglais.

et le code:

public class MyService extends Service{
private HashSet<String> blackPackages = new HashSet<String>();

@Override
public void onCreate() {
    m_black_packages.add("com.Android.systemui");

    while(true){
        if(blackPackages.contains(getTopPackage(MyApplication.context)){
        //start you own activity
        }
    }
}

public String GetTopPackage(Context context) {
    int version=Android.os.Build.VERSION.SDK_INT;
    if(version>=21)
    {
        long ts = System.currentTimeMillis();
        UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService("usagestats");
        List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats(
                UsageStatsManager.INTERVAL_BEST, ts - 86400000,     
                ts);
        if (usageStats == null || usageStats.size() == 0) {
            return getTopPackageLegacy(context);
        }
        Collections.sort(usageStats, mRecentComp);
        return usageStats.get(0).getPackageName();
    }
    else
    {
        return getTopPackageLegacy(context);
    }
}

public String getTopPackageLegacy(Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    @SuppressWarnings("deprecation")
    List<RunningTaskInfo> tasks = am.getRunningTasks(1);
    if (tasks.size() == 0) {
        return null;
    }
    RunningTaskInfo task = tasks.get(0);
    ComponentName cn = task.topActivity;
    String package_name = cn.getPackageName();
    return package_name;
}

private static class RecentUseComparator implements Comparator<UsageStats> {

    @Override
    public int compare(UsageStats lhs, UsageStats rhs) {
        return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1
                : (lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1;
    }
}

}

ce n'est pas du code original, mais quelque chose comme ça.

0
floatingmuseum

Cette réponse m'a aidé . Ce n'est pas le meilleur car certaines méthodes sont maintenant obsolètes. Cela fonctionne pour moi (4.4.2) pour l'instant, mais j'aimerais aussi trouver une solution plus idéale.

    @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    if (!hasFocus) {
        windowCloseHandler.postDelayed(windowCloserRunnable, 250);
    }
}

private void toggleRecents() {
    Intent closeRecents = new Intent("com.Android.systemui.recent.action.TOGGLE_RECENTS");
    closeRecents.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    ComponentName recents = new ComponentName("com.Android.systemui", "com.Android.systemui.recent.RecentsActivity");
    closeRecents.setComponent(recents);
    this.startActivity(closeRecents);
}

private Handler windowCloseHandler = new Handler();
private Runnable windowCloserRunnable = new Runnable() {
    @Override
    public void run() {
        ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

        if (cn != null && cn.getClassName().equals("com.Android.systemui.recent.RecentsActivity")) {
            toggleRecents();
        }
    }
};

Avec cette permission:

<uses-permission Android:name="Android.permission.GET_TASKS" />
0
tallpaul

@Tazz Vous venez ne pouvez pas. Impossible.

Oui, c'est frustrant, les systèmes d'exploitation le sont parfois. Je rencontre souvent des problèmes comme celui-ci pour avoir besoin de conceptions avancées. Ici, vous frappez un mur. Le système d'exploitation ne fournit pas la fonctionnalité, il est hors de votre pouvoir de développeur. C'est annulant mais t-r-u-e, vous ne pouvez pas. Même une prime ne transformera pas SDK en Magic.

Eventuellement ET si votre application est dédiée à des périphériques internes - et non à des publications - vous pouvez modifier le code dans le SDK Android - il est opensource. Si vous avez l'intention de publier sur le Play Store, cela ne sert à rien.

0
3pic