我需要以编程方式打开/关闭移动数据。下面的代码不适用于5.x.你能帮我么。提前谢谢。
private void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
connectivityManagerField.setAccessible(true);
final Object connectivityManager = connectivityManagerField.get(conman);
final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(connectivityManager, enabled); }
03-30 12:42:29.466:W / System.err(5966): java.lang.NoSuchMethodException:setMobileDataEnabled [boolean] 03-30 12:42:29.466:W / System.err(5966):at java.lang.Class.getMethod(Class.java:664)03-30 12:42:29.466: W / System.err(5966):at java.lang.Class.getDeclaredMethod(Class.java:626)
java.lang.NoSuchMethodException:setMobileDataEnabled [boolean] @ under line。
final方法setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod(" setMobileDataEnabled&#34 ;, Boolean.TYPE);
答案 0 :(得分:4)
似乎 setMobileDataEnabled 方法不再存在 ConnectivityManager 并且此功能已移至 TelephonyManager ,有两个方法getDataEnabled和setDataEnabled。
public void setMobileDataState(boolean mobileDataEnabled)
{
try
{
TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
if (null != setMobileDataEnabledMethod)
{
setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);
}
}
catch (Exception ex)
{
Log.e(TAG, "Error setting mobile data state", ex);
}
}
public boolean getMobileDataState()
{
try
{
TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled");
if (null != getMobileDataEnabledMethod)
{
boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService);
return mobileDataEnabled;
}
}
catch (Exception ex)
{
Log.e(TAG, "Error getting mobile data state", ex);
}
return false;
}
执行代码时,您会收到SecurityException,指出用户10089和当前进程都没有android.permission.MODIFY_PHONE_STATE。
应添加权限 MODIFY_PHONE_STATE 我是从Answer得到的 谢谢Muzikant
答案 1 :(得分:2)
在Android L 5.xx中,隐藏的API setMobileDataEnabled 方法已被删除,无法再使用。您可以在/frameworks/base/core/java/android/net/ConnectivityManager.java下的android lolipop源代码中验证这一点。
如果你仍然坚持要执行它,你可以使用Kushal回答的代码片段,但 getDataEnabled 是系统api,普通用户应用程序无法访问。在TelephonyManager下还有一个系统api可用 setDataEnabled 。 (/frameworks/base/telephony/java/android/telephony/TelephonyManager.java)
/** @hide */
@SystemApi
public void setDataEnabled(boolean enable) {
setDataEnabled(SubscriptionManager.getDefaultDataSubId(), enable);
}
它还需要权限" android.permission.MODIFY_PHONE_STATE"这只适用于有根设备。