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

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

先来看看成果图吧:    

界面布局非常简单,贴出来简单的看看吧:

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

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

这里我使用了开源的工具类:ShellUtils.java [https://github.com/wuwz/android-utils/blob/master/app/src/main/java/com/ihongqiqu/util/ShellUtils.java]

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

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

  1 package org.wuwz.wifiviewer;
  2
  3 import android.app.Activity;
  4 import android.content.ClipData;
  5 import android.content.ClipboardManager;
  6 import android.content.Context;
  7 import android.content.Intent;
  8 import android.net.Uri;
  9 import android.os.Bundle;
 10 import android.text.TextUtils;
 11 import android.view.ContextMenu;
 12 import android.view.KeyEvent;
 13 import android.view.Menu;
 14 import android.view.MenuItem;
 15 import android.view.View;
 16 import android.widget.AdapterView;
 17 import android.widget.LinearLayout;
 18 import android.widget.ListView;
 19 import android.widget.TextView;
 20 import android.widget.Toast;
 21
 22 import org.wuwz.wifiviewer.adapter.WifiInfoAdapter;
 23 import org.wuwz.wifiviewer.model.WifiInfo;
 24 import org.wuwz.wifiviewer.utils.ShellUtils;
 25
 26 import java.text.MessageFormat;
 27 import java.util.ArrayList;
 28 import java.util.Collections;
 29 import java.util.List;
 30 import java.util.regex.Matcher;
 31 import java.util.regex.Pattern;
 32
 33
 34 public class MainActivity extends Activity {
 35
 36     private ListView _lvWifiInfo = null;
 37     private LinearLayout _layoutFullMsg = null;
 38     private TextView _tvFullMsg = null;
 39     private boolean _isReadCompile = false;
 40     private List<WifiInfo> _dataList = new ArrayList<>();
 41     private WifiInfoAdapter _wifiInfoAdapter;
 42     private ClipboardManager _clipboardManager = null;
 43
 44     @Override
 45     protected void onCreate(Bundle savedInstanceState) {
 46         super.onCreate(savedInstanceState);
 47         setContentView(R.layout.activity_main);
 48         initViews();
 49         _clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
 50     }
 51
 52     private void initViews() {
 53         _lvWifiInfo = (ListView) findViewById(R.id.listview_wifi_info);
 54
 55         _wifiInfoAdapter = new WifiInfoAdapter(this, _dataList);
 56         _lvWifiInfo.setAdapter(_wifiInfoAdapter);
 57
 58         /*_lvWifiInfo.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
 59             @Override
 60             public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
 61
 62                 Toast.makeText(MainActivity.this, "show details dialog..", Toast.LENGTH_SHORT).show();
 63                 return false;
 64             }
 65         });*/
 66
 67         _lvWifiInfo.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
 68             @Override
 69             public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
 70                 // show details menu dialog..
 71                 menu.setHeaderTitle("选择操作");
 72                 menu.add(v.getId(), 0, 0, "复制WIFI密码");
 73                 menu.add(v.getId(), 1, 1, "复制WIFI名字+密码");
 74             }
 75         });
 76
 77         _tvFullMsg = (TextView) findViewById(R.id.tv_full_msg);
 78         _layoutFullMsg = (LinearLayout) findViewById(R.id.layout_full_msg);
 79     }
 80
 81     @Override
 82     public boolean onContextItemSelected(MenuItem item) {
 83         AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
 84
 85         WifiInfo data = _dataList.get(info.position);
 86         if (data.getWifiPwd().equals(getString(R.string.wifi_no_pwd))) {
 87             Toast.makeText(MainActivity.this, "这个WIFI没有密码,换一个试试吧!", Toast.LENGTH_LONG).show();
 88         } else {
 89
 90             String content = "";
 91             switch (item.getItemId()) {
 92                 case 0:
 93                     content = data.getWifiPwd();
 94                     break;
 95                 case 1:
 96                     content = MessageFormat.format("WIFI名字:{0} 密码:{1}", data.getWifiName(), data.getWifiPwd());
 97                     break;
 98             }
 99
100             _clipboardManager.setPrimaryClip(ClipData.newPlainText(null, content));
101             Toast.makeText(MainActivity.this, "操作成功!", Toast.LENGTH_LONG).show();
102         }
103
104         return super.onContextItemSelected(item);
105     }
106
107     @Override
108     protected void onStart() {
109         super.onStart();
110
111         if (!_isReadCompile) {
112
113             readWifiConfigToListView();
114         }
115     }
116
117     private void readWifiConfigToListView() {
118         String[] commands = new String[]{"cat /data/misc/wifi/wpa_supplicant.conf\n", "exit\n"};
119
120         ShellUtils.CommandResult cr = ShellUtils.execCommand(commands, true, true);
121
122         if (cr.result != 0) {
123             _tvFullMsg.setText(getString(R.string.analysis_error_msg));
124             _layoutFullMsg.setVisibility(View.VISIBLE);
125             Toast.makeText(this, getString(R.string.analysis_error_msg), Toast.LENGTH_LONG).show();
126             return;
127         }
128
129         String wifiConfigInfo = String.valueOf(cr.successMsg);
130         if (TextUtils.isEmpty(wifiConfigInfo)) {
131             // no root.
132             _layoutFullMsg.setVisibility(View.VISIBLE);
133             Toast.makeText(MainActivity.this, getString(R.string.no_root_msg), Toast.LENGTH_LONG).show();
134             return;
135         }
136
137         // analysis result.
138         Pattern network = Pattern.compile("network=\\{([^\\}]+)\\}", Pattern.DOTALL);
139         Matcher matcher = network.matcher(wifiConfigInfo);
140         WifiInfo model;
141         while (matcher.find()) {
142             String networkBlock = matcher.group();
143             Pattern ssid = Pattern.compile("ssid=\"([^\"]+)\"");
144             Matcher ssidMatcher = ssid.matcher(networkBlock);
145             if (ssidMatcher.find()) {
146                 model = new WifiInfo();
147                 model.setWifiName(ssidMatcher.group(1));
148                 Pattern psk = Pattern.compile("psk=\"([^\"]+)\"");
149                 Matcher pskMatcher = psk.matcher(networkBlock);
150
151                 model.setWifiPwd(pskMatcher.find() ? pskMatcher.group(1) : getString(R.string.wifi_no_pwd));
152                 _dataList.add(model);
153             }
154         }
155         Collections.reverse(_dataList);
156         _wifiInfoAdapter.notifyDataSetChanged();
157
158         Toast.makeText(MainActivity.this, getString(R.string.welcome_msg), Toast.LENGTH_SHORT).show();
159         _isReadCompile = true;
160     }
161
162     @Override
163     public boolean onCreateOptionsMenu(Menu menu) {
164         getMenuInflater().inflate(R.menu.menu_main, menu);
165         return true;
166     }
167
168     @Override
169     public boolean onOptionsItemSelected(MenuItem item) {
170         int id = item.getItemId();
171
172         if (id == R.id.action_about) {
173             Uri uri = Uri.parse("http://github.com/wuwz");
174             startActivity(new Intent(Intent.ACTION_VIEW, uri));
175             return true;
176         } else if(id == R.id.action_exit) {
177             finish();
178             System.exit(0);
179         }
180
181         return super.onOptionsItemSelected(item);
182     }
183
184     private long _exitTime = 0;
185
186     @Override
187     public boolean onKeyDown(int keyCode, KeyEvent event) {
188         if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
189             if ((System.currentTimeMillis() - _exitTime) > 2000) {
190                 Toast.makeText(getApplicationContext(), "再按一次返回键退出程序", Toast.LENGTH_SHORT).show();
191                 _exitTime = System.currentTimeMillis();
192             } else {
193                 finish();
194                 System.exit(0);
195             }
196             return true;
197         }
198         return super.onKeyDown(keyCode, event);
199     }
200 }

