自己动手实现WIFI密码查看器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己动手实现WIFI密码查看器相关的知识,希望对你有一定的参考价值。

最近搬了家,还没来得及装上宽带,于是乎手机上用**万能钥匙偷偷连接了几个WIFI,可是电脑也想用的话,就必须借助工具来查看密码了,之前一贯的做法是使用RE管理器进入系统文件夹查看WIFI配置文件(/data/misc/wifi/wpa_supplicant.conf),后来嫌麻烦又下载了好些WIFI密码查看器,但始终不满意,广告太多了哈哈!

 

刚好最近自学了不少安卓相关的知识,何不自己实现一个呢?

 

先来看看成果图吧:    

技术分享

界面布局非常简单,整个程序就只有一个Activity,使用LinearLayout+ListView, 太简单就不贴代码了

 

要实现这样的功能也非常简单,就是读取手机中的/data/misc/wifi/wpa_supplicant.conf文件,解析成需要的格式数据最好再显示在界面上就可以了

 

需要注意的是,读取该文件需要手机拥有root权限,同时该应用也要获取授权,参考了网上大神们的做法,通过android程序获取root权限,然后su用户执行命令行的方式读取即可。

1. 首先设计简单的javabean,用于存放解析的WIFI数据:

package org.wuwz.wifi.model;

public class WifiModel {

    private String name;
    private String password;

    // getter and setter ..
}

 

2. 在Actity的onStart()事件中读取WIFI数据并通过适配器填充到ListView中

private boolean isReadComplete = false;
@Override
protected void onStart() {
    super.onStart();
    if(!isReadComplete) { //避免重复读取
        readWifiConfig();
    }
}

private void readWifiConfig() {
    Process process = null;
    DataOutputStream out = null;
    DataInputStream in = null;

    StringBuffer result = new StringBuffer();
    try {
        // 申请root权限
        process = Runtime.getRuntime().exec("su");

        out = new DataOutputStream(process.getOutputStream());
        in = new DataInputStream(process.getInputStream());

        // 使用命令行的方式读取wifi配置文件
        out.writeBytes("cat /data/misc/wifi/wpa_supplicant.conf\\n");
        out.writeBytes("exit\\n");
        out.flush();

        InputStreamReader inReader = new InputStreamReader(in, "UTF-8");
        BufferedReader reader = new BufferedReader(inReader);

        String line;
        while ((line = reader.readLine()) != null) {
            result.append(line);
        }

        reader.close();
        inReader.close();
        process.waitFor();
    } catch (Exception e) {
        Log.d("wuwz", "发生异常:"+e.getMessage());
    } finally {
        
        try {
            if(in != null) {
                in.close();
            }
            if(out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        String wifiConfigInfo = String.valueOf(result);
        if(TextUtils.isEmpty(wifiConfigInfo)) {
            new AlertDialog.Builder(MainActivity.this)
                .setTitle("提示")
                .setMessage(R.string.no_root_tip)
                .setPositiveButton("退出程序", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        System.exit(1);
                    }
                }).show();
            return;
        }
        // 处理结果
        analysisResult(String.valueOf(result));
    }
}

// 解析结果
private void analysisResult(String result) {
    Pattern network = Pattern.compile("network=\\\\{([^\\\\}]+)\\\\}",Pattern.DOTALL);
    Matcher matcher = network.matcher(result);
    WifiModel model = null;
    while (matcher.find()) {
        String networkBlock = matcher.group();
        Pattern ssid = Pattern.compile("ssid=\\"([^\\"]+)\\"");
        Matcher ssidMatcher = ssid.matcher(networkBlock);
        if (ssidMatcher.find()) {
            model = new WifiModel();
            model.setName(ssidMatcher.group(1));
            Pattern psk = Pattern.compile("psk=\\"([^\\"]+)\\"");
            Matcher pskMatcher = psk.matcher(networkBlock);
            if (pskMatcher.find()) {
                model.setPassword(pskMatcher.group(1));
            } else {
                model.setPassword(getString(R.string.no_pwd_tip));
            }
            wifiModels.add(model);
        }
    }
    Collections.reverse(wifiModels);
    wifiAdapter.notifyDataSetChanged();
    
    Toast.makeText(MainActivity.this, "欢迎使用,长按WIFI密码可以复制!", Toast.LENGTH_SHORT).show();
    isReadComplete = true;
}

至此,整个程序就已经基本完工了,为了使用方便,不妨加入些小功能:

 

3. 添加ListView Item长按复制密码事件

// 长按复制密码
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

    @Override
    @SuppressLint("NewApi")
    @SuppressWarnings("deprecation")
    public boolean onItemLongClick(AdapterView<?> parent, View view,
            int index, long id) {
        String password = wifiModels.get(index).getPassword();
        if(getString(R.string.no_pwd_tip).equals(password)) {
            
            Toast.makeText(MainActivity.this, "这个WIFI没有密码,换一个试试吧!", Toast.LENGTH_SHORT).show();
            
            return false;
        }
        // 剪贴板管理
        ClipboardManager cliManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        
        cliManager.setText("WIFI:"+wifiModels.get(index).getName()+" 密码:" + password);
        
        Toast.makeText(MainActivity.this, "WIFI密码复制成功,感谢使用!", Toast.LENGTH_SHORT).show();
        return true;
    }
});

 

4. 连续两次返回键退出程序

private long mExitTime;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if ((System.currentTimeMillis() - mExitTime) > 2000) {
            Toast.makeText(this, "再按一次返回键退出程序", Toast.LENGTH_SHORT).show();
            mExitTime = System.currentTimeMillis();
        } else {
            System.exit(1);
        }
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

 

从此就再也不用别人做的广告一大堆的WIFI密码查看器啦!

 

以上是关于自己动手实现WIFI密码查看器的主要内容,如果未能解决你的问题,请参考以下文章

android log 怎样看wifi密码

dos下怎么查找当前wifi密码

苹果手机怎么查看是不是连接wifi

查看计算机连接过的WiFi密码(三种方法)

手机如何看路由器密码?

iphone查看当前连接的wifi密码