Cómo obtener cualquier aplicación Datos de fondo Estado de uso en Android

¿Cómo podemos obtener la configuración de uso de datos de fondo para una aplicación en android? ¿También podemos cambiar esta configuración por código?

Introduzca aquí la descripción de la imagen

Nota : El acceso root solo puede no ser suficiente

Obtención / configuración de restricción de datos de fondo requiere "android.permission.MANAGE_NETWORK_POLICY" permiso, que es nivel de protección es "firma" . Por lo tanto, su aplicación debe estar firmada con la misma clave que la plataforma.

De todos modos, siguiendo funcionó en mi final (Android 4.2.2 / API nivel 17, probado con Google Chrome):

/** NetworkPolicyManager.POLICY_NONE */ private static final int POLICY_NONE = 0x0; /** NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND */ private static final int POLICY_REJECT_METERED_BACKGROUND = 0x1; /** Context.NETWORK_POLICY_SERVICE */ private static final String NETWORK_POLICY_SERVICE = "netpolicy"; /** NetworkPolicyManager object*/ private Object mPolicyManager; // lots of code mPolicyManager = getSystemService(NETWORK_POLICY_SERVICE); // moar code private boolean getAppRestrictBackground() { try { ApplicationInfo chrome = getPackageManager().getApplicationInfo("com.android.chrome", 0); try { Method getUidPolicy = mPolicyManager.getClass().getMethod("getUidPolicy", int.class); try { final int uidPolicy = (Integer) getUidPolicy.invoke(mPolicyManager, chrome.uid); return (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } private void setAppRestrictBackground(boolean restrictBackground) { try { ApplicationInfo chrome = getPackageManager().getApplicationInfo("com.android.chrome", 0); try { Method setUidPolicy = mPolicyManager.getClass().getMethod("setUidPolicy", int.class, int.class); try { setUidPolicy.invoke(mPolicyManager, chrome.uid, restrictBackground ? POLICY_REJECT_METERED_BACKGROUND : POLICY_NONE); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Referencias:

  • DataUsageSummary.java
  • NetworkPolicyManager.java
  • Context.java

ACTUALIZAR

¿Cómo puedo firmar mi aplicación con la llave de la plataforma?

Usted tiene que tener la llave de la plataforma: no hay trucos aquí, sólo tiene que tener la clave. Consulte " Firmar su aplicación con su clave privada " para obtener más detalles. Normalmente, los OEM mantienen sus claves de plataforma con la mayor seguridad posible. Es decir, los desarrolladores de terceros nunca tendrían acceso a la clave de la plataforma. Tenga en cuenta que, incluso si se apodera de la clave de la plataforma, tendrá que crear una aplicación independiente para los dispositivos de cada OEM ya que cada OEM utiliza su propia clave única.

Al final, a menos que esté trabajando directamente con el OEM, no vale la pena el esfuerzo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.