从 ui 角度来看,您需要一个自定义适配器:
private class WifiAdapter extends ArrayAdapter<ScanResult> {
public WifiAdapter(Context context, int resource, List<ScanResult> objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.wifi_item, parent, false);
}
ScanResult result = getItem(position);
((TextView) convertView.findViewById(R.id.wifi_name)).setText(formatSSDI(result));
((ImageView) convertView.findViewById(R.id.wifi_img)).setImageLevel(getNormalizedLevel(result));
return convertView;
}
private int getNormalizedLevel(ScanResult r) {
int level = WifiManager.calculateSignalLevel(r.level,
5);
Log.e(getClass().getSimpleName(), "level " + level);
return level;
}
private String formatSSDI(ScanResult r) {
if (r == null || r.SSID == null || "".equalsIgnoreCase(r.SSID.trim())) {
return "no data";
}
return r.SSID.replace("\"", "");
}
我稍微改变了你的showWifiListDialog
:
private void showWifiListDialog(List<ScanResult> results) {
Collections.sort(results, new Comparator<ScanResult>() {
@Override
public int compare(ScanResult lhs, ScanResult rhs) {
return rhs.level > lhs.level ? 1 : rhs.level < lhs.level ? -1 : 0;
}
});
AlertDialog.Builder builderSingle = new AlertDialog.Builder(
this);
final WifiAdapter arrayAdapter = new WifiAdapter(
this,
android.R.layout.select_dialog_item, results);
builderSingle.setNegativeButton(getString(android.R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builderSingle.setAdapter(arrayAdapter,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String strName = arrayAdapter.getItem(which).SSID;
Toast.makeText(getApplicationContext(), "Selected " + strName, Toast.LENGTH_SHORT).show();
}
});
AlertDialog dialog = builderSingle.create();
dialog.show();
}
Wifi 项目是
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:textSize="16sp"
android:padding="5dp"
android:layout_gravity="center_vertical"
android:id="@+id/wifi_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<ImageView
android:id="@+id/wifi_img"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/wifi_level" />
</LinearLayout>
可绘制的 wifi_level 是
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_signal_wifi_0_bar_black_24dp"
android:maxLevel="0" />
<item
android:drawable="@drawable/ic_signal_wifi_1_bar_black_24dp"
android:maxLevel="1" />
<item
android:drawable="@drawable/ic_signal_wifi_2_bar_black_24dp"
android:maxLevel="2" />
<item
android:drawable="@drawable/ic_signal_wifi_3_bar_black_24dp"
android:maxLevel="3" />
<item
android:drawable="@drawable/ic_signal_wifi_4_bar_black_24dp"
android:maxLevel="4" />
</level-list>
我从其中取出了五个pnghere
对于连接,答案是是的,应该有可能。至少根据文档。您可以实例化一个对象Wifi配置,并向其提供您要连接的网络的信息(SSID
and password
)。这不是一件简单的事情。如果您必须考虑不同类型的密钥加密,(WPA
, WEP
, free wifi
)。一旦你填写了对象,你必须调用
mWifiManager.disconect();
int resId = mWifiManager.addNetwork(config);
mWifiManager.enableNetwork(resId, true);
Edit:
如果您想显示带或不带挂锁的 wifi 信号强度图标,您可以使用自定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="wifi">
<attr name="state_locked" format="boolean" />
</declare-styleable>
</resources>
并在 ImageView 的子类中更新其状态:
public class WifiImageView extends ImageView {
private static final int[] STATE_LOCKED = {R.attr.state_locked};
private boolean mWifiLocked;
public WifiImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (mWifiLocked) {
mergeDrawableStates(drawableState, STATE_LOCKED);
}
return drawableState;
}
public void setStateLocked(boolean locked) {
mWifiLocked = locked;
refreshDrawableState();
}
}
现在假设你的 android:srcWifeImageView
是一个选择器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto">
<item custom:state_locked="false" android:drawable="@drawable/wifi_level" />
<item custom:state_locked="true" android:drawable="@drawable/wifi_level_lock" />
</selector>
在您的适配器中,您可以轻松地在两者之间切换level-list
,添加以下两行代码
boolean protectedWifi = result.capabilities.contains ("WEP") || result.capabilities.contains("WPA");
((WifiImageView) convertView.findViewById(R.id.wifi_img)).setStateLocked(protectedWifi);
protectedWifi
被评估为真,如果result.capabilities
包含WEP
or WPA
, and setStateLocked(protectedWifi);
会在两者之间切换level-list
s 相应于其值。当然,在wifi_item.xml
,你有两个变化ImageView
, 到定制WifiImageView
.