Paramètre «Applications protégées» sur les téléphones Huawei et comment le gérer

134

J'ai un Huawei P8 avec Android 5.0 que j'utilise pour tester une application. L'application doit s'exécuter en arrière-plan, car elle suit les régions BLE.

J'ai découvert que Huawei a intégré une «fonctionnalité» appelée Applications protégées, accessible à partir des paramètres du téléphone (Gestionnaire de batterie> Applications protégées). Cela permet aux applications élues de continuer à fonctionner après l'extinction de l'écran.

Sensiblement pour Huawei, mais malheureusement pour moi, il semble que ce soit opt-in, c'est-à-dire que les applications sont désactivées par défaut et que vous devez les mettre manuellement. Ce n'est pas un showstopper, comme je peux le conseiller aux utilisateurs dans une FAQ ou imprimée documentation sur le correctif, mais j'ai récemment installé Tinder (à des fins de recherche!), et j'ai remarqué qu'il était automatiquement mis dans la liste protégée.

Quelqu'un sait-il comment je peux faire cela pour mon application? Est-ce un paramètre dans le manifeste? Est-ce quelque chose que Huawei a activé pour Tinder parce que c'est une application populaire?

jaseelder
la source
@agamov, non, je n'ai pas pu trouver plus d'informations à ce sujet. Je viens de mettre une ligne dans la description sur le Play Store à propos de l'activation des applications protégées.
jaseelder
@TejasPatel, non j'ai arrêté d'essayer de le résoudre et j'ai juste informé les utilisateurs dans la description
jaseelder

Réponses:

34
if("huawei".equalsIgnoreCase(android.os.Build.MANUFACTURER) && !sp.getBoolean("protected",false)) {
        AlertDialog.Builder builder  = new AlertDialog.Builder(this);
        builder.setTitle(R.string.huawei_headline).setMessage(R.string.huawei_text)
                .setPositiveButton(R.string.go_to_protected, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Intent intent = new Intent();
                        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"));
                        startActivity(intent);
                        sp.edit().putBoolean("protected",true).commit();
                    }
                }).create().show();
    }
Eran Katsav
la source
Jusqu'à ce qu'il y ait un moyen de savoir si l'application a été protégée ou non, c'est la meilleure chose à faire, mais pour éviter de l'afficher à chaque fois, j'ai un "Ne plus afficher" et le message est "Vous pourriez être facturé plus si vous ne protégez pas "et les actions sont" ignorer, je vais le risquer "ou" aller aux paramètres "
Saik Caskey
1
il y a quelque chose de similaire pour ASUS Auto-start Manager?
Xan
3
Oui, @Xan. Créez simplement le nom du composant comme suit:ComponentName("com.asus.mobilemanager","com.asus.mobilemanager.autostart.AutoStartActivity"));
Michel Fortes
2
pourriez-vous expliquer d'où vient l'objet "sp" s'il vous plaît? comme utilisé ici? sp.edit().putBoolean("protected",true).commit();puisque je comprends que c'est là que vous changez la valeur en droit protégé?
Leonardo G.
2
@LeonardoG. : bien sûr que "sp" signifie SharedPreferences, final SharedPreferences sp = getSharedPreferences ("ProtectedApps", Context.MODE_PRIVATE);
papesky
76

Il n'y a pas de paramètre dans le manifeste et Huawei a activé Tinder car c'est une application populaire. Il n'y a aucun moyen de savoir si les applications sont protégées.

Quoi qu'il en soit je ifHuaweiAlert()en onCreate()montrer un AlertDialog:

