android 平板右下角WIFI无信号有关问题

android 平板右下角WIFI无信号问题

问题描述:

       android平板状态栏整合到了屏幕右下角, 我们在使用某些WIFI模块的时候会发现, WIFI热点扫描后, 可以看到热点有信号显示, 但是, 在连接上热点后, 右下角却始终没有信号格显示。

 

原因分析:

       在WIFI连接后, 状态栏一直接收不到信号值变化的广播, 导致无法获取到WIFI信号值。至于为何收不到, 应该就跟模块和驱动有关了。

frameworks/base/packages/apps/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java

else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
            mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
            mWifiLevel = WifiManager.calculateSignalLevel(
                    mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT);
        }

 

 

 

解决办法:

       既然在扫描热点中有信号, 那么可以通过获取此信号来显示。

       

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.anson.wifirssi"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        >
        <!-- activity
            android:name="com.anson.wifirssi.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-->
        <receiver android:name="com.anson.wifirssi.BootReceiver">
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>
        <service android:name="com.anson.wifirssi.RSSIService"></service>
    </application>

</manifest>

 

 

package com.anson.wifirssi;

import java.util.List;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.IBinder;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

public class RSSIService extends Service {
	
	WifiManager wifiMgr = null;
	BroadcastReceiver receiver;
	String connectedSSID ="";
	int time = 0;
	boolean mWifiConnected;
	
	Handler h = new Handler(){
		public void handleMessage(android.os.Message msg) {
			showWifiState();
			h.sendEmptyMessageDelayed(0, 2000);
			if(time == 5){
				wifiMgr.startScan();
				time = 0;
			}
			time ++;
		};
	};
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		android.util.Log.d("RSSIService", "ALog 0925 > onCreate()-----------------------------------------");
		wifiMgr = (WifiManager)getSystemService(WIFI_SERVICE);
		h.sendEmptyMessageDelayed(0, 2000);
		
		IntentFilter filter = new IntentFilter();
		filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
		filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
		receiver = new BroadcastReceiver(){

			@Override
			public void onReceive(Context context, Intent intent) {
				// TODO Auto-generated method stub
				alog(intent.getAction());
				if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){
					final NetworkInfo networkInfo = (NetworkInfo)
		                    intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
		            mWifiConnected = networkInfo != null && networkInfo.isConnected();
		            if(mWifiConnected){
		            	WifiInfo info = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
			            connectedSSID = info.getSSID();
		            }
				}
			}
			
		};
		registerReceiver(receiver, filter);
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
	}
	
	
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	
	void showWifiState(){
		List<ScanResult> results = wifiMgr.getScanResults();
		if(results != null && results.size() > 0){
			for(ScanResult sr:results){
				if(mWifiConnected && sr.SSID.equals(connectedSSID)){
					Intent intent = new Intent(WifiManager.RSSI_CHANGED_ACTION);
					intent.putExtra(WifiManager.EXTRA_NEW_RSSI, sr.level);
					sendBroadcast(intent);
				}
			}
		}
	}
	void alog(String s){
		android.util.Log.d("RSSIService", "ALog 0925 > " + s + "-----------------------------------------");
	}
	
	public String getWifiState(int state){
		String result = "WIFI_STATE_UNKNOWN";
		switch(state){
		case WifiManager.WIFI_STATE_DISABLED:
			result = "WIFI_STATE_DISABLE";
			break;
		case WifiManager.WIFI_STATE_DISABLING:
			result = "WIFI_STATE_DISABLING";
			break;
		case WifiManager.WIFI_STATE_ENABLED:
			result = "WIFI_STATE_ENABLED";
			break;
		case WifiManager.WIFI_STATE_ENABLING:
			result = "WIFI_STATE_ENABLING";
			break;
		}
		return result;
	}

}

 

主要处理思路:

获取到热点信号后,通过广播发给状态栏。