如何在Android中获取任何应用程序后台数据的使用状态

我们如何才能得到Android的应用程序的后台数据使用设置? 我们也可以通过代码更改这个设置吗?

在这里输入图像说明

Solutions Collecting From Web of "如何在Android中获取任何应用程序后台数据的使用状态"

注意 :仅根访问可能不够

获取/设置后台数据限制需要“android.permission.MANAGE_NETWORK_POLICY”权限,即保护级别为“签名” 。 所以你的应用必须使用与平台相同的密钥进行签名。

无论如何,下面的工作结束了(Android 4.2.2 / API级别17,使用Google Chrome进行testing):

/** 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(); } } 

参考文献:

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

UPDATE

如何使用平台密钥签署我的应用程序?

你必须有平台的关键:这里没有任何窍门,你只需要有钥匙。 请参阅“ 使用您的私钥签署您的应用程序 ”了解更多详情。 通常情况下,OEM厂商保持平台密钥的安全性最高。 也就是说,第三方开发人员永远无法访问平台密钥。 请注意,即使您确实掌握了平台密钥,您也需要为每个OEM设备创build单独的应用程序,因为每个OEM使用自己的唯一密钥。

最后,除非你直接与OEM合作,否则这是不值得的。