Oczywiście, mogę się mylić, ale wygląda na to, że krótka odpowiedź brzmi "nie, nie ma", niestety.
trochę bardziej rozszerzoną odpowiedź: Oto kod z ApplicationPackageManager:
@Override
public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
try {
return mPM.isPermissionRevokedByPolicy(permName, pkgName, mContext.getUserId());
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
gdzie MPM -
private final IPackageManager mPM;
To jest zainicjowany w konstruktorze, który jest nazywany przez ContextImpl.getPackageManager() :
@Override
public PackageManager getPackageManager() {
if (mPackageManager != null) {
return mPackageManager;
}
IPackageManager pm = ActivityThread.getPackageManager();
if (pm != null) {
// Doesn't matter if we make more than one instance.
return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
}
(source code)
Idąc głębiej i patrząc ActivityThread.getPackageManager():
public static IPackageManager getPackageManager() {
if (sPackageManager != null) {
//Slog.v("PackageManager", "returning cur default = " + sPackageManager);
return sPackageManager;
}
IBinder b = ServiceManager.getService("package");
//Slog.v("PackageManager", "default service binder = " + b);
sPackageManager = IPackageManager.Stub.asInterface(b);
//Slog.v("PackageManager", "default service = " + sPackageManager);
return sPackageManager;
}
(source code)
Wszystkie te kroki robiłem znaleźć rzeczywiste wdrożenie isPermissionRevokedByPolicy btw. Potem musiałem znaleźć, kto rozszerza IPackageManager.Stub - jest to PackageManagerService (source code).
Więc tutaj jest rzeczywista realizacja:
@Override
public boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId) {
if (UserHandle.getCallingUserId() != userId) {
mContext.enforceCallingPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
"isPermissionRevokedByPolicy for user " + userId);
}
if (checkPermission(permission, packageName, userId)
== PackageManager.PERMISSION_GRANTED) {
return false;
}
final long identity = Binder.clearCallingIdentity();
try {
final int flags = getPermissionFlags(permission, packageName, userId);
return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0;
} finally {
Binder.restoreCallingIdentity(identity);
}
}
Potencjalnie do "fake" status konkretnej zgody, to że trzeba włamać checkPermission i getPermissionFlags metod. Problem, obawiam się, nie istnieje żaden oczywisty sposób, aby nakarmić ApplicationPackageManager z overriden PackageManagerService, przynajmniej bez refleksji.
Czy znalazłeś coś na ten temat? Sądzę, że jedynym sposobem na sprawdzenie może być użycie aplikacji Test DPC. To open source, ale wciąż wiele pracy po to, by przetestować jedną z metod. https://github.com/googlesamples/android-testdpc – fasteque
@fasteque: Nie, nie mam odpowiedzi, dlatego nagroda jest nadal zaległa. W pewnym momencie włączyłem test DPC do "całego zestawu Shenanigans z Android for Work". Test DPC jest zdecydowanie niedostatecznie udokumentowany, nie mam pojęcia, jak zmapować elementy z tej strony "Zarządzaj uprawnieniami aplikacji" do rzeczywistych uprawnień Androida, które mogą być objęte przez 'isPermissionRevokedByPolicy()', itp. – CommonsWare