至此,整个程序就已经基本完工了,从此就再也不用别人做的广告一大堆的WIFI密码查看器啦!

项目源码地址:https://github.com/wuwz/WiFiViewer

转载于:https://www.cnblogs.com/wuwz/p/6028438.html

自己动手实现WIFI密码查看器相关推荐

  1. aapr密码读取工具_wifi密码查看器原理是什么 wifi密码查看器原理介绍【详解】...

    前一篇文章有网友评论系统不支持wifi共享按钮无法通过二维码查看wifi密码,本文将深度探秘当前wifi密码查看器工作原理.通过此方式可以查看手机在上次恢复出厂设置到现在所连接所有wifi密码,前提是 ...

  2. Android Wifi密码查看器实现思路

    概述 最近出了一个wifi万能钥匙很火,但是用wifi万能钥匙连接上wifi我们是看不到密码,假如我想给平板连接,这是我们只能用手机3G网络建立热点然后让平板上的wifi万能钥匙进行连接,这样显然很麻 ...

  3. Android WIFI密码查看器实例(在获取Root权限下查看系统文件)

    Android WIFI密码查看器实例 实现原理:使用shell命令查看保存WIFI密码的系统文件 涉及的知识 界面展示 基本的Shell命令 shell查看WIFI密码 ShellUtil的使用 正 ...

  4. html查看器wifi,wifi密码查看器电脑版

    wifi密码查看器电脑版是用于查看当前设备曾经连接过的所有WIFI名称和密码的工具,wifi密码查看器电脑版可以用于找回遗忘的WIFI密码:也可以在多网络环境协同办公时,分辨出各个同名WIFI密码,便 ...

  5. 电脑wifi密码查看器 v1.0

    电脑wifi密码查看器 v1.0 是一款免费的wifi密码查看工具 能够查看当前电脑连接过的 wifi 密码! 软件支持 win7 win8 win10 系统! 支持保存文件等操作! 下载地址:htt ...

  6. 给大家介绍一个WIFI密码查看器,解密不安全的WIFI

    各位博友你们好,今天我看了一篇贴子,在这篇帖子里面找到了一个工具,我也试用了一下,看得我是冷汗直流啊 这是一篇WIFI查看器的帖子,说里面有一个工具是WIFI密码查看器,能够直接查看WIFI密码 起初 ...

  7. html查看器wifi,Wifi密码查看器

    昨天想了一会终于决定把这个小东西写了,一个Wifi密码查看器,就是利用Root之后的权限读取/data/misc/wifi/wpa_supplicant.conf 文件内容,然后获取wifi连接过的密 ...

  8. 电脑连接过的网络的wifi密码查看器

    wifi密码查看器 https://softxm.lanzouw.com/b01pqob8b密码:5vxl 直接进入cmd,输入命令 netsh wlan show profiles name=&qu ...

  9. android app wifi密码,无广告查看wifi密码的软件-WiFi密码查看清爽版app下载V999安卓版-西西软件下载...

    WiFi密码查看清爽版app是一款利用系统接口来查看链接的WiFi密码应用,实现密码查看功能的软件,WiFi密码查器看还聚合多种wifi辅助工具,wifi测速.流量统计.wifi信号增强.设备扫描.应 ...