private void ifHuaweiAlert() {
    final SharedPreferences settings = getSharedPreferences("ProtectedApps", MODE_PRIVATE);
    final String saveIfSkip = "skipProtectedAppsMessage";
    boolean skipMessage = settings.getBoolean(saveIfSkip, false);
    if (!skipMessage) {
        final SharedPreferences.Editor editor = settings.edit();
        Intent intent = new Intent();
        intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity");
        if (isCallable(intent)) {
            final AppCompatCheckBox dontShowAgain = new AppCompatCheckBox(this);
            dontShowAgain.setText("Do not show again");
            dontShowAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    editor.putBoolean(saveIfSkip, isChecked);
                    editor.apply();
                }
            });

            new AlertDialog.Builder(this)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setTitle("Huawei Protected Apps")
                    .setMessage(String.format("%s requires to be enabled in 'Protected Apps' to function properly.%n", getString(R.string.app_name)))
                    .setView(dontShowAgain)
                    .setPositiveButton("Protected Apps", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            huaweiProtectedApps();
                        }
                    })
                    .setNegativeButton(android.R.string.cancel, null)
                    .show();
        } else {
            editor.putBoolean(saveIfSkip, true);
            editor.apply();
        }
    }
}

private boolean isCallable(Intent intent) {
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

private void huaweiProtectedApps() {
    try {
        String cmd = "am start -n com.huawei.systemmanager/.optimize.process.ProtectActivity";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            cmd += " --user " + getUserSerial();
        }
        Runtime.getRuntime().exec(cmd);
    } catch (IOException ignored) {
    }
}

private String getUserSerial() {
    //noinspection ResourceType
    Object userManager = getSystemService("user");
    if (null == userManager) return "";

    try {
        Method myUserHandleMethod = android.os.Process.class.getMethod("myUserHandle", (Class<?>[]) null);
        Object myUserHandle = myUserHandleMethod.invoke(android.os.Process.class, (Object[]) null);
        Method getSerialNumberForUser = userManager.getClass().getMethod("getSerialNumberForUser", myUserHandle.getClass());
        Long userSerial = (Long) getSerialNumberForUser.invoke(userManager, myUserHandle);
        if (userSerial != null) {
            return String.valueOf(userSerial);
        } else {
            return "";
        }
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) {
    }
    return "";
}
Aiuspaktyn
la source
7
comment avez-vous trouvé le nom de classe "com.huawei.systemmanager.optimize.process.ProtectActivity"? Je voudrais implémenter quelque chose de similaire pour le mode Stamina sur Sony, mais je ne connais pas le nom du package de Stamina et le nom de classe de l'écran "sauf les applications" dans les paramètres de Stamina.
David Riha
2
Si le nom du package et le nom de la classe sont connus, vous pouvez facilement ouvrir l'écran, avec une intention. Code ci-dessous. Intent intent = new Intent (); intent.setComponent (nouveau ComponentName ("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")); startActivity (intention);
kinsell
1
David, votre meilleur pari est le logCat. Accédez simplement à la page des paramètres et gardez le logCat ouvert.
Skynet
1
Puis-je définir une intensité énergétique pour mon application?
sonnv1368
4
Nom du package correct pour Huawei P20: com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity
rsicarelli
36

+1 pour Pierre pour sa grande solution qui fonctionne pour plusieurs fabricants d'appareils (Huawei, asus, oppo ...).

Je voulais utiliser son code dans mon application Android qui est en Java. J'ai inspiré mon code des réponses de Pierre et Aiuspaktyn .

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.support.v7.widget.AppCompatCheckBox;
import android.widget.CompoundButton;
import java.util.List;

public class Utils {

public static void startPowerSaverIntent(Context context) {
    SharedPreferences settings = context.getSharedPreferences("ProtectedApps", Context.MODE_PRIVATE);
    boolean skipMessage = settings.getBoolean("skipProtectedAppCheck", false);
    if (!skipMessage) {
        final SharedPreferences.Editor editor = settings.edit();
        boolean foundCorrectIntent = false;
        for (Intent intent : Constants.POWERMANAGER_INTENTS) {
            if (isCallable(context, intent)) {
                foundCorrectIntent = true;
                final AppCompatCheckBox dontShowAgain = new AppCompatCheckBox(context);
                dontShowAgain.setText("Do not show again");
                dontShowAgain.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        editor.putBoolean("skipProtectedAppCheck", isChecked);
                        editor.apply();
                    }
                });

                new AlertDialog.Builder(context)
                        .setTitle(Build.MANUFACTURER + " Protected Apps")
                        .setMessage(String.format("%s requires to be enabled in 'Protected Apps' to function properly.%n", context.getString(R.string.app_name)))
                        .setView(dontShowAgain)
                        .setPositiveButton("Go to settings", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                context.startActivity(intent);
                            }
                        })
                        .setNegativeButton(android.R.string.cancel, null)
                        .show();
                break;
            }
        }
        if (!foundCorrectIntent) {
            editor.putBoolean("skipProtectedAppCheck", true);
            editor.apply();
        }
    }
}

