以编程方式避免打ze模式

问题描述 投票:0回答:1

我正在开发一个使用Xiaomi Mi Band 1S的Android应用程序,用于始终保持心率的测量。我使用一项服务来处理蓝牙连接,并且已经实现了在应用程序关闭时使该服务保持活动状态,甚至在重新启动手机后重新启动该服务。

现在,我的问题来自android休眠模式。我正在使用以下技巧使服务保持活动状态:

  • 使用唤醒锁
  • 使用wakefullBroadcastReceiver,当使用以下过滤器关闭该服务时将重新启动服务:
    • "android.intent.action.BOOT_COMPLETED"
    • "android.intent.action.QUICKBOOT_POWERON"
    • 我自己的意图是在关闭应用程序时发出的,每隔10分钟发出警报。
  • 以编程方式要求忽略电池优化。

CODE

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  Intent intent = new Intent();
  String packageName = getPackageName();
  PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
  if (powerManager != null && !powerManager.isIgnoringBatteryOptimizations(packageName)){
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + packageName));
    startActivity(intent);
  }
}

问题

我的手机是小米。 BOOT_COMPLETEDIGNORE_BATTERY_OPTIMIZATIONS均无效。仅当我手动设置权限时它们才起作用。我还向清单文件添加了所需的权限。

那么有没有一种方法可以允许这些权限,而无需用户手动设置?默认情况下,WhatsApp或Skype等应用程序具有这些权限。为什么我不能做同样的事情?

此外,这在小米手机上也正在发生。它也会在其他所有移动设备上发生吗?

android android-service android-doze android-doze-and-standby xiaomi
1个回答
2
投票

几个月前,我偶然发现了相同的问题。事实是,小米默认允许所有流行的应用程序(如WhatsApp和Skype)都被小米允许,但您的应用程序则不允许。不知道在后台进行哪种交易,但对开发人员来说似乎不公平。

现在是解决方案,这段代码将导致对小米和其他移动品牌的许可设置,这些移动品牌可以自定义ROM并根据需要进行操作-

private void specialPermission() {
    String alertMessage = "Please allow APP_NAME to always run in the background, else our services can't be accessed when you are in distress.";
    final String brand = Build.BRAND;
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    builder.setMessage(alertMessage);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            Intent intent = new Intent();
            if (brand.equalsIgnoreCase("xiaomi")) {
                intent.setComponent(new ComponentName("com.miui.securitycenter",
                        "com.miui.permcenter.autostart.AutoStartManagementActivity"));
                startActivity(intent);
            } else if (brand.equalsIgnoreCase("Letv")) {
                intent.setComponent(new ComponentName("com.letv.android.letvsafe",
                        "com.letv.android.letvsafe.AutobootManageActivity"));
                startActivity(intent);
            } else if (brand.equalsIgnoreCase("Honor")) {
                intent.setComponent(new ComponentName("com.huawei.systemmanager",
                        "com.huawei.systemmanager.optimize.process.ProtectActivity"));
                startActivity(intent);
            } else if (Build.MANUFACTURER.equalsIgnoreCase("oppo")) {
                try {
                    intent.setClassName("com.coloros.safecenter",
                            "com.coloros.safecenter.permission.startup.StartupAppListActivity");
                    startActivity(intent);
                } catch (Exception e) {
                    try {
                        intent.setClassName("com.oppo.safe",
                                "com.oppo.safe.permission.startup.StartupAppListActivity");
                        startActivity(intent);
                    } catch (Exception ex) {
                        try {
                            intent.setClassName("com.coloros.safecenter",
                                    "com.coloros.safecenter.startupapp.StartupAppListActivity");
                            startActivity(intent);
                        } catch (Exception exx) {
                            exx.printStackTrace();
                        }
                    }
                }
            } else if (Build.MANUFACTURER.contains("vivo")) {
                try {
                    intent.setComponent(new ComponentName("com.iqoo.secure",
                            "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity"));
                    startActivity(intent);
                } catch (Exception e) {
                    try {
                        intent.setComponent(new ComponentName("com.vivo.permissionmanager",
                                "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
                        startActivity(intent);
                    } catch (Exception ex) {
                        try {
                            intent.setClassName("com.iqoo.secure",
                                    "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager");
                            startActivity(intent);
                        } catch (Exception exx) {
                            ex.printStackTrace();
                        }
                    }
                }
            }
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}

您所要做的就是显示一个对话框,其中将描述您对后台服务的必要性,并打开权限设置。即使它不是完整的修复程序,例如SWIPE KILL,也将停止该服务。

© www.soinside.com 2019 - 2024. All rights reserved.