【发布时间】:2021-10-23 21:40:51
【问题描述】:
(见下面的更新)
我在 Android 上有一个使用 Xamarin.Essentials 库的 Xamarin Forms 应用程序。
应用程序需要在后台运行以获取位置数据(与手头的问题并不特别相关,但包含在上下文中),因此不得因操作系统可能尝试的任何电池优化而进入睡眠状态。
我知道用户可以从电池优化中手动选择退出特定应用,但由于它对应用的成功运行至关重要,我希望应用能够:
- 检查电池优化退出权限状态以确保其设置正确,
和/或
- 强制 Android 选择任何电池优化的应用。
我在 AndroidManifest.xml 中添加了一个条目,但似乎没有帮助,因为新安装的应用默认为电池优化。
AndroidManifest.xml
清单包含以下条目:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Xamarin.Essentials
这个库可以访问设备上的许多权限相关信息,但电池优化似乎不是其中之一。
正在使用的设备
我不知道这是否相关,但我正在三星 Galaxy S20 Ultra 上进行测试。
谁能给点建议?
2021 年 8 月 28 日更新
遵循贡献者的建议并参考https://docs.microsoft.com/en-us/xamarin/essentials/permissions?tabs=android#extending-permissions 上的文档...
在我的共享代码中
public interface IRequestIgnoreBatteryOptimizationPermission
{
Task<PermissionStatus> CheckStatusAsync();
Task<PermissionStatus> RequestAsync();
}
在我的 Android 项目中
[assembly: Xamarin.Forms.Dependency(typeof(RequestIgnoreBatteryOptimizationPermission))]
namespace MyAndroidProject
{
public class RequestIgnoreBatteryOptimizationPermission : Permissions.BasePlatformPermission, IRequestIgnoreBatteryOptimizationPermission
{
public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
{
(Android.Manifest.Permission.RequestIgnoreBatteryOptimizations, true)
}.ToArray();
}
}
关于共享应用初始化
// Ensure Required Permissions have been granted
var requestIgnoreBatteryOptimizationPermission = DependencyService.Get<IRequestIgnoreBatteryOptimizationPermission>();
var status = requestIgnoreBatteryOptimizationPermission.CheckStatusAsync().Result;
if (status != PermissionStatus.Granted)
{
status = requestIgnoreBatteryOptimizationPermission.RequestAsync().Result;
}
结果...
调用CheckStatusAsync 时,结果返回为Granted。
但应用程序设置仍然另有说明...
我在物理设备(Samsung Galaxy S20 Ultra)和 Android 模拟器(Pixel 2 API 28)上都试过了,结果都一样。
【问题讨论】:
-
你不应该得到这样的结果
status = requestIgnoreBatteryOptimizationPermission.RequestAsync().Result;等待结果,否则按照我在回答中的建议进行操作
标签: android xamarin.forms xamarin.essentials