大家好,本人刚刚接触Andorid,很多地方不懂,希望大侠多多赐教,不胜感激。现请教一个问题:手机是使用电信3G网络的,请问怎么用代码实现移动网络数据访问功能(即设置里面的选项开关"启动移动数据"的打开与关闭)。分数不多了,希望大家帮忙,非常感谢。

解决方案 »

  1.   

    请问,在执行下面语句时报错:
    // 调用setMobileDataEnabled方法
    setMobileDataEnabledMethod.invoke(iConMgr, true);报错为:Permission denial: writing to secure settings requires android.permission.WRITE_SECURE_SETTINGS
    在AndroidManifest.xml文件里添加了:<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>但是还是会报这个错误,还要添加哪些配置吗? 
      

  2.   

    基本上就是这个代码,但是好多都不行,呵呵!
    @SuppressWarnings("unchecked")
    public void openDataConnect() throws ClassNotFoundException,
    SecurityException, NoSuchMethodException, IllegalArgumentException,
    IllegalAccessException, InvocationTargetException {
    Method dataConnSwitchmethod;
        Class telephonyManagerClass;
        Object ITelephonyStub;
        Class ITelephonyClass;
        boolean isEnabled = false;
        
        TelephonyManager telephonyManager = (TelephonyManager) context.get()
                .getSystemService(Context.TELEPHONY_SERVICE);
        //获取当前的状态
        if(telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED){
            isEnabled = true;
        }else{
            isEnabled = false;  
        }   
        telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
        Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
        getITelephonyMethod.setAccessible(true);
        ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
        ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
        if (isEnabled) {
            dataConnSwitchmethod = ITelephonyClass
                    .getDeclaredMethod("disableDataConnectivity");
        } else {
            dataConnSwitchmethod = ITelephonyClass
                    .getDeclaredMethod("enableDataConnectivity");   
        }
        dataConnSwitchmethod.setAccessible(true);
        dataConnSwitchmethod.invoke(ITelephonyStub);
    }
      

  3.   

    在源码frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\路径下增加DataEnabledController.java/**
     * TODO: Listen for changes to the data connection.
     */
    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());
                    }
                });
        }
    }
      

  4.   

    再frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\tablet\SettingsView.java路径下public class SettingsView extends LinearLayout implements View.OnClickListener{
      //增加数据广播实例声明
      DataEnabledController mDataEnabled;
      ...
      
      //在该方法下增加~
      protected void onFinishInflate() {
      ...
      mDataEnabled = new DataEnabledController(context,
    (CompoundButton)findViewById(R.id.dataEnable_checkbox));
      }}
    再在SystemUI\res下相应的xml布局文件内加入
    <LinearLayout
                android:id="@+id/dataEnable"
                style="@style/StatusBarPanelSettingsRow"
                >
            <ImageView
                    android:id="@+id/dataEnable_icon"
                    style="@style/StatusBarPanelSettingsIcon"
                    android:src="@drawable/ic_sysbar_data_switcher"
                    />
            <TextView
                    android:id="@+id/dataEnable_label"
                    style="@style/StatusBarPanelSettingsContents"
                    android:text="@string/status_bar_settings_data_enabled"
                    />
            <Switch
                    android:id="@+id/dataEnable_checkbox"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:layout_marginRight="5dp"
                    />
        </LinearLayout>
        <View style="@style/StatusBarPanelSettingsPanelSeparator" />
    最后在SystemUI\res下加入相应资源图片和字符串即可~    希望对你有所帮助~