¿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?
- Wakelock y modo doze
- DrawerLayout deja de funcionar correctamente después de la actualización a Android 6.0.1
- Proceso de ser matado en Marshmallow pero no en Lollipop
- Cambio de comportamiento de SimpleDateFormat en Android Marshmallow
- Cómo cambiar el color de los iconos de notificación de la barra de estado / tinte en android (melcocha y más de 23+)?
- Android 6.0 RuntimeException: No se puede conectar al servicio de cámara
- Android M: VoIP, JAINSIP, SipStack; Inconsistent SipProvider Excepción al crear un punto de escucha con tls habilitado
- Modo Doze y espera de aplicación
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.
- Tratar métodos obsoletos en android
- ¿Puedo detectar la presencia / ausencia de "notificación LED" en un dispositivo Android?