问题描述:
? ? ? ?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; }}
?
主要处理思路:
获取到热点信号后,通过广播发给状态栏。
?
?
? ? ?