自己动手实现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密码查看器的主要内容,如果未能解决你的问题,请参考以下文章