Android M启动Activity电池优化

13

我正在开发一个应用程序,如果用户在附近,应该会提醒他。当然,即使手机处于空闲状态,也必须这样做。 现在使用DOZE,我明白我必须将我的应用程序列入白名单,为此我看到我可以启动一个具有请求动作的意图,感谢Buddy在此帖子中的回答。

Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName))
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
else {
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);

嗯,这应该很容易……因为谷歌不喜欢这种方法,如果你这样做,你的应用可能会被从Play商店中禁止……无话可说…… 好的,所以正确的方法是引导用户到电池设置中,并手动将你的应用添加到DOZE的白名单中……是的,这应该是一个难度较大的问题……无论如何,似乎这是唯一的方法……现在的答案是: 我可以使用一个意图跳转到电源使用概要页面,方法如下(感谢Chris):

Intent powerUsageIntent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
    ResolveInfo resolveInfo = getPackageManager().resolveActivity(powerUsageIntent, 0);
// check that the Battery app exists on this device
    if(resolveInfo != null){
        startActivity(powerUsageIntent);
    }  

但如何直接进入应用列表来选择电池优化?

感谢任何答案。


据我理解,操作 Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS 就是你所需要的。 - Grimmy
1
嗨 Grimmy,小心操作,因为我已经说了 Google 不喜欢这种方法,如果你这样做的话,你的应用将被禁止在 Play 商店中销售...请阅读以下帖子: https://dev59.com/kVwY5IYBdhLWcg3wAj09 - Ast
根据该线程,如果应用程序请求android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,则Google可能会禁止您的应用程序。但是,对于Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS操作,您不需要它,该操作将显示选择电池优化的应用程序列表。 - Grimmy
那么你的意思是,如果我在清单文件中没有请求,对于谷歌来说就可以了? - Ast
我已将其添加为答案,这样其他人就可以轻松地找到它了,然后在评论中进行讨论。 - Grimmy
显示剩余3条评论
3个回答

33

要打开应用程序列表以选择电池优化,您可以使用此代码示例:

private void openPowerSettings(Context context) {
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
    context.startActivity(intent);
}

不需要添加<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>权限,因此可以放心地发布到Google Play(有关详细信息,请查看此线程及其对该问题的评论)。

注意:

不要添加此行。

intent.setData(Uri.parse("package:" + mContext.getPackageName()));

会导致崩溃:“致命异常:android.content.ActivityNotFoundException No Activity found to handle Intent { act=android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS dat=package:io.demo.example }”。用户必须在列表中查找应用程序,似乎没有直接跳转到我们的应用程序的方法。


3
我遇到了一个错误,致命异常:android.content.ActivityNotFoundException。找不到处理意图(Intent){act=android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS dat=package:io.demo.example}的活动(Activity)。 - Ahmad Shahwaiz
1
我也遇到了同样的异常。目前有解决方案吗? - ParikshitSinghTomar
1
我们可以直接打开Android的本地弹出窗口,要求禁用电池优化,请查看下面的链接。这对我很有效。 https://dev59.com/kVwY5IYBdhLWcg3wAj09#33114136 - akashzincle
@akashzincle 已经过时且不安全的模式。 - user924

2
这是我使用的内容:
清单文件(manifest):
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import androidx.annotation.RequiresPermission
import androidx.core.content.ContextCompat

object PowerSaverHelper {
    enum class WhiteListedInBatteryOptimizations {
        WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
    }

    fun getIfAppIsWhiteListedFromBatteryOptimizations(context: Context, packageName: String = context.packageName): WhiteListedInBatteryOptimizations {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_ANDROID_API
        val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager?
                ?: return WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE
        return if (pm.isIgnoringBatteryOptimizations(packageName)) WhiteListedInBatteryOptimizations.WHITE_LISTED else WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED
    }

    //@TargetApi(VERSION_CODES.M)
    @SuppressLint("BatteryLife", "InlinedApi")
    @RequiresPermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
    fun prepareIntentForWhiteListingOfBatteryOptimization(context: Context, packageName: String = context.packageName, alsoWhenWhiteListed: Boolean = false): Intent? {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
            return null
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) == PackageManager.PERMISSION_DENIED)
            return null
        val appIsWhiteListedFromPowerSave: WhiteListedInBatteryOptimizations = getIfAppIsWhiteListedFromBatteryOptimizations(context, packageName)
        var intent: Intent? = null
        when (appIsWhiteListedFromPowerSave) {
            WhiteListedInBatteryOptimizations.WHITE_LISTED -> if (alsoWhenWhiteListed) intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
            WhiteListedInBatteryOptimizations.NOT_WHITE_LISTED -> intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).setData(Uri.parse("package:$packageName"))
            WhiteListedInBatteryOptimizations.ERROR_GETTING_STATE, WhiteListedInBatteryOptimizations.IRRELEVANT_OLD_ANDROID_API -> {
            }
        }
        return intent
    }
}

例子:

PowerSaverHelper.prepareIntentForWhiteListingOfBatteryOptimization(this)?.let { startActivity(it) }


你能把它写成Java代码吗? - Josymar De Leon
1
你可以将它复制到 Kotlin 文件中,并使用 Java 调用它。 - android developer
感谢您的解决方案,发布应用程序后是否有任何限制?https://prnt.sc/ui8u7c https://developer.android.com/training/monitoring-device-state/doze-standby.html - Bhavin Chauhan
@BhavinChauhan 请检查您发布应用的商店规则。规则可能会发生变化... - android developer

1
尝试以下代码打开“忽略电池优化设置”页面。
private void openPowerSettings() {
    startActivityForResult(new Intent(android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS), 0);
}

不需要向清单文件添加额外的权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接