如何在Android中获取任何应用程序后台数据使用状态 [英] How to get Any Application Background data Usage Status in Android

查看:328
本文介绍了如何在Android中获取任何应用程序后台数据使用状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can we get the Background data usage setting for an application in android? Also can we changes this settings by code?

推荐答案

注意:仅凭根访问权限可能不够

Note: Root access alone may not be enough

获取/设置背景数据限制要求"android.permission.MANAGE_NETWORK_POLICY权限,保护级别为签名" .因此,您的应用必须使用与平台相同的密钥进行签名.

Getting/setting background data restriction requires "android.permission.MANAGE_NETWORK_POLICY" permission, which is protection level is "signature". So your app have to be signed with the same key as platform's.

无论如何,以下这些都可以解决我的问题(Android 4.2.2/API级别17,已通过Google Chrome浏览器测试):

Anyhow, following worked on my end (Android 4.2.2/API level 17, tested with 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();
    }
}

参考文献:

更新

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

How can I sign my application with platform key?

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

You have to have the platform key: there are no tricks here, you just need to have the key. See "Sign your application with your private key" for further details. Normally, OEMs keep their platform keys with the highest possible security. That's, third-party developers would never have access to the platform key. Note that, even if you do get hold of the platform key, you will need to create separate application for each OEM's device(s) as every OEM uses its own unique key.

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

At the end, unless you are working directly with the OEM, it is not worth the effort.

这篇关于如何在Android中获取任何应用程序后台数据使用状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