private static boolean isCallable(Context context, Intent intent) {
    try {
        if (intent == null || context == null) {
            return false;
        } else {
            List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);
            return list.size() > 0;
        }
    } catch (Exception ignored) {
        return false;
    }
}
}

}

import android.content.ComponentName;
import android.content.Intent;
import java.util.Arrays;
import java.util.List;

public class Constants {
//updated the POWERMANAGER_INTENTS 26/06/2019
static final List<Intent> POWERMANAGER_INTENTS = Arrays.asList(
        new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
        new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
        new Intent().setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
        new Intent().setComponent(new ComponentName("com.huawei.systemmanager", Build.VERSION.SDK_INT >= Build.VERSION_CODES.P? "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity": "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerUsageModelActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerSaverModeActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.oppoguardelf", "com.coloros.powermanager.fuelgaue.PowerConsumptionActivity")),
        new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? new Intent().setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")).setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:"+ MyApplication.getContext().getPackageName())) : null,
        new Intent().setComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
        new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
        new Intent().setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
        new Intent().setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
        new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.entry.FunctionActivity")),
        new Intent().setComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.autostart.AutoStartActivity")),
        new Intent().setComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity"))
                .setData(android.net.Uri.parse("mobilemanager://function/entry/AutoStart")),
        new Intent().setComponent(new ComponentName("com.meizu.safe", "com.meizu.safe.security.SHOW_APPSEC")).addCategory(Intent.CATEGORY_DEFAULT).putExtra("packageName", BuildConfig.APPLICATION_ID)
);
}

Ajoutez les autorisations suivantes dans votre Android.Manifest

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE"/>
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT"/>

  • Je rencontre encore quelques problèmes avec les appareils OPPO

J'espère que ça aidera quelqu'un.

OussaMah
la source
3
fonctionne bien. Maintenant, Huawei semble ne plus utiliser le paramètre PretectedApp. Il semble qu'il utilise une option appelée "Lancer - Gérer les lancements d'applications et l'exécution en arrière-plan pour économiser l'énergie" où vous devez autoriser les applications à être "lancement automatique", "lancement secondaire" et "Exécuter en arrière-plan". Une idée de quelle est cette intention?
Ton
Je suis heureux que cela ait fonctionné pour vous :). Désolé, je n'ai aucune idée de la nouvelle fonctionnalité Huawei que vous avez mentionnée. je devrais faire une recherche à ce sujet, sinon mes applications auraient un problème.
OussaMah
5
@Ton utilisez ceci: com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity
Simon
2
Remplacez Asus par ComponentName ("com.asus.mobilemanager", "com.asus.mobilemanager.autostart.AutoStartActivity")
Cristian Cardoso
3
Changez les téléphones Huawei au-dessus de EMUI +5: new Intent (). SetComponent (new ComponentName ("com.huawei.systemmanager", Build.VERSION.SDK_INT> = Build.VERSION_CODES.P? "Com.huawei.systemmanager.startupmgr.ui. StartupNormalAppListActivity ":" com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity ")),
Alex Cuadrón
14

Solution pour tous les appareils (Xamarin.Android)

Usage:

MainActivity =>
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    MyUtils.StartPowerSaverIntent(this);
}

public class MyUtils
{
    private const string SKIP_INTENT_CHECK = "skipAppListMessage";

