Dem*_*ian 10 android xamarin.android powermanager
我目前正在实现一项功能,要求用户忽略应用程序的电池优化.这样做的原因是,应用程序的主要功能不幸受到省电模式的严重影响.
为了实现我的目标,我通过创建Intent和设置Actionto来提示用户ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS.
虽然在发射之前Intent,我都检查isPowerSaveMode()并isIgnoringBatteryOptimizations()确保在没有启用省电模式时不提示用户; 这是该功能的要求.我这样做的方式是:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isPowerSaveMode = pm.isPowerSaveMode(); // always returns false for Huawei devices
Run Code Online (Sandbox Code Playgroud)
这适用于大多数设备,但对于华为设备,isPowerSaveMode()始终返回false.因此,由于前提条件失败,因此永远不会显示提示.
还有其他人可能遇到过这个问题吗?如果是这样,你做了什么来解决它?
需要注意的是,Xamarin.AndroidSDK中也存在同样的问题.
一些中国ROM喜欢Huawei或Xiaomi没有实现省电模式查询的标准API。但与其他系统设置一样,当用户打开/关闭省电模式时,状态标志将保存到数据库中。
所以我们可以利用这个状态标志来解决兼容性问题。当切换省电模式时,系统也会发送一个特定的意图,我们可以监听这个意图动作来监控省电模式的变化。
Huawei下面是或设备的详细 kotlin 代码实现Xiaomi。
object PowerManagerCompat {
private const val TAG = "PowerManagerCompat"
interface PowerSaveModeChangeListener {
/**
* will be called when power save mode change, new state can be query via [PowerManagerCompat.isPowerSaveMode]
*/
fun onPowerSaveModeChanged()
}
private val POWER_SAVE_MODE_VALUES = mapOf(
"HUAWEI" to 4,
"XIAOMI" to 1
)
private val POWER_SAVE_MODE_SETTING_NAMES = arrayOf(
"SmartModeStatus", // huawei setting name
"POWER_SAVE_MODE_OPEN" // xiaomi setting name
)
private val POWER_SAVE_MODE_CHANGE_ACTIONS = arrayOf(
"huawei.intent.action.POWER_MODE_CHANGED_ACTION",
"miui.intent.action.POWER_SAVE_MODE_CHANGED"
)
private const val monitorViaBroadcast = true
/**
* Monitor power save mode change, only support following devices
* * Xiaomi
* * Huawei
*/
fun monitorPowerSaveModeChange(context: Context, powerSaveModeChangeListener: PowerSaveModeChangeListener) {
if (Build.MANUFACTURER.toUpperCase(Locale.getDefault()) !in POWER_SAVE_MODE_VALUES.keys) {
Log.w(TAG, "monitorPowerSaveModeChange: doesn't know how to monitor power save mode change for ${Build.MANUFACTURER}")
}
if (monitorViaBroadcast) {
context.registerReceiver(object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
powerSaveModeChangeListener.onPowerSaveModeChanged()
}
}, IntentFilter().also {
for (a in POWER_SAVE_MODE_CHANGE_ACTIONS) {
it.addAction(a)
}
})
} else {
val contentObserver = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
powerSaveModeChangeListener.onPowerSaveModeChanged()
}
}
for (name in POWER_SAVE_MODE_SETTING_NAMES) {
context.contentResolver.registerContentObserver(
Uri.parse("content://settings/system/${name}"), false, contentObserver)
}
}
}
/**
* Check the system is currently in power save mode
* @see [PowerManager.isPowerSaveMode]
*/
fun isPowerSaveMode(context: Context): Boolean {
if (Build.MANUFACTURER.toUpperCase(Locale.getDefault()) in POWER_SAVE_MODE_VALUES.keys) {
return isPowerSaveModeCompat(context)
}
val powerManager = context.getSystemService(Context.POWER_SERVICE) as? PowerManager
return powerManager?.isPowerSaveMode ?: false
}
private fun isPowerSaveModeCompat(context: Context): Boolean {
for (name in POWER_SAVE_MODE_SETTING_NAMES) {
val mode = Settings.System.getInt(context.contentResolver, name, -1)
if (mode != -1) {
return POWER_SAVE_MODE_VALUES[Build.MANUFACTURER.toUpperCase(Locale.getDefault())] == mode
}
}
return false
}
}
Run Code Online (Sandbox Code Playgroud)
小智 1
每个 OEM 都会修改 SDK 以满足自己的需求。华为设备不使用默认的省电功能,而是使用一种称为“受保护的应用程序”的功能。受保护的应用程序是一组即使在屏幕关闭时也允许运行的应用程序。这就是它总是返回 false 的原因。最好向受保护的应用程序屏幕抛出意图,但无法知道您的应用程序是否已添加到受保护的应用程序列表中。 什么是受保护的应用程序?
| 归档时间: |
|
| 查看次数: |
1221 次 |
| 最近记录: |