在.NET MAUI中使用UsageStatsManager遇权限拒绝问题求助
.NET MAUI中PACKAGE_USAGE_STATS权限问题解决方法
问题核心
android.permission.PACKAGE_USAGE_STATS属于Android特殊权限,无法通过MAUI常规的Permissions.RequestAsync流程获取,必须引导用户手动在系统设置中开启权限。常规权限检查API也无法准确识别该权限的授予状态,需要直接调用Android原生API验证。
解决方案步骤
1. 替换权限检查逻辑
使用Android原生UsageStatsManager判断是否已获得权限,替代MAUI的CheckStatusAsync:
using Android.App.Usage; using Android.Content; using Android.OS; private bool HasUsageStatsPermission() { if (DeviceInfo.Platform != DevicePlatform.Android) return false; var usageStatsManager = Android.App.Application.Context.GetSystemService(Context.UsageStatsService) as UsageStatsManager; if (usageStatsManager == null) return false; var calendar = Java.Util.Calendar.Instance; calendar.Add(Java.Util.CalendarField.Year, -1); var startDate = calendar.TimeInMillis; var endDate = Java.Lang.JavaSystem.CurrentTimeMillis(); var queryUsageStats = usageStatsManager.QueryUsageStats(UsageStatsInterval.Yearly, startDate, endDate); return queryUsageStats != null && queryUsageStats.Any(); }
2. 引导用户跳转到系统设置页面
当权限未授予时,直接打开“有权查看使用情况的应用”设置页面,让用户手动开启:
private async Task<bool> CheckAndRequestUsageStatsPermission() { if (DeviceInfo.Platform != DevicePlatform.Android) return false; if (HasUsageStatsPermission()) return true; await Shell.Current.DisplayAlert("需要权限", "请在系统设置中开启应用的\"查看应用使用情况\"权限", "去设置"); // 跳转到对应的系统设置页面 var intent = new Intent(Android.Provider.Settings.ActionUsageAccessSettings); intent.AddFlags(ActivityFlags.NewTask); Android.App.Application.Context.StartActivity(intent); return false; }
3. 确认AndroidManifest配置
你的AndroidManifest.xml配置已经正确添加了权限,无需修改:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
注意事项
- 该权限仅在Android 5.0(API 21)及以上版本可用,你的
minSdkVersion=21符合要求。 - 用户跳转设置开启权限后,返回应用需要重新检查权限状态,可以在页面
Appearing事件中再次调用HasUsageStatsPermission验证。
内容的提问来源于stack exchange,提问作者piferrari
相关产品推荐
相关产品推荐

