android WIFI 信号强度检测

前几天开会,领导突然说让我们增加个功能,和手机WIFI信号图标一样,会随着信号强度的强弱来改变。(因为我们这里所有状态栏都是隐藏了的,所以这些小东西都得自己写了)。

好了,言归正传。我们来说说如何实现这个功能吧!

首先我们屡屡思路,如果要实现这个功能,肯定先得判断是否有网,有网了以后那么我们得判断WIFI打开没有,打开了也得判断连接了没有,连接了也得判断可不可以用~~~(握了棵草,又臭又长)

总之就是这些各种判断,最后呢让我们的图片跟着信号强度来改变就可以了。信号强度分为几个等级,百度一下你就会知道。
WIFI信号强度呢,他不是正数,而是负数,一般分为四个等级。虽然强度值很多,但是行业中已经形成了几个数值来代表不同等级。
0 —— (-55)dbm 满格(4格)信号
(-55) —— (-70)dbm 3格信号
(-70) —— (-85)dbm 2格信号
(-85) —— (-100)dbm 1格信号

废话不多了,大家来看看具体代码如何,我们来探讨探讨:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <ImageView
        android:id="@+id/img_wifi"
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:layout_marginTop="5dp"
        android:background="@drawable/wifi" />

</LinearLayout>

就这一个,没了· · ·

布局弄好后,那我们开始正文,首先创建一个WIFI类,做一些初始化工作。


/**
 * Created by 79442
 * on 2016/10/13.
 *
 * WIFI信号强度检测
 *
 * 5秒检测一次发送Handler改变UI线程效果
 */

public class WIFI {

    private WifiInfo wifiInfo = null;//获得的wifi信息

    private WifiManager wifiManager = null;//wifi管理器

    public Context context;


    private int level;//信号强度

    public void initWifi(Context context) {
        //获得wifiManager
        wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        //使用定时器,每隔5秒获得一次信号强度值
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                wifiInfo = wifiManager.getConnectionInfo();
                //获得信号强度值
                level = wifiInfo.getRssi();
                //根据获得信号的强度发送信息
                if (level <= 0 && level >= -50) {
                    mhandler.sendEmptyMessage(1);
                } else if (level < -50 && level >= -70) {
                    mhandler.sendEmptyMessage(2);
                } else if (level < -70 && level >= -80) {
                    mhandler.sendEmptyMessage(3);
                } else if (level < -80 && level >= -100) {
                    mhandler.sendEmptyMessage(4);
                } else {
                    mhandler.sendEmptyMessage(5);
                }
            }
        }, 1000, 5000);
    }

    /**
     * 使用Handler实现UI线程与Timer线程之间的信息传递,每5秒告诉UI线程获得wifiInfo
     * */
    Handler mhandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                //如果收到正确的消息就获取wifiInfo,改变图片并显示信号强度
                case 1:
                    BaseActivity.img_wifi.setImageResource(R.drawable.wifi03);
                    Log.i("info","信号强度:"+level+"信号最好");
                    break;
                case 2:
                    BaseActivity.img_wifi.setImageResource(R.drawable.wifi02);
                    Log.i("info","信号强度:"+level+"信号较好");
                    break;
                case 3:
                    BaseActivity.img_wifi.setImageResource(R.drawable.wifi01);
                    Log.i("info","信号强度:"+level+"信号一般");
                    break;
                case 4:
                    BaseActivity.img_wifi.setImageResource(R.drawable.wifi);
                    Log.i("info","信号强度:"+level+"信号较差");
                    break;
                case 5:
                    BaseActivity.img_wifi.setImageResource(R.drawable.wifi);
                    Log.i("info","信号强度:"+level+"无信号");
                    break;
                default:
                    Log.i("info","信号强度:"+level+"无信号");
                    break;
            }
        }
    };
}

上面也看到了,为了所有界面都能够用到,我创建了一个BaseActivity,用来进行搭建桥梁。来看看BaseActivity我写了什么· · ·

/**
 * Created by 79442
 * on 2016/9/23.
 */

public class BaseActivity extends Activity {

    public static BaseActivity instance;

    public static ImageView img_wifi;

    /**
     * 网络监听线程
     * <p>
     * 11:网络断开
     * 22:网络良好
     */
    public Handler mhandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 11) {
                Log.i("info", "显示网络提示框");

                NetworkingTipsDialog.displayDialog(BaseActivity.this);

            }
            if (msg.what == 22) {
                return;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instance = this;



        WIFI wifi = new WIFI();
        wifi.initWifi(getApplicationContext());
    }
    /**
     * 控件初始化
     * */
    public void initView(){
        img_wifi = (ImageView) findViewById(R.id.img_wifi);
    }

}

只有一个线程用来接收判断后的结果,是否有网,没网的时候弹出来一个提示框。

/**
 * Created by 79442
 * on 2016/9/22.
 * <p>
 * 网络监听
 *
 * 有网时,给线程发送 msg.what = 22 的命令
 *
 * 没网时,给线程发送 msg.what = 11 的命令
 */

public class NetBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("info", "正在尝试连接网络");
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        try {
            if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {

                BaseActivity.instance.mhandler.sendEmptyMessage(11);

                Toast.makeText(context, "已经断开网络", Toast.LENGTH_LONG).show();
                Log.i("info", "已经断开网络");
            } else {

                BaseActivity.instance.mhandler.sendEmptyMessage(22);

                Toast.makeText(context, "已经连接网络", Toast.LENGTH_LONG).show();
                Log.i("info", "已经连接网络");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

重点差不多都讲完了,在Activity中,只需要调用一下BaseActivity中的初始化控件的方法就可以了。

public class LoginActivity extends BaseActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        initView();//获取BaseActivity中初始化控件
    }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_login"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="40dp"
    android:background="@android:color/black"
    tools:context=".activity.LoginActivity">

        <LinearLayout
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:layout_alignParentRight="true"
        android:layout_marginRight="40dp"
        android:orientation="horizontal">
        <include layout="@layout/signal"/>
    </LinearLayout>

</RelativeLayout>

我的思路呢,就是启动项目后,检测是否有网络,没网的情况下弹出Dialog,给出提示。连接好后并且网络处于可以使用的情况下,利用Handler进行每隔5秒一次的信号检测,然后更改UI线程中的图片。

差不多都说了,还有什么想知道的留言。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值