问题描述:
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;
}
}
主要处理思路:
获取到热点信号后,通过广播发给状态栏。
本文介绍了一种解决方案,用于解决Android平板设备在连接WIFI后状态栏信号显示缺失的问题。通过自定义服务定期扫描WIFI信号,并通过广播更新状态栏信号强度。
507

被折叠的 条评论
为什么被折叠?



