HTC Android手机无法修改热点 Hotspot SSID名称和密码(一)

2014-11-24 09:12:37 · 作者: · 浏览: 0
Some htc phones seems to use a class of type HotspotProfile to keep its configuration. So, before callingsetWifiApEnabled, you need set the ssid in htc's way:
[java]
boolean isHtc = false;  
            try {  
                isHtc = WifiConfiguration.class  
                        .getDeclaredField("mWifiApProfile") != null;  
            } catch (java.lang.NoSuchFieldException e) {  
                isHtc = false;  
            }  
  
            WifiConfiguration apConfig = new WifiConfiguration();  
            apConfig.SSID = "H3c_xx";  
            apConfig.preSharedKey = "h3ch3ch3c";  
            apConfig.allowedKeyManagement  
                    .set(WifiConfiguration.KeyMgmt.WPA_PSK);  
  
            if (isHtc) {  
                setHTCSSID(apConfig);  
            }  
  
            // 通过反射调用设置热点  
            Method method;  
            method = wifiManager.getClass().getMethod("setWifiApEnabled",  
                    WifiConfiguration.class, Boolean.TYPE);  
            // 返回热点打开状态  
            boolean flag = (Boolean) method.invoke(wifiManager, apConfig, true);  

设置SSID和密码
[java]
    public void setHTCSSID(WifiConfiguration config) {  
        try {  
            Field mWifiApProfileField = WifiConfiguration.class  
                    .getDeclaredField("mWifiApProfile");  
            mWifiApProfileField.setAccessible(true);  
            Object hotSpotProfile = mWifiApProfileField.get(config);  
            mWifiApProfileField.setAccessible(false);  
  
  
            if (hotSpotProfile != null) {  
                Field ssidField = hotSpotProfile.getClass().getDeclaredField(  
                        "SSID");  
                ssidField.setAccessible(true);  
                ssidField.set(hotSpotProfile, config.SSID);  
                ssidField.setAccessible(false);  
  
  
                Field localField3 = hotSpotProfile.getClass().getDeclaredField(  
                        "key");  
                localField3.setAccessible(true);  
                localField3.set(hotSpotProfile, config.preSharedKey);  
                localField3.setAccessible(false);  
  
  
                Field localField6 = hotSpotProfile.getClass().getDeclaredField(  
                        "dhcpEnable");  
                localField6.setAccessible(true);  
                localField6.setInt(hotSpotProfile, 1);  
                localField6.setAccessible(false);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

可以通过遍历属性的方法查看还有那些可以修改的值:
[java]
public void dumpHTCWifiFunction2() {  
    Log.e(TAG, "dumpHTCWifiFunction2++");  
    // Method[] classMethods = null;  
    Field localField1;  
    Field[] fieldlist;  
    WifiConfiguration apConfig = new WifiConfiguration();  
    try {  
        localField1 = WifiConfiguration.class  
                .getDeclaredField("mWifiApProfile");  
        localField1.setAccessible(true);  
        Object localObject2 = localField1.get(apConfig);  
        localField1.setAccessible(false);  
        if (localObject2 != null) {  
            fieldlist = localObject2.getClass().getDeclaredFields();  
            for (int i = 0; i < fieldlist.length; i++) {  
                Log.e(TAG, "found api: " + fieldlist[i].getName()  
                        + " type:" + fieldlist[i].toString());  
            }  
        }  
  
    } catch (NoSuchFieldException e) {  
        e.printStackTrace();  
    } catch (IllegalArgumentException e) {  
        e.printStackTrace();  
    } catch (IllegalAccessException e) {  
        e.printStackTrace();  
    }  
  
    Log.e(TAG, "dumpHTCWifiFunction2--");  
}  

如:
found api: DEFAULT_DHCP_MAX_AP_CONNECTION type:public static final int android.net.wifi.WifiConfiguration$HotspotProfile.DEFAULT_DHCP_MAX_AP_CONNECTION
found api: DEFAULT_MAX_AP_CONNECTION type:public static final int android.net.wifi.WifiConfiguration$HotspotProfile.DEFAULT_MAX_AP_CONNECTION
found api: DHCP_MAX_AP_CONNECTION type:public static final int android.net.wifi.WifiConfiguration$HotspotProfile.DHCP_MAX_AP_CONNECTION
found api: MAX_AP_CONNECTION type:public static final int android.net.wifi.WifiConfiguration$HotspotProfile.MAX_AP_CONNECTION
found api: OPEN type:public static final java.lang.String android.net.wifi.WifiConfiguration$HotspotProfile.OPEN
found api: WEP type:public static final java.lang.String android.net.wifi.WifiConfiguration$HotspotProfile.WEP
found api: WPA ty