在ConnectivityManager中有一个@hide的setMobileDataEnabled()方法,不过我是在源码中开发,应该不需要用到反射。
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(false);
报空指针异常,有高手做过这方面吗?不知能否指点一二,不胜感激。

解决方案 »

  1.   

    public class DataEnabledController extends BroadcastReceiver implements CompoundButton.OnCheckedChangeListener {
        private static final String TAG = "StatusBar.DataEnabledController";    private Context mContext;
        private CompoundButton mCheckBox;
    private boolean mAirplaneMode;
        private boolean mDataEnabled;
    ConnectivityManager cm;

        public DataEnabledController(Context context, CompoundButton checkbox) {
            mContext = context;
    cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
            mDataEnabled = getDataEnabled();
    mAirplaneMode = getAirplaneMode();

            mCheckBox = checkbox;
    checkbox.setEnabled(!mAirplaneMode);
    setCheckBoxVisible(!mAirplaneMode);
            checkbox.setChecked(mDataEnabled);
            checkbox.setOnCheckedChangeListener(this);

    IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
            context.registerReceiver(this, filter);
        }    public void onCheckedChanged(CompoundButton view, boolean checked) {
    if (checked != mDataEnabled && !mAirplaneMode) {
                setDataEnabled(checked);
            }
        } private void setCheckBoxVisible(boolean isVisible){
    int visible = View.VISIBLE;
    visible = isVisible?View.VISIBLE:View.INVISIBLE; 
    mCheckBox.setVisibility(visible);
    }

    public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
                final boolean enabled = intent.getBooleanExtra("state", false);
                if (enabled != mAirplaneMode) {
                    mAirplaneMode = enabled;
                    mCheckBox.setEnabled(!mAirplaneMode);
    setCheckBoxVisible(!mAirplaneMode);
                }
            }
        } private boolean getAirplaneMode() {
            ContentResolver cr = mContext.getContentResolver();
            return 0 != Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0);
        }

        private boolean getDataEnabled() {
            if(cm == null){
    cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

            return cm.getMobileDataEnabled();
        }
        
    private void setDataEnabled(final boolean dataEnabled) {
            mDataEnabled = dataEnabled;
            AsyncTask.execute(new Runnable() {
                    public void run() {
    if(cm == null){
    cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    }
                        cm.setMobileDataEnabled(mCheckBox.isChecked());
                    }
                });
        }
    }
      

  2.   

    在修改frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\tablet\SettingsView.java   及相应的资源文件~