我们如何在android中获取应用程序的后台数据使用设置?我们也可以通过代码更改此设置吗?
问问题
2690 次
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 回答