如何以编程方式在小米中为我的应用启用自动启动

Posted

技术标签:

【中文标题】如何以编程方式在小米中为我的应用启用自动启动【英文标题】:How to enable auto start for my app in Xiaomi programmatically 【发布时间】:2016-03-12 23:28:38 【问题描述】:

我的应用中有一项服务需要一直在后台运行。在所有设备上,除了小米之外,它都可以正常工作。我在某处读到我们需要在应用设置中启用自动启动以保持服务运行。

所以请告诉我如何以编程方式启用自动启动,因为用户永远不会这样做。

【问题讨论】:

你将无法从代码中做到这一点,除非小米有一些 api 可以让你访问该功能。我猜自动启动管理器是一个应用程序(具有系统应用程序的权限,因为小米修改了操作系统的一部分),因此不可能。另一方面,如果设备已植根,您实际上可以禁用自动启动管理器。 @Radix whatsapp 、 facebook 和更多应用程序如何做到这一点? 我假设他们与小米有合作关系以进入白名单。但这只是一个猜测。 在猜测部分同意@Radix,对于应用程序开发来说,这似乎很难看,来自小米。这个问题有更新吗?另外,我检查了"xiaomi devs ask us" 部分,没有响应 @ShivamNagpal :小米默认将 Facebook、Whatsapp、Messenger 等热门应用列入白名单。像我们这样的其他人必须通知用户手动启用它。 【参考方案1】:

您不能直接启用自动启动,但您可以将用户重定向到自动启动设置屏幕并要求用户为您的应用打开它。对小米、OPPO、vivo、乐视、荣耀、华硕、诺基亚、华为手机使用以下解决方案。如果存在,将启动自动启动屏幕。

    try 
            val intent = Intent()
            val manufacturer = Build.MANUFACTURER
            when 
                "xiaomi".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.miui.securitycenter",
                        "com.miui.permcenter.autostart.AutoStartManagementActivity"
                    )
                
                "oppo".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.coloros.safecenter",
                        "com.coloros.safecenter.permission.startup.StartupAppListActivity"
                    )
                
                "vivo".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.vivo.permissionmanager",
                        "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"
                    )
                
                "letv".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.letv.android.letvsafe",
                        "com.letv.android.letvsafe.AutobootManageActivity"
                    )
                
                "honor".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.huawei.systemmanager",
                        "com.huawei.systemmanager.optimize.process.ProtectActivity"
                    )
                
                "asus".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.asus.mobilemanager",
                        "com.asus.mobilemanager.powersaver.PowerSaverSettings"
                    )
                
                "nokia".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.evenwell.powersaving.g3",
                        "com.evenwell.powersaving.g3.exception.PowerSaverExceptionActivity"
                    )
                
                "huawei".equals(manufacturer, ignoreCase = true) -> 
                    intent.component = ComponentName(
                        "com.huawei.systemmanager",
                        "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"
                    )
                
            
            startActivity(intent)
         catch (e: Exception) 
            /*Timber.e(e)*/
        

Quvonchbek Y 回答了

【讨论】:

vivo的活动名称不正确。也许他们会从一个版本到另一个版本。【参考方案2】:

试试这个……它对我有用。它将打开屏幕以启用自动启动。但是,如果您尝试从那里禁用,它将关闭应用程序。我正在想办法解决这个问题。在此之前,您可以将其用作解决方案。

String manufacturer = "xiaomi";
        if(manufacturer.equalsIgnoreCase(android.os.Build.MANUFACTURER)) 
            //this will open auto start screen where user can enable permission for your app
            Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
            startActivity(intent);
        

【讨论】:

Mohit 每次询问你如何过滤只询问一次是否有任何回调方法。 @M.Yogeshwaran 回调不存在,因为我明确尝试调用活动。 我怎么能每次都只给我打电话一次是在征求许可 你也可以查看这个链接***.com/questions/41277671/…【参考方案3】:
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) 
    List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;




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

public class Constants 

public static 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.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.asus.mobilemanager", "com.asus.mobilemanager.entry.FunctionActivity")).setData(android.net.Uri.parse("mobilemanager://function/entry/AutoStart"))
);

Reference Answer

【讨论】:

【参考方案4】:

你可以试试这个:

if ("xiaomi".equalsIgnoreCase(str)) 

 intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
                     
else if ("oppo".equalsIgnoreCase(str)) 

 intent.setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity"));
                     
else if ("vivo".equalsIgnoreCase(str)) 

  intent.setComponent(new ComponentName("com.iqoo.secure", "com.iqoo.secure.MainGuideActivity."));
 

【讨论】:

我需要重定向到vivo中的自动启动管理器屏幕,“com.iqoo.secure.MainGuideActivity”它在中途停止【参考方案5】:

我偶然发现了这个库。 Autostarter。它是一个适用于不同设备制造商的自动启动器库

我上次使用它时,它支持小米和乐视设备。我真的不能给你代码示例,但我希望它可以帮助那些偶然发现这个的人

【讨论】:

【参考方案6】:

@rajkumar 是对的,但你必须小心运行纯 Android 的小米,MI A1、MI A2 和 MI A3 即将推出,所以你应该添加如下内容:

if (Build.MANUFACTURER.toLowerCase().contains("xiaomi") 
&&
!Build.MODEL.toLowerCase().contains("mi a"))
 //intent
 

【讨论】:

gist.github.com/Muyangmin/e8ec1002c930d8df3df46b306d03315d @javisilox 这可以检测设备是否有MIUI,因此可以更通用,更精确地解决您描述的问题。 (测试于:MI A2 lite、Redmi 5 plus) 像 Miui 一样的纯 Android 中是否有自动启动菜单?【参考方案7】:

您可以通过以下方式进行:

      if (manufactXiaomi.equalsIgnoreCase(android.os.Build.MANUFACTURER)) 
        if (!session.getVisibilityOfAutoStartDialog()) Intent intent = new Intent();
            intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
            startActivity(intent);

如果你想继续运行你的服务是你需要更改设备的一些设置Check This

上面的代码可能对你有用

【讨论】:

如何通过使用它每次都询问只询问一次来解决 @M.Yogeshwaran 以编程方式我们无法检查自动启动状态。 1.在您的应用程序设置屏幕中为“启用自动启动”设置一项永久设置。 2.并在您的主屏幕上显示一个带有关闭选项的对话框/卡片。最后只对有此自动启动问题的设备进行此检查。

以上是关于如何以编程方式在小米中为我的应用启用自动启动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MI 4i 安全应用程序中以编程方式为我的应用程序启用自动启动选项?

Android - 如何在小米设备中以编程方式启用自动启动选项?

如何以编程方式启用自动启动和浮动窗口权限

如何使用 sdk 在设置应用程序中启用-禁用通知?

如何以编程方式获取 MIUI Security 应用程序自动启动权限?

如何在三星设备中以编程方式启用自动启动选项?