android 原生frameworks 判断 android.permission.FOREGROUND_SERVICE
时间: 2024-01-19 21:03:47 浏览: 141
在 Android 原生 Framework 中,可以使用以下方式来判断是否具有 FOREGROUND_SERVICE 权限:
1. 在 PackageManagerService.java 中,可以找到 checkPermission() 方法,该方法用于检查应用程序是否具有指定的权限。在该方法中,可以查找 FOREGROUND_SERVICE 权限并返回相应的结果,代码如下:
```
private int checkPermission(String perm, int uid, int callingPid, int callingUid) {
// ...
if (perm.equals(Manifest.permission.FOREGROUND_SERVICE)) {
if (mAppOpsService.noteOperation(AppOpsManager.OP_RUN_FOREGROUND, uid, packageName) == AppOpsManager.MODE_ALLOWED) {
granted = PackageManager.PERMISSION_GRANTED;
}
}
// ...
return granted;
}
```
在该方法中,通过调用 AppOpsManager.noteOperation() 方法来检查应用程序是否具有 FOREGROUND_SERVICE 权限。如果应用程序具有该权限,则返回 PackageManager.PERMISSION_GRANTED;否则返回 PackageManager.PERMISSION_DENIED。
2. 在 ActivityManagerService.java 中,可以找到 checkForegroundServicePermission() 方法,该方法用于检查应用程序是否具有 FOREGROUND_SERVICE 权限以及是否可以启动前台服务。在该方法中,可以先检查应用程序是否具有 FOREGROUND_SERVICE 权限,如果有,则再检查应用程序是否可以启动前台服务,代码如下:
```
private int checkForegroundServicePermission(int uid, String packageName, int callingPid, int callingUid, int startId, boolean lastStartForeground) {
// ...
if (checkPermission(Manifest.permission.FOREGROUND_SERVICE, uid, callingPid, callingUid) != PackageManager.PERMISSION_GRANTED) {
Slog.w(TAG, "startForegroundService not allowed due to lack of FOREGROUND_SERVICE permission");
return START_NOT_STICKY;
}
final long origId = Binder.clearCallingIdentity();
boolean fgServiceAllowed = false;
try {
fgServiceAllowed = mBatteryStatsService.noteStartForeground(packageName, uid, lastStartForeground);
} catch (RemoteException e) {
Slog.w(TAG, "Failed to note battery stats for startForegroundService", e);
} finally {
Binder.restoreCallingIdentity(origId);
}
if (!fgServiceAllowed) {
Slog.w(TAG, "startForegroundService not allowed due to battery stats");
return START_NOT_STICKY;
}
// ...
return START_SUCCESS;
}
```
在该方法中,首先调用 checkPermission() 方法来检查应用程序是否具有 FOREGROUND_SERVICE 权限。如果应用程序没有该权限,则返回 START_NOT_STICKY。如果应用程序具有该权限,则调用 BatteryStatsService.noteStartForeground() 方法来检查应用程序是否可以启动前台服务。如果可以,则返回 START_SUCCESS;否则返回 START_NOT_STICKY。
阅读全文