    private static List<Intent> POWERMANAGER_INTENTS = new List<Intent>()
    {
        new Intent().SetComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
        new Intent().SetComponent(new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
        new Intent().SetComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
        new Intent().SetComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
        new Intent().SetComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
        new Intent().SetComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
        new Intent().SetComponent(new ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
        new Intent().SetComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
        new Intent().SetComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
        new Intent().SetComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
        new Intent().SetComponent(new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),
        new Intent().SetComponent(new ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),
        new Intent().SetComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.autostart.AutoStartActivity")),
        new Intent().SetComponent(new ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.entry.FunctionActivity")).SetData(Android.Net.Uri.Parse("mobilemanager://function/entry/AutoStart")),
        new Intent().SetComponent(new ComponentName("com.dewav.dwappmanager", "com.dewav.dwappmanager.memory.SmartClearupWhiteList"))
    };

    public static void StartPowerSaverIntent(Context context)
    {
        ISharedPreferences settings = context.GetSharedPreferences("ProtectedApps", FileCreationMode.Private);
        bool skipMessage = settings.GetBoolean(SKIP_INTENT_CHECK, false);
        if (!skipMessage)
        {
            bool HasIntent = false;
            ISharedPreferencesEditor editor = settings.Edit();
            foreach (Intent intent in POWERMANAGER_INTENTS)
            {
                if (context.PackageManager.ResolveActivity(intent, PackageInfoFlags.MatchDefaultOnly) != null)
                {
                    var dontShowAgain = new Android.Support.V7.Widget.AppCompatCheckBox(context);
                    dontShowAgain.Text = "Do not show again";
                    dontShowAgain.CheckedChange += (object sender, CompoundButton.CheckedChangeEventArgs e) =>
                    {
                        editor.PutBoolean(SKIP_INTENT_CHECK, e.IsChecked);
                        editor.Apply();
                    };

                    new AlertDialog.Builder(context)
                    .SetIcon(Android.Resource.Drawable.IcDialogAlert)
                    .SetTitle(string.Format("Add {0} to list", context.GetString(Resource.String.app_name)))
                    .SetMessage(string.Format("{0} requires to be enabled/added in the list to function properly.\n", context.GetString(Resource.String.app_name)))
                    .SetView(dontShowAgain)
                    .SetPositiveButton("Go to settings", (o, d) => context.StartActivity(intent))
                    .SetNegativeButton(Android.Resource.String.Cancel, (o, d) => { })
                    .Show();

                    HasIntent = true;

                    break;
                }
            }

            if (!HasIntent)
            {
                editor.PutBoolean(SKIP_INTENT_CHECK, true);
                editor.Apply();
            }
        }
    }
}

Ajoutez les autorisations suivantes dans votre Android.Manifest

<uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE"/>
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT"/>

Pour vous aider à trouver l'activité de l'appareil non répertoriée ici, utilisez simplement la méthode suivante pour vous aider à trouver l'activité correcte à ouvrir pour l'utilisateur

C #

public static void LogDeviceBrandActivities(Context context)
{
    var Brand = Android.OS.Build.Brand?.ToLower()?.Trim() ?? "";
    var Manufacturer = Android.OS.Build.Manufacturer?.ToLower()?.Trim() ?? "";

    var apps = context.PackageManager.GetInstalledPackages(PackageInfoFlags.Activities);

    foreach (PackageInfo pi in apps.OrderBy(n => n.PackageName))
    {
        if (pi.PackageName.ToLower().Contains(Brand) || pi.PackageName.ToLower().Contains(Manufacturer))
        {
            var print = false;
            var activityInfo = "";

            if (pi.Activities != null)
            {
                foreach (var activity in pi.Activities.OrderBy(n => n.Name))
                {
                    if (activity.Name.ToLower().Contains(Brand) || activity.Name.ToLower().Contains(Manufacturer))
                    {
                        activityInfo += "  Activity: " + activity.Name + (string.IsNullOrEmpty(activity.Permission) ? "" : " - Permission: " + activity.Permission) + "\n";
                        print = true;
                    }
                }
            }

            if (print)
            {
                Android.Util.Log.Error("brand.activities", "PackageName: " + pi.PackageName);
                Android.Util.Log.Warn("brand.activities", activityInfo);
            }
        }
    }
}

Java

public static void logDeviceBrandActivities(Context context) {
    String brand = Build.BRAND.toLowerCase();
    String manufacturer = Build.MANUFACTURER.toLowerCase();

    List<PackageInfo> apps = context.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);

    Collections.sort(apps, (a, b) -> a.packageName.compareTo(b.packageName));
    for (PackageInfo pi : apps) {
        if (pi.packageName.toLowerCase().contains(brand) || pi.packageName.toLowerCase().contains(manufacturer)) {
            boolean print = false;
            StringBuilder activityInfo = new StringBuilder();

            if (pi.activities != null && pi.activities.length > 0) {
                List<ActivityInfo> activities = Arrays.asList(pi.activities);

                Collections.sort(activities, (a, b) -> a.name.compareTo(b.name));
                for (ActivityInfo ai : activities) {
                    if (ai.name.toLowerCase().contains(brand) || ai.name.toLowerCase().contains(manufacturer)) {
                        activityInfo.append("  Activity: ").append(ai.name)
                                .append(ai.permission == null || ai.permission.length() == 0 ? "" : " - Permission: " + ai.permission)
                                .append("\n");
                        print = true;
                    }
                }
            }

            if (print) {
                Log.e("brand.activities", "PackageName: " + pi.packageName);
                Log.w("brand.activities", activityInfo.toString());
            }
        }
    }
}

Exécuter au démarrage et rechercher dans le fichier journal, ajouter un filtre logcat sur TAGdebrand.activities

MainActivity =>
protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    MyUtils.LogDeviceBrandActivities(this);
}

Exemple de sortie:

E/brand.activities: PackageName: com.samsung.android.lool
W/brand.activities: ...
W/brand.activities:   Activity: com.samsung.android.sm.ui.battery.AppSleepSettingActivity
W/brand.activities:   Activity: com.samsung.android.sm.ui.battery.BatteryActivity <-- This is the one...
W/brand.activities:   Activity: com.samsung.android.sm.ui.battery.BatteryActivityForCard
W/brand.activities: ...

Le nom du composant sera donc:

new ComponentName("<PackageName>", "<Activity>")
new ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")

Si l'activité est associée à une autorisation, l'entrée suivante dans le Android.Manifestest requise pour ouvrir l'activité:

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

Commentez ou modifiez le nouveau composant dans cette réponse. Toute aide me sera très appréciée.

Pierre
la source
comment avez-vous trouvé le nom de classe "com.huawei.systemmanager.optimize.process.ProtectActivity"? Je voudrais implémenter quelque chose de similaire pour Qmobile mais je ne connais pas le nom du package de Qmobile et le nom de classe de l'écran "sauf les applications"
Noaman Akram
1
Vous pouvez modifier votre réponse sur Qmobile .. new Intent (). SetComponent (new ComponentName ("com.dewav.dwappmanager", "com.dewav.dwappmanager.memory.SmartClearupWhiteList")),
Noaman Akram
J'ai utilisé ce code mais il ne fonctionne pas dans Samsung J6 mobile.
Shailesh
@Pierre avez-vous envisagé d'en faire une bibliothèque sur GitHub afin que d'autres projets puissent l'inclure directement? D'autres développeurs peuvent également contribuer à de nouveaux composants via des pull requests. Pensées?
Shankari
1

J'utilise la solution @Aiuspaktyn qui manque la partie de la détection de l'arrêt, afficher la boîte de dialogue après que l'utilisateur a défini l'application comme protégée. J'utilise un service pour vérifier si l'application a été interrompue ou non, en vérifiant si elle existe.

oikumo
la source
3
pouvez-vous poster un échantillon de vos pls de service.
Zaki
0

Vous pouvez utiliser cette bibliothèque pour diriger l'utilisateur vers des applications protégées ou démarrer automatiquement:

AutoStarter

Si le téléphone prend en charge la fonction de démarrage automatique, vous pouvez montrer à l'utilisateur un indice pour activer votre application dans ces applications

Vous pouvez vérifier par cette méthode:

AutoStartPermissionHelper.getInstance().isAutoStartPermissionAvailable(context)

Et pour diriger l'utilisateur vers cette page, appelez simplement ceci:

AutoStartPermissionHelper.getInstance().getAutoStartPermission(context)
Amir Hossein Ghasemi
la source
-4

PowerMaster -> AutoStart -> Trouvez votre application dans la section bloquée et autorisez

gdarcan
la source