下拉状态栏增加wifi热点开关

下拉状态栏中增加一个控制wifi热点的开关,单击打开或者关闭,长按进入设置中的wifi热点设置界面
注:wifi热点同wifi不能同时打开;飞行模式时,wifi及wifi热点都需关闭

一、增加id
frameworks/base/packages/SystemUI/ext/src/com/mediatek/systemui/ext/QuickSettingsTileViewId.java

public enum QuickSettingsTileViewId {
...
ID_ApWifi,
}

二、控制显示位置
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java

private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
  ...
  mengAddApWifiTile(parent, inflater);
}

具体实现

    private void mengAddApWifiTile(ViewGroup parent, LayoutInflater inflater) {
        /// M: Wifi Tile
        final QuickSettingsBasicTile wifiApTile = 
            new QuickSettingsBasicTile(mContext, null, R.layout.mtk_quick_settings_tile_basic);
        wifiApTile.setTileViewId(QuickSettingsTileViewId.ID_ApWifi);
        wifiApTile.setOnLongClickListener(new OnLongClickListener() {
            public boolean onLongClick(View v) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName(
                                "com.android.settings",
                                "com.android.settings.Settings$TetherSettingsActivity"));
                startSettingsActivity(intent);
                return true;
            }
        });
        parent.addView(wifiApTile);
        if (!FeatureOption.MTK_WLAN_SUPPORT) {
            wifiApTile.setVisibility(View.GONE);
        }
        mQuickSettingsConnectionModel.mengAddApWifiTile(wifiApTile);
    }

三、frameworks/base/packages/SystemUI/src/com/mediatek/systemui/statusbar/toolbar/QuickSettingsConnectionModel.java

1、添加代码:

    private View mApWifiTileView;
    private FrameLayout mApWifiLayout;
    private ImageView mApWifiIcon;
    private ImageView mApWifiSwitchIngGifView;
    private ApWifiStateTracker mApWifiStateTracker;

    public void mengAddApWifiTile(View tileView) {
        mApWifiTileView = tileView;
        mApWifiLayout = (FrameLayout) tileView.findViewById(R.id.layout);
        mApWifiIcon = (ImageView) tileView.findViewById(R.id.image);
    }

    private final class ApWifiStateTracker extends StateTracker {
        private boolean mIsAirlineMode = false;

        public void setAirlineMode(boolean enable) {
            if (DBG) {
                Xlog.d(TAG, "Mobile setAirlineMode called, enabled is: " + enable);
            }
            mIsAirlineMode = enable;
        }

        public boolean isClickable() {
            Xlog.d(TAG, "wifi mIsAirlineMode is " + mIsAirlineMode + ", mIsUserSwitching is " + mIsUserSwitching);
            return !mIsAirlineMode && super.isClickable();
        }

        @Override
        public int getActualState(Context context) {
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            if (wifiManager != null) {
                return wifiStateToFiveState(wifiManager.getWifiApState());
            }
            return STATE_DISABLED;
        }

        @Override
        protected void requestStateChange(Context context, final boolean desiredState) {
            final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            if (wifiManager == null) {
                Xlog.d(TAG, "No wifiManager.");
                setCurrentState(context, STATE_DISABLED);
                return;
            }
            /// M: Actually request the wifi change and persistent settings write off the UI thread, as it can take a
            /// user-noticeable amount of time, especially if there's disk contention.
            new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... args) {
                    wifiManager.setWifiApEnabled(null, desiredState);
                    return null;
                }
            }.execute();
        }

        @Override
        public void onActualStateChange(Context context, Intent intent) {
            if (!WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {
                return;
            }
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, -1);
            setCurrentState(context, wifiStateToFiveState(wifiState));
        }

        @Override
        public int getDisabledResource() {
            return R.drawable.ic_qs_hotspot_off; //need change id ys
        }

        @Override
        public int getEnabledResource() {
            return R.drawable.ic_qs_hotspot_enable; //need change id ys
        }

        @Override
        public int getInterMedateResource() {
            return R.drawable.ic_qs_stat_sys_hotspot_switch_anim; //need change id ys
        }

        @Override
        public ImageView getImageButtonView() {
            return mApWifiIcon;
        }

        public View getTileView() {
            return mApWifiTileView;
        }

        @Override
        public ImageView getSwitchingGifView() {
            if (mApWifiSwitchIngGifView == null) {
                mApWifiSwitchIngGifView = 
                    (ImageView) mApWifiLayout.findViewById(R.id.imageSwitch);
                mApWifiSwitchIngGifView.setVisibility(View.GONE);
            }
            return mApWifiSwitchIngGifView;
        }

        /**
         * M: Converts WifiManager's state values into our Wifi/Bluetooth-common state values.
         */
        private int wifiStateToFiveState(int wifiState) {
            switch (wifiState) {
            case WifiManager.WIFI_AP_STATE_DISABLED:
                return STATE_DISABLED;
            case WifiManager.WIFI_AP_STATE_ENABLED:
                return STATE_ENABLED;
            case WifiManager.WIFI_AP_STATE_DISABLING:
                return STATE_TURNING_OFF;
            case WifiManager.WIFI_AP_STATE_ENABLING:
                return STATE_TURNING_ON;
            default:
                return STATE_DISABLED;
            }
        }

        @Override
        public ImageView getIndicatorView() {
            return null;
        }

    }

2、在buildIconViews方法中

        if (FeatureOption.MTK_WLAN_SUPPORT) {
            mWifiStateTracker = new WifiStateTracker();

            //add  for ap wifi begin
            mApWifiStateTracker = new ApWifiStateTracker();
            //add  for ap wifi end
        }

