admin管理员组

文章数量:1530864

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

 

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

 

先来看看成果图吧:    

 

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

 

 

 

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

 

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

这里我使用了开源的工具类:ShellUtils.java [https://github/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.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 = Patternpile("network=\\{([^\\}]+)\\}", Pattern.DOTALL);
139         Matcher matcher = network.matcher(wifiConfigInfo);
140         WifiInfo model;
141         while (matcher.find()) {
142             String networkBlock = matcher.group();
143             Pattern ssid = Patternpile("ssid=\"([^\"]+)\"");
144             Matcher ssidMatcher = ssid.matcher(networkBlock);
145             if (ssidMatcher.find()) {
146                 model = new WifiInfo();
147                 model.setWifiName(ssidMatcher.group(1));
148                 Pattern psk = Patternpile("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/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/wuwz/WiFiViewer

 

转载于:https://wwwblogs/wuwz/p/6028438.html

本文标签: 自己动手密码查看器wifi