Android 可启用的移动数据/移动网络工作不工作

Android 可启用的移动数据/移动网络工作不工作,android,android-hardware,Android,Android Hardware,我想以编程方式启用移动网络/数据网络。为此,我使用下面给出的代码,但它不起作用。我没有收到任何错误。Toast弹出并说“移动网络已启用”,但实际上并未启用。请帮忙 这是完整的代码 public class MainActivity extends Activity { ConnectivityManager connectivity; NetworkInfo wifiNetworkInfo, mobileNetworkInfo; @Override protected void onCreate

我想以编程方式启用移动网络/数据网络。为此,我使用下面给出的代码,但它不起作用。我没有收到任何错误。Toast弹出并说“移动网络已启用”,但实际上并未启用。请帮忙

这是完整的代码

public class MainActivity extends Activity {
ConnectivityManager connectivity;
NetworkInfo wifiNetworkInfo, mobileNetworkInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    connectivity  = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    wifiNetworkInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    mobileNetworkInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    if (wifiNetworkInfo.isConnected())
        Toast.makeText(this, "WiFi is connected", Toast.LENGTH_LONG).show();
    else
        Toast.makeText(this, "WiFi is not connected", Toast.LENGTH_LONG).show();
    if(mobileNetworkInfo.isConnected())
        Toast.makeText(this, "MObileNetwork is connected", Toast.LENGTH_LONG).show();
    else{
        boolean enabled = false;
        try {
            setMobileDataEnabled(getBaseContext(), enabled);
            Toast.makeText(this, "MObileNetwork has been Enabled", Toast.LENGTH_LONG).show();
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

}}
private void setMobileDataEnabled(Context context, boolean enabled) throws Throwable {
       final ConnectivityManager conman = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
       final Class<?> conmanClass = Class.forName(conman.getClass().getName());
       final java.lang.reflect.Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
       iConnectivityManagerField.setAccessible(true);
       final Object iConnectivityManager = iConnectivityManagerField.get(conman);
       final Class<?> iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
       final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
       setMobileDataEnabledMethod.setAccessible(true);
       setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
    }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
公共类MainActivity扩展活动{
连接管理器连接;
NetworkInfo wifiNetworkInfo、mobileNetworkInfo;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
连接性=(ConnectivityManager)getSystemService(Context.connectivity\u服务);
wifiNetworkInfo=connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
mobileNetworkInfo=connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if(wifiNetworkInfo.isConnected())
Toast.makeText(此“WiFi已连接”,Toast.LENGTH_LONG).show();
其他的
Toast.makeText(此“WiFi未连接”,Toast.LENGTH_LONG.show();
if(mobileNetworkInfo.isConnected())
Toast.makeText(此“MObileNetwork已连接”,Toast.LENGTH_LONG.show();
否则{
布尔启用=假;
试一试{
setMobileDataEnabled(getBaseContext(),已启用);
Toast.makeText(此“MObileNetwork已启用”,Toast.LENGTH_LONG.show();
}捕获(可丢弃的e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}}
私有void setMobileDataEnabled(上下文上下文,启用布尔值)抛出可丢弃{
final ConnectivityManager conman=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
最后一个类conmanClass=Class.forName(conman.getClass().getName());
final java.lang.reflect.Field IConnectivityManager字段=conmanClass.getDeclaredField(“MSService”);
iConnectivityManagerField.setAccessible(true);
最终对象iConnectivityManager=iConnectivityManagerField.get(conman);
最终类iConnectivityManager类=Class.forName(iConnectivityManager.getClass().getName());
最终方法setMobileDataEnabledMethod=iConnectivityManagerClass.getDeclaredMethod(“setMobileDataEnabled”,Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
调用(iConnectivityManager,已启用);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.activity\u主菜单);
返回true;
}

}

在我的上一个项目中,我遇到了这个问题,我们最终不得不使用的方法,同样根据谷歌处理这个问题的方法,是在用户面前弹出设置->移动网络活动,这样他就可以显式地启用它,不仅是出于需求原因,还因为法律条款问题,因为如果你的应用程序使用3G数据,让用户在不知情的情况下花钱,你可能会遇到法律问题

问候

编辑: 调用方法setMobileDataEnabled时,SystemService中的ConnectionVityService执行其他访问控制检查

/**
 * @see ConnectivityManager#setMobileDataEnabled(boolean)
 */
public void setMobileDataEnabled(boolean enabled) {
    enforceChangePermission();
    if (DBG) log("setMobileDataEnabled(" + enabled + ")");

    mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_MOBILE_DATA,
            (enabled ? ENABLED : DISABLED), 0));
}

private void enforceChangePermission() {
    mContext.enforceCallingOrSelfPermission(
            android.Manifest.permission.CHANGE_NETWORK_STATE,
            "ConnectivityService");
}

看起来你的应用程序需要更改网络状态权限,或者你可能必须以系统或具有更高权限的用户身份运行你的应用程序。

我正在使用android 4.0的实际设备上测试它,你可以发布SetMobileDataEnabled的主体吗对不起,我的错误不是类别。setMobileDataEnabled是我的方法。好的。你能把方法的主体贴出来吗?我的回答是基于发布的内容,但如果有其他问题导致您的问题,那么查看该方法可能会有所帮助。是的@Martin关于法律条款,您是对的。但这只是出于测试目的。好吧,在这种情况下,我所做的是启用它,在手机上设置根并移除安全约束,我不知道你是否因为试图使用反射命中隐藏方法而得到安全异常,但无论如何,你都无法通过编程实现,因为手机厂商通常不允许这样做,因此你必须在根手机上实现。。。