点击事件

            if (FeatureOption.MTK_WLAN_SUPPORT) {
                mWifiTileView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                            WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
                            if (mWifiManager != null) {
                                int wifiApState = mWifiManager.getWifiApState();
                                if ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING)
                                        || (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED)) {
                                    mWifiManager.setWifiApEnabled(null, false);
                                }
                            }
                            mWifiStateTracker.toggleState(mContext);
                    }
                });

                //add for ap wifi begin
                mApWifiTileView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                            WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
                            if (mWifiManager != null) {
                                int wifiState = mWifiManager.getWifiState();
                                if ((wifiState == WifiManager.WIFI_STATE_ENABLING) ||
                                       (wifiState == WifiManager.WIFI_STATE_ENABLED)) {
                                     mWifiManager.setWifiEnabled(false);
                                     //Settings.Global.putInt(cr, Settings.Global.WIFI_SAVED_STATE, 1);
                                }
                            }
                            mApWifiStateTracker.toggleState(mContext);
                    }
                });
                //add  for ap wifi end

3、监听控制:

    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
...
if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
     mWifiStateTracker.onActualStateChange(context, intent);
     mWifiStateTracker.setImageViewResources(context);
} else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
     mApWifiStateTracker.onActualStateChange(context, intent);
     mApWifiStateTracker.setImageViewResources(context);
}
}

4、飞行模式时,wifi及wifi热点都需关闭

    if (PluginFactory.getStatusBarPlugin(mContext).supportDisableWifiAtAirplaneMode()) {
          mWifiStateTracker.setAirlineMode(enabled);
          mWifiTileView.setEnabled(mWifiStateTracker.isClickable());
          //add for ap wifi begin
          mApWifiStateTracker.setAirlineMode(enabled);
          mApWifiTileView.setEnabled(mApWifiStateTracker.isClickable());
          //add r ap wifi end
     }

5、在setUpdates中控制

 if (FeatureOption.MTK_WLAN_SUPPORT) {
      filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
                    //add  for ap wifi begin
      filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
                    //add  for ap wifi end
     }

6、找到toggleState方法

 if (PluginFactory.getStatusBarPlugin(mContext).supportDisableWifiAtAirplaneMode()) {
    mWifiStateTracker.setAirlineMode(!airlineMode);
    mWifiTileView.setEnabled(mWifiStateTracker.isClickable());

      //add mgb for ap wifi begin
     mApWifiStateTracker.setAirlineMode(!airlineMode);
     mApWifiTileView.setEnabled(mApWifiStateTracker.isClickable());
      //add mgb for ap wifi end
  }

7、initConfigurationState方法中

            //add  for ap wifi begin
            if (PluginFactory.getStatusBarPlugin(mContext).supportDisableWifiAtAirplaneMode()) {
                mApWifiStateTracker.setAirlineMode(isAirlineModeOn);
                mApWifiTileView.setEnabled(mApWifiStateTracker.isClickable());
            }
            mApWifiStateTracker.setImageViewResources(mContext);
            //add  for ap wifi end

8、updateResources方法中

        if (FeatureOption.MTK_WLAN_SUPPORT) {
            TextView wifiText = (TextView) mWifiTileView.findViewById(R.id.text);
            wifiText.setText(R.string.quick_settings_wifi_label);

            //add mgb for ap wifi begin
            TextView apWifiText = (TextView) mApWifiTileView.findViewById(R.id.text);
            apWifiText.setText(R.string.quick_settings_hotspot_label); // need change id ys
            //add mgb for ap wifi end
        }

三、切换开关时的动画xml文件

<animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
    <item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim1" android:duration="150" />
    <item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim2" android:duration="150" />
    <item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim3" android:duration="150" />
    <item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim4" android:duration="150" />
</animation-list>

图片和字符资源需自己添加

http://blog.csdn.net/xiaoxiao108/article/details/31398127 现在用有线连网看视频速度要比经过路由器快,用无线做热点,但无线设置热点后,关机或重启又要再重新开启热点,这样比较麻烦,增加上开机自启热点,这样比较方便了,连网速度快看视频不卡其它设备也可以通过盒子上网。 开发工具 android ADT 实现方法 1.开启热点 2.开机启动 具体代码 1.开启热点 [java] view plaincopy在CODE上查看代码片派生到我的代码片 WifiManager wifiManager; wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); Method method = wifiManager.getClass().getMethod("getWifiApState"); int state = (Integer) method.invoke(wifiManager); if(state==13||state==12)// 已经开 或者 正在开 { }else { Toast.makeText(MainActivity.this,"正在开启AndroidAP...", 1).show(); wifiManager.setWifiEnabled(false); WifiConfiguration apConfig = new WifiConfiguration(); apConfig.SSID = "AndroidAP"; apConfig.allowedKeyManagement.set(4); apConfig.preSharedKey = "5e8918f37260"; method = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE); boolean open = (Boolean) method.invoke(wifiManager, apConfig, true); } AndroidManifest.xml 中增加权限 2.开机启动 用了用 在我的电视盒子上试了试 发现 偶尔会出现 开机不自动运行的情况 换个思路把 用 替代 电视盒子自带的 桌面 开启AP热点后再 自动运行盒子自带的桌面 [java] view plaincopy在CODE上查看代码片派生到我的代码片 ComponentName componet = new ComponentName("com.duokan.duokantv","com.duokan.duokantv.MainActivity"); Intent i = new Intent(); i.setComponent(componet); startActivity(i); 使用方法 1.电视盒子连有线网 2.配置好盒子正常上网 3.安装自己写好的程序 如果你发现有什么不合理的,需要改进的地方,请留言。或者可以通过 328452421@qq.com 联系我,非常感谢。 http://blog.csdn.net/xiaoxiao108/article/details/31398127
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值