0

我想以编程方式启用移动网络/数据网络。为此,我正在使用下面给出的代码,但它不起作用。我没有收到任何错误。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;
}

}

4

2 回答 2

1

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

问候!

于 2013-07-23T20:56:12.173 回答
0

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

/**
 * @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");
}

看起来您的应用程序需要 CHANGE_NETWORK_STATE 权限,或者您可能必须以系统或具有提升权限的用户身份运行您的应用程序。

于 2013-07-23T21:00:53.937 回答