package com.roboo.like.google.async;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import org.apache.http.protocol.HTTP;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;
public class WifiAsyncTaskLoader extends BaseAsyncTaskLoader<LinkedList<ScanResult>>
{
private Context mContext;
public WifiAsyncTaskLoader(Context context)
{
super(context);
this.mContext = context;
}
public LinkedList<ScanResult> loadInBackground()
{
LinkedList<ScanResult> data = getWifiInfo();
mEndTime = System.currentTimeMillis();
if (mEndTime - mStartTime < THREAD_LEAST_DURATION_TIME)
{
try
{
Thread.sleep(THREAD_LEAST_DURATION_TIME);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
return data;
}
@SuppressLint("NewApi")
private LinkedList<ScanResult> getWifiInfo()
{
WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
mDebug = false;
if (mDebug)
{
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
System.out.println(wifiInfo.getSSID() + " " + wifiInfo.getIpAddress() + " " + wifiInfo.getLinkSpeed() + " " + wifiInfo.getMacAddress() + " " + wifiInfo.getNetworkId() + " " + wifiInfo.getRssi() + " " + wifiInfo.getBSSID());
}
List<ScanResult> data = mWifiManager.getScanResults();
LinkedList<ScanResult> wifis = null;
if (null != data)
{
wifis = new LinkedList<ScanResult>();
for (int i = 0; i < data.size(); i++)
{
ScanResult scanResult = data.get(i);
mDebug = false;
if (mDebug)
{
System.out.println("无线网络名称 = " + scanResult.SSID + " capabilities = " + scanResult.capabilities + " frequency = " + scanResult.frequency + " level = " + scanResult.level + " timestamp = " + scanResult.timestamp + " describeContents = " + scanResult.describeContents()
+ " BSSID = " + scanResult.BSSID);
}
wifis.add(scanResult);
}
}
List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
if (null != networks)
{
for (WifiConfiguration configuration : networks)
{
if (mDebug)
{
System.out.println("configuration = " + configuration);
}
}
}
HashMap<String, String> hashMap = getConfigWifiInfos();
LinkedList<ScanResult> tmpList = new LinkedList<ScanResult>();
for (ScanResult scanResult : wifis)
{
scanResult.capabilities = "WIFI密码没有配置过";
for (String key : hashMap.keySet())
{
String ssid = scanResult.SSID;
mDebug = true;
if (mDebug)
{
System.out.println("scanResult.SSID = " + ssid + " string = " + key + " password = " + hashMap.get(key));
}
boolean flag = ssid.equals(key);
if (flag)
{
tmpList.add(scanResult);
scanResult.capabilities = hashMap.get(key);
break;
}
}
}
handleWifi(wifis ,tmpList);
return wifis;
}
private void handleWifi(LinkedList<ScanResult> wifis,LinkedList<ScanResult> tmpList)
{
wifis.removeAll(tmpList);
wifis.addAll(0, tmpList);
tmpList.clear();
for(ScanResult scanResult :wifis)
{
if(TextUtils.isEmpty(scanResult.SSID))
{
tmpList.add(scanResult);
}
}
if(tmpList.size() > 0)
{
wifis.removeAll(tmpList);
}
}
/**
* 获取设备中已经配置过的wifi信息
*/
private HashMap<String, String> getConfigWifiInfos()
{
HashMap<String, String> data = new HashMap<String, String>();
String newFilePath = "/mnt/sdcard/wifi.conf";
File file = new File(newFilePath);
if (!file.exists())
{
String originFilePath = "/data/misc/wifi/wpa_supplicant.conf";
// System.out.println(" runRootCommand = " + runRootCommand(" chmod 777 " + originFilePath));
System.out.println(" runRootCommand = " + runRootCommand(" cp " + originFilePath + " " + newFilePath));
}
if (file.exists() && file.canRead())
{
try
{
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = -1;
StringBuffer stringBuffer = new StringBuffer();
while ((len = fileInputStream.read(buffer)) != -1)
{
stringBuffer.append(new String(buffer, 0, len, HTTP.UTF_8));
}
mDebug = false;
if(mDebug)
{
System.out.println("stringBuffer = " + stringBuffer);
}
if (stringBuffer.toString().contains("network="))
{
stringBuffer = stringBuffer.delete(0, stringBuffer.toString().indexOf("network="));
String[] tmp = stringBuffer.toString().split("network=");
for (String str : tmp)
{
if (str.contains("{") && str.contains("}"))
{
str = str.replace("{", "");
str = str.replace("}", "");
}
str = str.trim();
if (str.contains("\n"))
{
String[] tmp1 = str.split("\n");
// System.out.println("tmp1 = " + tmp1.length);
if (tmp1.length == 4)// 有密码
{
String ssid = tmp1[0];
String password = tmp1[1];
if (ssid.contains("="))
{
ssid = ssid.split("=")[1];
ssid = ssid.substring(1, ssid.length() - 1);
}
if (password.contains("="))
{
password = password.split("=")[1];
password = password.substring(1, password.length() - 1);
}
// System.out.println("ssid = " + ssid + " password = " + password);
data.put(ssid, password);
}
}
}
}
fileInputStream.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
file.delete();
return data;
}
/***
* 执行Root 命令
*
* @param command
* 要执行的命令[chmod 777 /data/misc/wifi/wpa_supplicant.conf]
* @return true 命令成功执行 或者 false 命令执行失败
*/
public static boolean runRootCommand(String command)
{
Process process = null;
DataOutputStream os = null;
try
{
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
}
catch (Exception e)
{
return false;
}
finally
{
try
{
if (os != null)
{
os.close();
}
process.destroy();
}
catch (Exception e)
{}
}
return true;
}
}