精华内容
下载资源
问答
  • 但部分安卓用户需要下载二维码扫描应用程序才能扫描二维码。这些应用程序可以从Google Play商店获得。 Wi-Fi Network config (Android, iOS 11+) 使用类似“ MECARD”的语法来指定wi-fi配置。提示用户后,扫描此类...

    相关文章:

    https://zh.wikihow.com/%E5%88%B6%E4%BD%9C%E4%BA%8C%E7%BB%B4%E7%A0%81%E5%88%86%E4%BA%ABWiFi%E5%AF%86%E7%A0%81

    https://www.sohu.com/a/219944402_100048759

    https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11

    使用的网页:

    https://qifi.org/

    https://www.qrstuff.com/

    http://www.zxing.appspot.com/generator

    https://www.liantu.com/

     

    说明:

    • 在iPhone上,用户只需打开相机应用程序,并将其对准二维码即可。将会出现一个“Wi-Fi二维码”的通知。如果用户点击它,就可以选择加入WiFi网络。他们所要做的就是点击加入连接
    • 部分安卓手机也可以使用“相机”应用扫描二维码。但部分安卓用户需要下载二维码扫描应用程序才能扫描二维码。这些应用程序可以从Google Play商店获得。

    Wi-Fi Network config (Android, iOS 11+)

    使用类似“ MECARD”的语法来指定wi-fi配置。提示用户后,扫描此类代码将相应地配置设备的Wi-Fi。例:

    WIFI:T:WPA;S:mynetwork;P:mypass;;
    Parameter Example Description
    T WPA Authentication type; can be WEP or WPA or WPA2-EAP, or nopass for no password. Or, omit for no password.
    S mynetwork Network SSID. Required. Enclose in double quotes if it is an ASCII name, but could be interpreted as hex (i.e. "ABCD")
    P mypass Password, ignored if T is nopass (in which case it may be omitted). Enclose in double quotes if it is an ASCII name, but could be interpreted as hex (i.e. "ABCD")
    H true Optional. True if the network SSID is hidden. Note this was mistakenly also used to specify phase 2 method in releases up to 4.7.8 / Barcode Scanner 3.4.0. If not a boolean, it will be interpreted as phase 2 method (see below) for backwards-compatibility
    E TTLS (WPA2-EAP only) EAP method, like TTLS or PWD
    A anon (WPA2-EAP only) Anonymous identity
    I myidentity (WPA2-EAP only) Identity
    PH2 MSCHAPV2 (WPA2-EAP only) Phase 2 method, like MSCHAPV2

    Order of fields does not matter. Special characters \;," and : should be escaped with a backslash (\) as in MECARD encoding. For example, if an SSID was literally "foo;bar\baz" (with double quotes part of the SSID name itself) then it would be encoded like: WIFI:S:\"foo\;bar\\baz\";;

    格式:WIFI:S:<SSID>;T:<WPA|WEP|>;P:<password>;;

    例如:

    wifi信号SSID:AAA,

    加密方式:WPA/WPA2

    密码:12345678

    结果:WIFI:S:AAA;T:WPA;P:12345678;;

     

     

     

     

    展开全文
  • 二维码分享WiFi密码(转)

    千次阅读 2016-10-18 15:27:12
    生成wifi 二维码方法 http://jingyan.baidu.com/article/f3e34a12a8a9c2f5eb65353c.html 如果上面链接不行, 另外参见: ...
    生成wifi 二维码方法

    http://jingyan.baidu.com/article/f3e34a12a8a9c2f5eb65353c.html

    如果上面链接不行,
    另外参见:
    https://www.baidu.com/link?url=C8UUQqMfeANMpcTmA-GRLdduyI0D6fSdJRQjO4fTeXR94X-j7nDkuRIhmZTgxIFeB30i87MoBN5ggvhifUbGEa&wd=&eqid=84773a4100020da9000000065805cd93
    展开全文
  • 二维码是搭载信息的一种载体,通过二维码能够传递名片、网址、商品信息等,本文讲到二维码的第二种妙用:通过二维码实现wifi账号和password分享。 关于二维码的基础知识,请訪问:二维码的生成细节和原理 试想...

            二维码是搭载信息的一种载体,通过二维码能够传递名片、网址、商品信息等,本文讲到二维码的第二种妙用:通过二维码实现wifi账号和password分享。

            关于二维码的基础知识,请訪问:二维码的生成细节和原理

            试想这样一种场景:一伙人去同一餐馆或者在一起开会,有的人之前去过且已经使用过那个场景的wifi账号。所以一去手机就能够直接连上那里的wifi,但有的同学是第一次去。也有连接wifi的需求,这时我们通常是通过别人告知wifi账号和password然后手动登陆。但问题是有时候已经连上wifi的人也不记得wifi的password了。本文结合这个需求场景。做了一个wifi账号和password分享的小demo。前提是两方都须要安装这个app,而且分享wifi的一方须要有root权限(眼下是。也能够将分享wifi的client作为热点,然后将热点分享给其它人,这个能够自行研究),这样降低了手动输入password的麻烦。


    本文主要介绍通过二维码实现wifi分享的两个核心功能:

    1、获取本机已经连接上的wifi账号、password和加密方式。

    2、给定指定内容生成二维码,扫描二维码解析出当中搭载的信息。


    1、获取本机已经连接上的wifi账号、password和加密方式:

    全部的事情都能够通过以下这个类搞定:

    public class WifiAdmin {
        public WifiAdmin(Context context) {   
            mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);   
            mWifiInfo = mWifiManager.getConnectionInfo();   
        }   
       
        // 打开WIFI    
        public void openWifi() {   
            if (!mWifiManager.isWifiEnabled()) {   
                mWifiManager.setWifiEnabled(true);   
            }   
        }   
       
        // 关闭WIFI    
        public void closeWifi() {   
            if (mWifiManager.isWifiEnabled()) {   
                mWifiManager.setWifiEnabled(false);   
            }   
        }   
       
        // 检查当前WIFI状态    
        public int checkState() {   
            return mWifiManager.getWifiState();   
        }   
       
        // 锁定WifiLock    
        public void acquireWifiLock() {   
            mWifiLock.acquire();   
        }   
       
        // 解锁WifiLock    
        public void releaseWifiLock() {   
            // 推断时候锁定    
            if (mWifiLock.isHeld()) {   
                mWifiLock.acquire();   
            }   
        }   
       
        // 创建一个WifiLock    
        public void creatWifiLock() {   
            mWifiLock = mWifiManager.createWifiLock("Test");   
        }   
       
        // 得到配置好的网络    
        public List<WifiConfiguration> getConfiguration() {   
            return mWifiConfiguration;   
        }   
       
        // 指定配置好的网络进行连接    
        public void connectConfiguration(int index) {   
            // 索引大于配置好的网络索引返回    
            if (index > mWifiConfiguration.size()) {   
                return;   
            }   
            // 连接配置好的指定ID的网络    
            mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,   
                    true);   
        }   
       
        public void startScan() {   
            mWifiManager.startScan();   
            // 得到扫描结果    
            mWifiList = mWifiManager.getScanResults();   
            // 得到配置好的网络连接    
            mWifiConfiguration = mWifiManager.getConfiguredNetworks();   
        }   
       
        // 得到网络列表    
        public List<ScanResult> getWifiList() {   
            return mWifiList;   
        }   
       
        // 查看扫描结果    
        @SuppressLint("UseValueOf")
    	public StringBuilder lookUpScan() {   
        	StringBuilder stringBuilder = new StringBuilder();   
            for (int i = 0; i < mWifiList.size(); i++) {   
            	stringBuilder.append("Index_" + new Integer(i + 1).toString() + ":");   
                // 将ScanResult信息转换成一个字符串包 当中把包含:BSSID、SSID、capabilities、frequency、level    
                stringBuilder.append((mWifiList.get(i)).toString());   
                stringBuilder.append("/n");   
            }   
            return stringBuilder;   
        }  
       
        // 得到MAC地址    
        public String getMacAddress() {   
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();   
        }   
       
        // 得到接入点的BSSID    
        public String getBSSID() {   
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();   
        }   
       
        // 得到IP地址    
        public int getIPAddress() {   
            return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();   
        }   
       
        // 得到连接的ID    
        public int getNetworkId() {   
            return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();   
        }   
        
        // 得到WifiInfo的全部信息包    
        public WifiInfo getWifiInfo() {   
            return mWifiInfo;   
        }
       
        // 加入一个网络并连接    
        public void addNetwork(WifiConfiguration wcg) {   
         int wcgID = mWifiManager.addNetwork(wcg);   
         boolean b =  mWifiManager.enableNetwork(wcgID, true);   
         System.out.println("a--" + wcgID);  
         System.out.println("b--" + b);  
        }   
       
        // 断开指定ID的网络    
        public void disconnectWifi(int netId) {   
            mWifiManager.disableNetwork(netId);   
            mWifiManager.disconnect();   
        }   
       
    	// 然后是一个实际应用方法。仅仅验证过没有密码的情况:
    	// 分为三种情况:1没有密码2用wep加密3用wpa加密
    	public WifiConfiguration CreateWifiInfo(String SSID, String password, int type) {
    		WifiConfiguration config = new WifiConfiguration();
    		config.allowedAuthAlgorithms.clear();
    		config.allowedGroupCiphers.clear();
    		config.allowedKeyManagement.clear();
    		config.allowedPairwiseCiphers.clear();
    		config.allowedProtocols.clear();
    		config.SSID = "\"" + SSID + "\"";
    
    		WifiConfiguration tempConfig = this.IsExsits(SSID);
    		if (tempConfig != null) {
    			mWifiManager.removeNetwork(tempConfig.networkId);
    		}
    
    		if (type == 1) {
    			// WIFICIPHER_NOPASS
    			config.wepKeys[0] = "";
    			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    			config.wepTxKeyIndex = 0;
    		}
    		if (type == 2) {
    			// WIFICIPHER_WEP
    			config.hiddenSSID = true;
    			config.wepKeys[0] = "\"" + password + "\"";
    			config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    			config.wepTxKeyIndex = 0;
    		}
    		if (type == 3) {
    			// WIFICIPHER_WPA
    			config.preSharedKey = "\"" + password + "\"";
    			config.hiddenSSID = true;
    			config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    			config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    			// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    			config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    			config.status = WifiConfiguration.Status.ENABLED;
    		}
    		
    		return config;
    	} 
          
    	private WifiConfiguration IsExsits(String SSID) {
    		List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
    		if (null == existingConfigs) {
    			return null;
    		}
    		for (WifiConfiguration existingConfig : existingConfigs) {
    			System.out.println("existingConfig == " + existingConfig.toString());
    			if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
    				System.out.println("existingConfig.SSID == " + existingConfig.SSID + " SSID == " + SSID);
    				return existingConfig;
    			}
    		}
    		
    		return null;
    	}
        
        public List<UserWifiInfo> getUserWifiInfoList( ) throws Exception {  
            List<UserWifiInfo> wifiInfos=new ArrayList<UserWifiInfo>();  
          
            Process process = null;  
            DataOutputStream dataOutputStream = null;  
            DataInputStream dataInputStream = null;  
            StringBuffer wifiConf = new StringBuffer();  
            try {  
                process = Runtime.getRuntime().exec("su");  
                dataOutputStream = new DataOutputStream(process.getOutputStream());  
                dataInputStream = new DataInputStream(process.getInputStream());  
                dataOutputStream.writeBytes("cat /data/misc/wifi/*.conf\n");  
                dataOutputStream.writeBytes("exit\n");  
                dataOutputStream.flush();  
                InputStreamReader inputStreamReader = new InputStreamReader(  
                        dataInputStream, "UTF-8");  
                BufferedReader bufferedReader = new BufferedReader(  
                        inputStreamReader);  
                String line = null;  
                while ((line = bufferedReader.readLine()) != null) {  
                    wifiConf.append(line);  
                }  
                bufferedReader.close();  
                inputStreamReader.close();  
                process.waitFor();  
            } catch (Exception e) {  
                throw e;  
            } finally {  
                try {  
                    if (dataOutputStream != null) {  
                        dataOutputStream.close();  
                    }  
                    if (dataInputStream != null) {  
                        dataInputStream.close();  
                    }  
                    process.destroy();  
                } catch (Exception e) {  
                    throw e;  
                }  
            }     
          
              
            Pattern network = Pattern.compile("network=\\{([^\\}]+)\\}", Pattern.DOTALL);  
            Matcher networkMatcher = network.matcher(wifiConf.toString() );  
            while (networkMatcher.find() ) {  
                String networkBlock = networkMatcher.group();  
                Pattern ssid = Pattern.compile("ssid=\"([^\"]+)\"");  
                Matcher ssidMatcher = ssid.matcher(networkBlock);  
                  
                if (ssidMatcher.find() ) {     
                    UserWifiInfo wifiInfo=new UserWifiInfo();  
                    wifiInfo.Ssid=ssidMatcher.group(1);  
                    Pattern psk = Pattern.compile("psk=\"([^\"]+)\"");  
                    Matcher pskMatcher = psk.matcher(networkBlock);  
                    if (pskMatcher.find() ) {  
                        wifiInfo.Password=pskMatcher.group(1);  
                    } else {  
                        wifiInfo.Password="无密码";  
                    }          
                    wifiInfos.add(wifiInfo);  
                }  
                  
            }  
      
            return wifiInfos;  
        }
        
        private WifiManager mWifiManager = null;   
        private WifiInfo mWifiInfo = null;   
        private List<ScanResult> mWifiList = null;   
        private List<WifiConfiguration> mWifiConfiguration = null;   
        private WifiLock mWifiLock = null; 
    }

    使用到wifi的各种功能。记得添加对应地权限:

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
        </uses-permission>


    2、给定指定内容生成二维码,扫描二维码解析出当中搭载的信息:

    本文使用到了开源二维码项目zxing,关于zxing的很多其它介绍请參看:二维码、条形码扫描——使用Google ZXing

    (1)将指定内容生成二维码的方法例如以下:

    @SuppressWarnings("deprecation")
    	private void generate( String result ){
    		if( TextUtils.isEmpty( result ) ){
    			return;
    		}
    		
    		try{
                //推断result合法性
                if (result == null || "".equals(result) || result.length() < 1){
                    return;
                }
                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(result, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
                int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
                //以下这里依照二维码的算法,逐个生成二维码的图片。
                //两个for循环是图片横列扫描的结果
                for (int y = 0; y < QR_HEIGHT; y++){
                    for (int x = 0; x < QR_WIDTH; x++){
                        if (bitMatrix.get(x, y)){
                            pixels[y * QR_WIDTH + x] = 0xff000000;
                        }else{
                            pixels[y * QR_WIDTH + x] = 0xffffffff;
                        }
                    }
                }
                //生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
                //显示到一个ImageView上面
                mResultImg.setBackground( new BitmapDrawable( bitmap ) );
                
                decodeBitmap( bitmap );
            }catch (WriterException e) {
                e.printStackTrace();
            }
    	}
    	
    	private String decodeBitmap( Bitmap bitmap ){
    		MultiFormatReader multiFormatReader = new MultiFormatReader();
    		// 解码的參数
    		Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(2);
    		// 能够解析的编码类型
    		Vector<BarcodeFormat> decodeFormats = new Vector<BarcodeFormat>();
    		if (decodeFormats == null || decodeFormats.isEmpty()) {
    			decodeFormats = new Vector<BarcodeFormat>();
    
    			// 这里设置可扫描的类型,我这里选择了都支持
    			decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
    			decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
    			decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
    		}
    		hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
    
    		// 设置继续的字符编码格式为UTF8
    		// hints.put(DecodeHintType.CHARACTER_SET, "UTF8");
    
    		// 设置解析配置參数
    		multiFormatReader.setHints(hints);
    
    		// 開始对图像资源解码
    		try {
    			Result rawResult = multiFormatReader.decodeWithState(new BinaryBitmap(new HybridBinarizer( new com.uperone.zxing.decoding.BitmapLuminanceSource(bitmap))));
    			mDecodeReslutTxt.setText(new StringBuilder().append("包含内容:")
    					.append(rawResult.getText()).append("\n编码方式:")
    					.append(rawResult.getBarcodeFormat()).toString());
    		} catch (NotFoundException e) {
    			e.printStackTrace();
    		}
    	    
    		return null;
    	}


    (2)解析出二维码中搭载的内容方法例如以下:

    /**
       * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
       * reuse the same reader objects from one decode to the next.
       *
       * @param data   The YUV preview frame.
       * @param width  The width of the preview frame.
       * @param height The height of the preview frame.
       */
      private void decode(byte[] data, int width, int height) {
        long start = System.currentTimeMillis();
        Result rawResult = null;
        PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        try {
          rawResult = multiFormatReader.decodeWithState(bitmap);
        } catch (ReaderException re) {
          // continue
        } finally {
          multiFormatReader.reset();
        }
    
        if (rawResult != null) {
          long end = System.currentTimeMillis();
          Log.d(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString());
          Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);
          Bundle bundle = new Bundle();
          bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
          message.setData(bundle);
          //Log.d(TAG, "Sending decode succeeded message...");
          message.sendToTarget();
        } else {
          Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
          message.sendToTarget();
        }
      }

    @Override
      public void handleMessage(Message message) {
        switch (message.what) {
          case R.id.auto_focus:
            //Log.d(TAG, "Got auto-focus message");
            // When one auto focus pass finishes, start another. This is the closest thing to
            // continuous AF. It does seem to hunt a bit, but I'm not sure what else to do.
            if (state == State.PREVIEW) {
              CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
            }
            break;
          case R.id.restart_preview:
            Log.d(TAG, "Got restart preview message");
            restartPreviewAndDecode();
            break;
          case R.id.decode_succeeded:
            Log.d(TAG, "Got decode succeeded message");
            state = State.SUCCESS;
            Bundle bundle = message.getData();
            Bitmap barcode = bundle == null ? null :
                (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
            activity.handleDecode((Result) message.obj, barcode);
            break;
          case R.id.decode_failed:
            // We're decoding as fast as possible, so when one decode fails, start another.
            state = State.PREVIEW;
            CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
            break;
          case R.id.return_scan_result:
            Log.d(TAG, "Got return scan result message");
            activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
            activity.finish();
            break;
          case R.id.launch_product_query:
            Log.d(TAG, "Got product query message");
            String url = (String) message.obj;
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
            activity.startActivity(intent);
            break;
        }
      }

    public void handleDecode(final Result obj, Bitmap barcode){
    		inactivityTimer.onActivity();
    		playBeepSoundAndVibrate();
    		String result = obj.getText();
    		if(!TextUtils.isEmpty( result ) ){
    			System.out.println( "result == " + result );
    			String[] results = result.split( "#" );
    			String user = results[ 0 ];
    			String password = results[ 1 ];
    			int type = Integer.parseInt( results[ 2 ] );
    			WifiAdmin wifiAdmin = new WifiAdmin(this);  
    	        wifiAdmin.openWifi();  
    	        wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(user, password, type));
    	        
    	        Toast.makeText( this, result, Toast.LENGTH_LONG ).show( );
    		}
    	}

    本例在扫描二维码时使用到了相机功能,所以须要加上关于camera的一些权限:

    <uses-permission android:name="android.permission.CAMERA" >
        </uses-permission>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
        </uses-permission>
    
        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
    
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.FLASHLIGHT" />


    关于demo的具体功能和各功能的具体代码可到这里下载demo体验。

    转载于:https://www.cnblogs.com/zfyouxi/p/5165407.html

    展开全文
  • 二维码是搭载信息的一种载体,通过二维码可以传递名片、网址、商品信息等,本文讲到二维码的另外一种妙用:通过二维码实现wifi账号和密码分享。  关于二维码的基础知识,请访问:二维码的生成细节和原理  试想这样...

            二维码是搭载信息的一种载体,通过二维码可以传递名片、网址、商品信息等,本文讲到二维码的另外一种妙用:通过二维码实现wifi账号和密码分享。

            关于二维码的基础知识,请访问:二维码的生成细节和原理

            试想这样一种场景:一伙人去同一餐馆或者在一起开会,有的人之前去过且已经使用过那个场景的wifi账号,所以一去手机就能够直接连上那里的wifi,但有的同学是第一次去,也有连接wifi的需求,这时我们一般是通过别人告知wifi账号和密码然后手动登陆,但问题是有时候已经连上wifi的人也不记得wifi的密码了,本文结合这个需求场景,做了一个wifi账号和密码分享的小demo,前提是双方都需要安装这个app,并且分享wifi的一方需要有root权限(目前是,也可以将分享wifi的客户端作为热点,然后将热点分享给其他人,这个可以自行研究),这样减少了手动输入密码的麻烦。


    本文主要介绍通过二维码实现wifi分享的两个核心功能:

    1、获取本机已经连接上的wifi账号、密码和加密方式;

    2、给定指定内容生成二维码,扫描二维码解析出其中搭载的信息。


    1、获取本机已经连接上的wifi账号、密码和加密方式:

    所有的事情都可以通过下面这个类搞定:

    public class WifiAdmin {
        public WifiAdmin(Context context) {   
            mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);   
            mWifiInfo = mWifiManager.getConnectionInfo();   
        }   
       
        // 打开WIFI    
        public void openWifi() {   
            if (!mWifiManager.isWifiEnabled()) {   
                mWifiManager.setWifiEnabled(true);   
            }   
        }   
       
        // 关闭WIFI    
        public void closeWifi() {   
            if (mWifiManager.isWifiEnabled()) {   
                mWifiManager.setWifiEnabled(false);   
            }   
        }   
       
        // 检查当前WIFI状态    
        public int checkState() {   
            return mWifiManager.getWifiState();   
        }   
       
        // 锁定WifiLock    
        public void acquireWifiLock() {   
            mWifiLock.acquire();   
        }   
       
        // 解锁WifiLock    
        public void releaseWifiLock() {   
            // 判断时候锁定    
            if (mWifiLock.isHeld()) {   
                mWifiLock.acquire();   
            }   
        }   
       
        // 创建一个WifiLock    
        public void creatWifiLock() {   
            mWifiLock = mWifiManager.createWifiLock("Test");   
        }   
       
        // 得到配置好的网络    
        public List<WifiConfiguration> getConfiguration() {   
            return mWifiConfiguration;   
        }   
       
        // 指定配置好的网络进行连接    
        public void connectConfiguration(int index) {   
            // 索引大于配置好的网络索引返回    
            if (index > mWifiConfiguration.size()) {   
                return;   
            }   
            // 连接配置好的指定ID的网络    
            mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,   
                    true);   
        }   
       
        public void startScan() {   
            mWifiManager.startScan();   
            // 得到扫描结果    
            mWifiList = mWifiManager.getScanResults();   
            // 得到配置好的网络连接    
            mWifiConfiguration = mWifiManager.getConfiguredNetworks();   
        }   
       
        // 得到网络列表    
        public List<ScanResult> getWifiList() {   
            return mWifiList;   
        }   
       
        // 查看扫描结果    
        @SuppressLint("UseValueOf")
    	public StringBuilder lookUpScan() {   
        	StringBuilder stringBuilder = new StringBuilder();   
            for (int i = 0; i < mWifiList.size(); i++) {   
            	stringBuilder.append("Index_" + new Integer(i + 1).toString() + ":");   
                // 将ScanResult信息转换成一个字符串包 其中把包括:BSSID、SSID、capabilities、frequency、level    
                stringBuilder.append((mWifiList.get(i)).toString());   
                stringBuilder.append("/n");   
            }   
            return stringBuilder;   
        }  
       
        // 得到MAC地址    
        public String getMacAddress() {   
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();   
        }   
       
        // 得到接入点的BSSID    
        public String getBSSID() {   
            return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();   
        }   
       
        // 得到IP地址    
        public int getIPAddress() {   
            return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();   
        }   
       
        // 得到连接的ID    
        public int getNetworkId() {   
            return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();   
        }   
        
        // 得到WifiInfo的所有信息包    
        public WifiInfo getWifiInfo() {   
            return mWifiInfo;   
        }
       
        // 添加一个网络并连接    
        public void addNetwork(WifiConfiguration wcg) {   
         int wcgID = mWifiManager.addNetwork(wcg);   
         boolean b =  mWifiManager.enableNetwork(wcgID, true);   
         System.out.println("a--" + wcgID);  
         System.out.println("b--" + b);  
        }   
       
        // 断开指定ID的网络    
        public void disconnectWifi(int netId) {   
            mWifiManager.disableNetwork(netId);   
            mWifiManager.disconnect();   
        }   
       
    	// 然后是一个实际应用方法,只验证过没有密码的情况:
    	// 分为三种情况:1没有密码2用wep加密3用wpa加密
    	public WifiConfiguration CreateWifiInfo(String SSID, String password, int type) {
    		WifiConfiguration config = new WifiConfiguration();
    		config.allowedAuthAlgorithms.clear();
    		config.allowedGroupCiphers.clear();
    		config.allowedKeyManagement.clear();
    		config.allowedPairwiseCiphers.clear();
    		config.allowedProtocols.clear();
    		config.SSID = "\"" + SSID + "\"";
    
    		WifiConfiguration tempConfig = this.IsExsits(SSID);
    		if (tempConfig != null) {
    			mWifiManager.removeNetwork(tempConfig.networkId);
    		}
    
    		if (type == 1) {
    			// WIFICIPHER_NOPASS
    			config.wepKeys[0] = "";
    			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    			config.wepTxKeyIndex = 0;
    		}
    		if (type == 2) {
    			// WIFICIPHER_WEP
    			config.hiddenSSID = true;
    			config.wepKeys[0] = "\"" + password + "\"";
    			config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
    			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
    			config.wepTxKeyIndex = 0;
    		}
    		if (type == 3) {
    			// WIFICIPHER_WPA
    			config.preSharedKey = "\"" + password + "\"";
    			config.hiddenSSID = true;
    			config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
    			config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    			config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    			// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
    			config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
    			config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    			config.status = WifiConfiguration.Status.ENABLED;
    		}
    		
    		return config;
    	} 
          
    	private WifiConfiguration IsExsits(String SSID) {
    		List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
    		if (null == existingConfigs) {
    			return null;
    		}
    		for (WifiConfiguration existingConfig : existingConfigs) {
    			System.out.println("existingConfig == " + existingConfig.toString());
    			if (existingConfig.SSID.equals("\"" + SSID + "\"")) {
    				System.out.println("existingConfig.SSID == " + existingConfig.SSID + " SSID == " + SSID);
    				return existingConfig;
    			}
    		}
    		
    		return null;
    	}
        
        public List<UserWifiInfo> getUserWifiInfoList( ) throws Exception {  
            List<UserWifiInfo> wifiInfos=new ArrayList<UserWifiInfo>();  
          
            Process process = null;  
            DataOutputStream dataOutputStream = null;  
            DataInputStream dataInputStream = null;  
            StringBuffer wifiConf = new StringBuffer();  
            try {  
                process = Runtime.getRuntime().exec("su");  
                dataOutputStream = new DataOutputStream(process.getOutputStream());  
                dataInputStream = new DataInputStream(process.getInputStream());  
                dataOutputStream.writeBytes("cat /data/misc/wifi/*.conf\n");  
                dataOutputStream.writeBytes("exit\n");  
                dataOutputStream.flush();  
                InputStreamReader inputStreamReader = new InputStreamReader(  
                        dataInputStream, "UTF-8");  
                BufferedReader bufferedReader = new BufferedReader(  
                        inputStreamReader);  
                String line = null;  
                while ((line = bufferedReader.readLine()) != null) {  
                    wifiConf.append(line);  
                }  
                bufferedReader.close();  
                inputStreamReader.close();  
                process.waitFor();  
            } catch (Exception e) {  
                throw e;  
            } finally {  
                try {  
                    if (dataOutputStream != null) {  
                        dataOutputStream.close();  
                    }  
                    if (dataInputStream != null) {  
                        dataInputStream.close();  
                    }  
                    process.destroy();  
                } catch (Exception e) {  
                    throw e;  
                }  
            }     
          
              
            Pattern network = Pattern.compile("network=\\{([^\\}]+)\\}", Pattern.DOTALL);  
            Matcher networkMatcher = network.matcher(wifiConf.toString() );  
            while (networkMatcher.find() ) {  
                String networkBlock = networkMatcher.group();  
                Pattern ssid = Pattern.compile("ssid=\"([^\"]+)\"");  
                Matcher ssidMatcher = ssid.matcher(networkBlock);  
                  
                if (ssidMatcher.find() ) {     
                    UserWifiInfo wifiInfo=new UserWifiInfo();  
                    wifiInfo.Ssid=ssidMatcher.group(1);  
                    Pattern psk = Pattern.compile("psk=\"([^\"]+)\"");  
                    Matcher pskMatcher = psk.matcher(networkBlock);  
                    if (pskMatcher.find() ) {  
                        wifiInfo.Password=pskMatcher.group(1);  
                    } else {  
                        wifiInfo.Password="无密码";  
                    }          
                    wifiInfos.add(wifiInfo);  
                }  
                  
            }  
      
            return wifiInfos;  
        }
        
        private WifiManager mWifiManager = null;   
        private WifiInfo mWifiInfo = null;   
        private List<ScanResult> mWifiList = null;   
        private List<WifiConfiguration> mWifiConfiguration = null;   
        private WifiLock mWifiLock = null; 
    }

    使用到wifi的各种功能,记得增加相应地权限:

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
        </uses-permission>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
        </uses-permission>


    2、给定指定内容生成二维码,扫描二维码解析出其中搭载的信息:

    本文使用到了开源二维码项目zxing,关于zxing的更多介绍请参看:二维码、条形码扫描——使用Google ZXing

    (1)将指定内容生成二维码的方法如下:

    @SuppressWarnings("deprecation")
    	private void generate( String result ){
    		if( TextUtils.isEmpty( result ) ){
    			return;
    		}
    		
    		try{
                //判断result合法性
                if (result == null || "".equals(result) || result.length() < 1){
                    return;
                }
                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(result, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
                int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
                //下面这里按照二维码的算法,逐个生成二维码的图片,
                //两个for循环是图片横列扫描的结果
                for (int y = 0; y < QR_HEIGHT; y++){
                    for (int x = 0; x < QR_WIDTH; x++){
                        if (bitMatrix.get(x, y)){
                            pixels[y * QR_WIDTH + x] = 0xff000000;
                        }else{
                            pixels[y * QR_WIDTH + x] = 0xffffffff;
                        }
                    }
                }
                //生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
                //显示到一个ImageView上面
                mResultImg.setBackground( new BitmapDrawable( bitmap ) );
                
                decodeBitmap( bitmap );
            }catch (WriterException e) {
                e.printStackTrace();
            }
    	}
    	
    	private String decodeBitmap( Bitmap bitmap ){
    		MultiFormatReader multiFormatReader = new MultiFormatReader();
    		// 解码的参数
    		Hashtable<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(2);
    		// 可以解析的编码类型
    		Vector<BarcodeFormat> decodeFormats = new Vector<BarcodeFormat>();
    		if (decodeFormats == null || decodeFormats.isEmpty()) {
    			decodeFormats = new Vector<BarcodeFormat>();
    
    			// 这里设置可扫描的类型,我这里选择了都支持
    			decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);
    			decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
    			decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
    		}
    		hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats);
    
    		// 设置继续的字符编码格式为UTF8
    		// hints.put(DecodeHintType.CHARACTER_SET, "UTF8");
    
    		// 设置解析配置参数
    		multiFormatReader.setHints(hints);
    
    		// 开始对图像资源解码
    		try {
    			Result rawResult = multiFormatReader.decodeWithState(new BinaryBitmap(new HybridBinarizer( new com.uperone.zxing.decoding.BitmapLuminanceSource(bitmap))));
    			mDecodeReslutTxt.setText(new StringBuilder().append("包括内容:")
    					.append(rawResult.getText()).append("\n编码方式:")
    					.append(rawResult.getBarcodeFormat()).toString());
    		} catch (NotFoundException e) {
    			e.printStackTrace();
    		}
    	    
    		return null;
    	}


    (2)解析出二维码中搭载的内容方法如下:

    /**
       * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
       * reuse the same reader objects from one decode to the next.
       *
       * @param data   The YUV preview frame.
       * @param width  The width of the preview frame.
       * @param height The height of the preview frame.
       */
      private void decode(byte[] data, int width, int height) {
        long start = System.currentTimeMillis();
        Result rawResult = null;
        PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        try {
          rawResult = multiFormatReader.decodeWithState(bitmap);
        } catch (ReaderException re) {
          // continue
        } finally {
          multiFormatReader.reset();
        }
    
        if (rawResult != null) {
          long end = System.currentTimeMillis();
          Log.d(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString());
          Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);
          Bundle bundle = new Bundle();
          bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
          message.setData(bundle);
          //Log.d(TAG, "Sending decode succeeded message...");
          message.sendToTarget();
        } else {
          Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
          message.sendToTarget();
        }
      }

    @Override
      public void handleMessage(Message message) {
        switch (message.what) {
          case R.id.auto_focus:
            //Log.d(TAG, "Got auto-focus message");
            // When one auto focus pass finishes, start another. This is the closest thing to
            // continuous AF. It does seem to hunt a bit, but I'm not sure what else to do.
            if (state == State.PREVIEW) {
              CameraManager.get().requestAutoFocus(this, R.id.auto_focus);
            }
            break;
          case R.id.restart_preview:
            Log.d(TAG, "Got restart preview message");
            restartPreviewAndDecode();
            break;
          case R.id.decode_succeeded:
            Log.d(TAG, "Got decode succeeded message");
            state = State.SUCCESS;
            Bundle bundle = message.getData();
            Bitmap barcode = bundle == null ? null :
                (Bitmap) bundle.getParcelable(DecodeThread.BARCODE_BITMAP);
            activity.handleDecode((Result) message.obj, barcode);
            break;
          case R.id.decode_failed:
            // We're decoding as fast as possible, so when one decode fails, start another.
            state = State.PREVIEW;
            CameraManager.get().requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
            break;
          case R.id.return_scan_result:
            Log.d(TAG, "Got return scan result message");
            activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
            activity.finish();
            break;
          case R.id.launch_product_query:
            Log.d(TAG, "Got product query message");
            String url = (String) message.obj;
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
            activity.startActivity(intent);
            break;
        }
      }

    public void handleDecode(final Result obj, Bitmap barcode){
    		inactivityTimer.onActivity();
    		playBeepSoundAndVibrate();
    		String result = obj.getText();
    		if(!TextUtils.isEmpty( result ) ){
    			System.out.println( "result == " + result );
    			String[] results = result.split( "#" );
    			String user = results[ 0 ];
    			String password = results[ 1 ];
    			int type = Integer.parseInt( results[ 2 ] );
    			WifiAdmin wifiAdmin = new WifiAdmin(this);  
    	        wifiAdmin.openWifi();  
    	        wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo(user, password, type));
    	        
    	        Toast.makeText( this, result, Toast.LENGTH_LONG ).show( );
    		}
    	}

    本例在扫描二维码时使用到了相机功能,所以需要加上关于camera的一些权限:

    <uses-permission android:name="android.permission.CAMERA" >
        </uses-permission>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
        </uses-permission>
    
        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
    
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.FLASHLIGHT" />


    关于demo的详细功能和各功能的详细代码可到这里下载demo体验。

    展开全文
  • 1.通过WiFi分享二维码密码的方法现在大多数的安卓手机系统都支持分享WiFi的二维码,只要把分享的二维码识别下,就可以看到WiFi的账号和密码了。雷锋哥以小米手机为例:选择你要获取的密码的WiFi,点击分享密码,就会...
  • 本教程将分享一个方法,可以将wifi信息生成一个二维码,只要扫描这个二维码就可以加入wifi,这样就省去了记忆和输入的麻烦。 这个方法基于Python的第三方库wifi_qrcode,wifi_qrcode的安装方法如下: $ pip install ...
  • 图片生成二维码最好的工具

    千次阅读 2020-08-25 17:04:04
    二维码如何大行其道,只需要手机扫描一下就可以使用了的。那么如何把图片生成二维码的呢?...类似 pdf 和 图片之类在线分享...可以选择需要制作的二维码,比如 短信,电话,wifi之类的。当然如果需要分享文档或者图片, 可
  • 出了一款能提供免费wifi的软件,它能使你连... 查看前提: 手机已获得root权限,除小米MIUI系统可以用WiFi二维码分享功能免Root获得密码外,其他品牌手机/系统均需要Root权限。  权限获取: 建议先尝试360一键root等
  • python爬虫不止可以批量下载数据,还可以有很多有趣的...网上有很多的二维码自动生成的网页,它可以将文本、名片、wifi分享等等都以二维码的形式生成,只需要用带有识别二维码的app就可以识别,比如手机浏览器一般就...
  • 如:分享WiFi密码、QQ(微信)号、设备码及网址(PS:支付宝扫描二维码的原理就是将订单信息编程一个网址链接放入到二维码中,这样做的好处:如果是支付宝客户端扫描则能够立即支付,如果是其他客户
  • 前言 Python爬虫不仅可以爬取各种各样的...网上有很多的二维码自动生成的网页,它可以将文本、名片、wifi分享等等都以二维码的形式生成,只需要用带有识别二维码的app就可以识别,比如手机浏览器一般就自带app哦!...
  • 1、例如现在很多新款手机可以直接在连接wifi右侧可以生成二维码,其他人扫描复制粘贴密码,即可连接wifi;(老旧机型可能没有这个功能) 2、通过文件管理器(比如re管理器)进入手机系统根目录=》进入data/misc/wifi/=〉...
  • 作者 1 月 20 日消息 我们知道,使用 Android 10 系统用户可以轻松地以二维码的形式分享 WiFi 密码,借助的是 Wi-Fi Easy Connect 协议,虽然这是一种比较简单、安全的分享方式,但仍然存在一些缺点。值得庆幸的是,...
  • python爬虫不止可以批量下载数据,还可以有很多有趣的应用...网上有很多的二维码自动生成的网页,它可以将文本、名片、wifi分享等等都以二维码的形式生成,只需要用带有识别二维码的app就可以识别,比如手机浏览器一...
  • 在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付、网页登录等,本文分享一个Spring Boot生成二维码的例子,这里用到了google的zxing工具类。 主要应用场景如下: 信息获取(名片、地图、WIFI密码、...
  • wifi查看密码显示

    2020-04-29 13:29:17
    第二部点击看到 分享二维码,然后再点击连接上的wifi名称,看到二维码,截图 第三部一直按手机上面wifi的logo 第四部用qq扫描二维码,看到密码显示如下: 微信扫描显示密码如下: ...
  • 此方法利用 wifi钥匙 手机自带wifi分享功能 和百度二维码扫描功能 无需root 工具/原料 WIFI钥匙 百度app 手机自带wifi分享功能 方法/步骤 1.安装wifi钥匙,连接wifi热点 连接成功 后下一步 2.进入手机wifi设置 打开...
  • 用小米查wifi密码

    2017-10-01 22:05:07
    小米wifi分享非常简单,点一下连接的wifi就出现二维码,其他手机再扫下就可以了。 但还是不知道密码... 可以截屏二维码,用微信的扫一扫功能扫刚才的二维码,就能看到WiFi密码了。
  • 如何查看已连接wifi密码

    千次阅读 2019-02-19 14:16:49
    2.点进去发现有一个分享二维码,保存这个二维码页面3  3.打开微信扫一扫这个二维码,会跳出一个页面,S:wifi名称;P:wifi密码 对于电脑端:https://blog.csdn.net/lisenyang/article/details...
  • 截图已连接WIFI信号的分享二维码,然后解析二维码图片就可以直接看到SSID和密码
  • 平时生活中。蹭网的时候,手机wifi通过某钥匙或者别的工具链接上了无线网,通常是手机连上之后,这个密码是不显示的,但是手提电脑或者别的电子设备也想联网... 三:这时候会出现WIFI分享二维码,平常的话直...
  • 你能想象没有WiFi的日子吗?... 一、生成二维码,读取WiFi密码 首先,在“设置”中找到“无线网络”,点击需要查找密码的WiFi。不同的手机可能系统不一样,有的直接点击wifi分享密码 有的则需要点击wifi进入后分...
  • 随着无线WiFi的普及,一个家庭中只要有一个账号,就能实现多人多台设备上网,节省了不少手机流量的开支,尤其是哪些看...最简单 连接wifi,点击,设置,WLAN,点击已连接wifi,点击二维码分享,截屏,微信扫一扫此...
  • 小米手机查看WiFi密码方法(未root)

    千次阅读 2016-06-22 15:29:24
    首先,连接到该WiFi, ...点击分享二维码给朋友,会出现一个二维码页面,截屏。然后来到小米自带的应用,二维码扫描,进入后如图 点击图片,把刚才截屏的图片传进来,即可看到这个WIFI的密码。
  • 1、点击已连接的wifi分享wifi密码,然后把二维码截图下来 2、打开微信的“扫一扫”,选择上面的二维码图片,扫码成功后会显示下图的内容,“P:”后面的就是wifi密码 ...
  • 接着,在下方找到“二维码分享网络”,等生成二维码后,截屏保存。 最后,使用微信的“扫一扫”功能,扫描刚才生成的二维码,就能获取WiFi密码了。 这其实一个方法,还有其它方法。但是这个方法已经...
  • Android 8.0+查看wifi密码

    千次阅读 2019-05-15 17:46:00
    原生ROM,无法像国内的ROM尝试,提供二维码分享之类的功能。 在Android 8.0(Oreo)之前与现在的版本中,wifi密码的信息均存放在/data/misc/wifi文件夹里。 #Android8.0(Oreo)之前版本 /data/m...
  • 有时候用过的wifi密码手机自动保存了,但在想知道wifi密码是多少,相信很多人都不记得了,或者在使用其他人的WiFi时,密码突然忘记了。... 方法一:分享密码二维码查看法(此方法只针对MIUI用户)  这个方法

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

wifi分享二维码