¿Cómo prueban los desarrolladores comunes isPermissionRevokedByPolicy ()?

API Level 23 añadido isPermissionRevokedByPolicy() en PackageManager . Se supone que devuelve false si se bloquea un permiso solicitado para un determinado paquete "por directiva":

Normalmente, el propietario del dispositivo o el propietario del perfil pueden aplicar dicha política.

¿Hay algo que un desarrollador puede hacer para provocar que isPermissionRevokedByPolicy() devuelva false para alguna combinación de paquete / permiso, a falta de pasar por todo el conjunto de Android de Work de shenanigans?

Por supuesto, podría estar equivocado, pero parece que la respuesta corta es "no, no hay", por desgracia.

Un poco más de respuesta extendida: Aquí está el código de 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); } } 

Donde mPM –

 private final IPackageManager mPM; 

Se está inicializando en el constructor, que es llamado por 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; } 

( Código fuente )

Más profundo y mirando 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; } 

( Código fuente )

Todos estos pasos que estaba haciendo para encontrar la aplicación real de isPermissionRevokedByPolicy btw. Entonces tuve que encontrar quien extiende IPackageManager.Stub – es PackageManagerService ( código fuente ).

Así que aquí está la implementación real:

 @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); } } 

Potencialmente para "falsificar" el estado de un permiso particular, tendría que hackear los métodos checkPermission y getPermissionFlags. El problema, me temo, que no hay forma obvia de cómo alimentar a ApplicationPackageManager con Overriden PackageManagerService, al menos, sin reflexión.

No creo que haya una forma directa. Pero como un trabajo alrededor si el permissionstate del tiempo de ejecución del paquete llamante se puede cambiar, entonces ispermissionrevokedbypolicy () devolverá false. Pero siento que también sería una parte complicada.

  • WRITE_SETTINGS Ambigüedad del permiso
  • Android 5.1.1 y superior - getRunningAppProcesses () sólo devuelve mi paquete de aplicaciones
  • El permiso de manifiesto no funciona en Android 6
  • GetAccountsByType no devuelve nada en marshmallow
  • Android M onRequestPermissionsResult en no actividad
  • Android Marshmallow ART "No se pudo encontrar el offset nativo para dex" crash
  • Abrir archivo pdf Error: No se pudo acceder a este archivo Compruebe la ubicación o la red e inténtelo de nuevo. Melcocha de Android 6
  • ¿Cómo inhabilitar una aplicación del modo Doze?
  • Habilitar ubicaciones de Mock en Android Marshmallow
  • ActivityCompat.requestPermissions no funciona
  • ¿Error de Android 6.0? Tengo permiso pero getScanResults () todavía devuelve la lista vacía en Android 6.0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.