8

我们如何在android中获取应用程序的后台数据使用设置?我们也可以通过代码更改此设置吗?

在此处输入图像描述

4

1 回答 1

7

注意:仅 Root 访问权限可能还不够

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

无论如何,以下工作对我有用(Android 4.2.2/API 级别 17,使用 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();
    }
}

参考:

更新

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

您必须拥有平台密钥:这里没有技巧,您只需要拥有密钥即可。有关详细信息,请参阅“使用您的私钥签署您的应用程序”。通常,OEM 会以尽可能高的安全性保存其平台密钥。也就是说,第三方开发人员永远无法访问平台密钥。请注意,即使您确实掌握了平台密钥,您也需要为每个 OEM 的设备创建单独的应用程序,因为每个 OEM 都使用自己的唯一密钥。

最后,除非您直接与 OEM 合作,否则不值得付出努力。

于 2013-07-29T05:02:46.760 回答