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密码查看器 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1726807282a1085163.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论