最新文章

  1. lnmp下安装PECL HTTP 扩展
  2. V-rep学习笔记:机器人路径规划1
  3. Java面向对象基础整理
  4. 再见,汉斯·罗斯林,你用数据让宏大的问题变有趣 | 好奇心小数据
  5. [TODO]Python拾遗(二)
  6. vue小demo易错点总结
  7. Android(java)学习笔记69:短信发送器
  8. MySQL 索引详解大全
  9. oracle参数错误,解决oracle参数系统文件出错
  10. 计算机服务器安装系统安装教程,Windows Server操作系统安装教程
  11. 干货,分享!后台信息管理HTML静态网页模版
  12. 旧电脑改造服务器或云电脑和外网访问家庭nas/软路由实战记录
  13. Asp.net学习过程分解(学习路线)
  14. 如何让百度快速收录网站及文章
  15. 2021年网络空间安全学院预推免面试经验总结
  16. Java:计算圆的面积和周长
  17. Java 使用 iText5 API 根据需求导出 PDF
  18. 【读书笔记】《云计算关键领域安全指南V4.0》(一)
  19. Cuckoo针对恶意软件自动化分析系统
  20. 基于javaweb小说评价下载网站管理系统 ssm框架

热门文章

  1. Go测试开发(二) 多线程简单斗地主
  2. 建模系统编程语言c 有限元,基于CATIA二次开发的渐开线直齿轮参数化设计.pdf
  3. 海龟股票------大跌之后最赚钱的股票
  4. 紫光华宇拼音输入法 V6.1 正式版
  5. 荐书:《计算机视觉:模型、学习和推理》
  6. 计算机在油气储运专业的应用,计算机多媒体专业学论文参考文献 计算机多媒体专业论文参考文献数量是多少...
  7. vc2010 Setup制作、缺少MFC100.dll msvcp100.dll msvcr100.dll解决方法
  8. 长尾分布下的分类问题
  9. TCP如何保证服务的可靠性
  10. 如何禁用计算机防病毒程序,如何停用防病毒