日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Android WiFi二維碼掃碼連接:WIFI串解析與CameraX識(shí)別適配

Android WiFi二維碼掃碼連接:WIFI串解析與CameraX識(shí)別適配 簡(jiǎn)介面向 Android 開(kāi)發(fā)者的「掃描 WiFi 二維碼自動(dòng)連接」實(shí)戰(zhàn)項(xiàng)目聚焦掃碼解析網(wǎng)絡(luò)信息并完成配網(wǎng)的需求適合具備基礎(chǔ)組件與權(quán)限知識(shí)、希望理解 WifiManager 連接流程的開(kāi)發(fā)者參考。壓縮包共 141 個(gè)文件約 2.16MB以 41 個(gè) class、20 個(gè) java 源碼和 13 個(gè) xml 配置為主另含 png 界面素材、jar 依賴(lài)及可運(yùn)行 apk 等兼顧源碼、資源與演示產(chǎn)物。已有 2015 人學(xué)習(xí)下載。內(nèi)容圍繞二維碼掃描、SSID 與密碼及加密類(lèi)型解析、WifiConfiguration 構(gòu)建、addNetwork 與 connect 調(diào)用以及 WiFi 狀態(tài)與修改權(quán)限處理展開(kāi)并涉及連接結(jié)果提示和失敗場(chǎng)景反饋。借助現(xiàn)成工程可對(duì)照理解相機(jī)掃碼、配置保存和自動(dòng)連接鏈路定位權(quán)限申請(qǐng)、網(wǎng)絡(luò)添加與兼容性排錯(cuò)思路。1. 掃一掃就連上二維碼里裝的是什么誰(shuí)在替你完成連接門(mén)店換了路由器墻上那張二維碼得重打客人問(wèn)“掃這個(gè)能連嗎”你說(shuō)能結(jié)果他掃出來(lái)只看到一段WIFI:S:Shop-5G;T:WPA;P:abc12345;;的純文本復(fù)制粘貼到設(shè)置里還提示“密碼錯(cuò)誤”——這是最典型的一次翻車(chē)。掃碼連 WiFi 這件事真正的難點(diǎn)從來(lái)不在“掃碼”而在掃碼之后識(shí)別出的字符串怎么拆、拆出來(lái)的密碼怎么轉(zhuǎn)義還原、不同 Android 版本該走哪套連接 API。多數(shù)“掃了個(gè)寂寞”的案例都是這三步里至少斷了一環(huán)。這篇拆的是一份 Android 端的 WiFi 二維碼掃描自動(dòng)連接實(shí)現(xiàn)。它的能力邊界很清楚相機(jī)取幀識(shí)別二維碼解析出 SSID 和密碼然后按系統(tǒng)版本降級(jí)到WifiConfiguration或升級(jí)到WifiNetworkSpecifier把用戶從“打開(kāi)設(shè)置、找網(wǎng)絡(luò)、輸密碼”里解放出來(lái)。適合誰(shuí)做門(mén)店/會(huì)議室/展臺(tái)的一線開(kāi)發(fā)做設(shè)備配網(wǎng)的工具類(lèi) App 開(kāi)發(fā)以及要給客戶演示“一貼即連”卻總被吐槽連不上的那些人。新手能照著步驟跑通熟手能在這里看到 Android 10 之后那些不寫(xiě)在文檔首頁(yè)的限制。2.WIFI:串拆解六個(gè)字段、一次轉(zhuǎn)義和一段必須自己寫(xiě)的狀態(tài)機(jī)二維碼里那串東西不是隨便定出來(lái)的它有一個(gè)被各家相機(jī) App 和系統(tǒng)設(shè)置共同沿用的約定格式以WIFI:開(kāi)頭后面是一串用分號(hào)分隔的鍵:值對(duì)結(jié)尾再用一個(gè)分號(hào)收掉。看起來(lái)像 key-value實(shí)際上它比 key-value 難纏——因?yàn)橹道锟梢院戏ǖ爻霈F(xiàn)冒號(hào)、分號(hào)、逗號(hào)和雙引號(hào)靠split(;)硬切必然出事。這一章先把格式吃透再寫(xiě)解析器最后反過(guò)來(lái)講生成端最容易踩的轉(zhuǎn)義坑。2.1 六個(gè)字段與一張反斜杠轉(zhuǎn)義表字段名都是單字母最常用的只有四個(gè)鍵含義示例備注T認(rèn)證類(lèi)型WPA/WEP/nopass/SAE/WPA2-EAP省略時(shí)按nopass兜底SSSIDShop-5G中文 SSID 走 UTF-8別用 GBKP密碼abc12345nopass時(shí)不存在該字段H是否隱藏網(wǎng)絡(luò)true不寫(xiě)就是falseE/I/A/PH2企業(yè)級(jí)認(rèn)證相關(guān)PEAP/user/anon/MSCHAPV2個(gè)人場(chǎng)景基本用不到轉(zhuǎn)義規(guī)則只有一條但很多人不寫(xiě)\、;、,、:、這五個(gè)字符出現(xiàn)在值里時(shí)前面必須加一個(gè)反斜杠。比如 SSID 叫Coffee;Bar寫(xiě)成二維碼就是WIFI:S:Coffee\;Bar;T:WPA;P:12345678;;。如果生成端漏了這一步解析端就會(huì)在分號(hào)處截?cái)郤SID 變成Coffee剩下Bar被當(dāng)成一個(gè)沒(méi)有冒號(hào)的野字段丟掉——現(xiàn)象就是“掃出來(lái)連上了但連的是隔壁那個(gè)叫 Coffee 的網(wǎng)絡(luò)”。還有一個(gè)容易忽略的點(diǎn)T的值大小寫(xiě)不敏感但S和P是大小寫(xiě)敏感的密碼里的大寫(xiě)字母不能被任何環(huán)節(jié)規(guī)范化。我見(jiàn)過(guò)一個(gè)實(shí)現(xiàn)為了“容錯(cuò)”把整串轉(zhuǎn)成小寫(xiě)再解析結(jié)果所有含大寫(xiě)字母的密碼全線崩盤(pán)排查了一下午才發(fā)現(xiàn)是lowercase()寫(xiě)在了parse的第一行。2.2 解析器不要用 split寫(xiě)個(gè)四十行的狀態(tài)機(jī)先把最容易翻車(chē)的寫(xiě)法貼出來(lái)不是讓你抄是讓你認(rèn)出來(lái)自己代碼里有沒(méi)有它// 反例看起來(lái)簡(jiǎn)潔實(shí)際把轉(zhuǎn)義吃掉了 val parts raw.substring(5).split(;) val ssid parts.first { it.startsWith(S:) }.substring(2)問(wèn)題有兩個(gè)。第一S:Coffee\;Bar會(huì)被切成S:Coffee\和Bar第二P值里如果出現(xiàn):雖然少見(jiàn)但合法substring(2)之后的處理會(huì)帶上前綴判斷的歧義。正確做法是掃描一遍字符流遇到\就吞掉它并把下一個(gè)字符原樣收進(jìn)當(dāng)前字段遇到;才斷字段。斷完字段后再取第一個(gè)字符當(dāng)鍵、校驗(yàn)第二個(gè)字符是:剩下的一整段做反轉(zhuǎn)義。data class WifiQr( val ssid: String, val password: String?, val type: AuthType, val hidden: Boolean ) enum class AuthType { WPA, WEP, NOPASS, SAE, EAP } object WifiQrParser { private const val PREFIX WIFI: fun parse(raw: String): ResultWifiQr { val text raw.trim() if (!text.startsWith(PREFIX, ignoreCase true)) { return Result.failure(IllegalArgumentException(缺少 WIFI: 前綴)) } val map HashMapChar, String() for (field in splitFields(text.substring(PREFIX.length))) { // 字段形如 S:xxx第一個(gè)字符是鍵第二個(gè)必須是冒號(hào) if (field.length 2 || field[1] ! :) continue map[field[0].uppercaseChar()] unescape(field.substring(2)) } val ssid map[S] if (ssid.isNullOrEmpty()) return Result.failure(IllegalArgumentException(缺少 SSID)) val type when (map[T]?.uppercase()) { null, , NOPASS - AuthType.NOPASS WEP - AuthType.WEP SAE - AuthType.SAE WPA2-EAP, WPA-EAP - AuthType.EAP else - AuthType.WPA } val pwd map[P] if (type ! AuthType.NOPASS pwd.isNullOrEmpty()) { return Result.failure(IllegalArgumentException(加密網(wǎng)絡(luò)缺少密碼)) } return Result.success( WifiQr(ssid, pwd, type, map[H]?.equals(true, true) true) ) } /** 只按未轉(zhuǎn)義的 ; 切分轉(zhuǎn)義序列原樣保留交給 unescape 處理 */ private fun splitFields(body: String): ListString { val out ArrayListString() val sb StringBuilder() var i 0 while (i body.length) { val c body[i] when { c \\ i 1 body.length - { sb.append(c).append(body[i 1]); i 2 } c ; - { out.add(sb.toString()); sb.clear(); i } else - { sb.append(c); i } } } if (sb.isNotEmpty()) out.add(sb.toString()) return out } private fun unescape(s: String): String { val sb StringBuilder(s.length) var i 0 while (i s.length) { if (s[i] \\ i 1 s.length) { sb.append(s[i 1]); i 2 } else { sb.append(s[i]); i } } return sb.toString() } }邏輯上的關(guān)鍵決策是“切分階段不反轉(zhuǎn)義”。如果先 unescape 再 split\;會(huì)退化成;后面的切分就再也分不清哪些分號(hào)是結(jié)構(gòu)分隔、哪些是內(nèi)容。同理取鍵值也不能用indexOf(:)因?yàn)橹道锏?雖然被轉(zhuǎn)義了但已經(jīng)混在字符串里按位置取前兩個(gè)字符才是唯一穩(wěn)的做法。splitFields里遇到\時(shí)同時(shí)把反斜杠和下一個(gè)字符一起塞進(jìn)緩沖區(qū)就是為了讓轉(zhuǎn)義信息多活一會(huì)兒。參數(shù)上只有兩處可調(diào)PREFIX的大小寫(xiě)判斷我用了ignoreCase true因?yàn)榇_實(shí)有生成工具寫(xiě)成wifi:T的映射表里把不認(rèn)識(shí)的值一律兜底為WPA這比報(bào)錯(cuò)友好——很多老路由出的碼T是空的但實(shí)際就是 WPA2。真正該報(bào)錯(cuò)的只有 SSID 缺失和加密網(wǎng)絡(luò)密碼缺失這兩種其余都該容錯(cuò)。2.3 反向生成密碼少一位多半是轉(zhuǎn)義順序?qū)懛戳松啥说目颖冉馕龆烁[蔽因?yàn)樗恰皩?xiě)錯(cuò)了也能出圖只是掃出來(lái)不對(duì)”。最典型的錯(cuò)誤是轉(zhuǎn)義順序必須先把\換成\\再處理其他四個(gè)字符。反過(guò)來(lái)的話你把;變成\;緊接著又把那個(gè)剛加進(jìn)去的\再轉(zhuǎn)義一次變成\\;解析端還原出來(lái)就是\;而不是;。密碼里帶反斜杠的人不多但 SSID 里帶分號(hào)的咖啡店、帶逗號(hào)的餐廳太多了。# 生成端轉(zhuǎn)義順序不能反反斜杠必須第一個(gè)處理 SPECIAL [\\, ;, ,, :, ] def escape(value: str) - str: out value for ch in SPECIAL: out out.replace(ch, \\ ch) return out def build_wifi_qr(ssid: str, password: str , auth: str WPA, hidden: bool False) - str: parts [fT:{auth}, fS:{escape(ssid)}] if auth.upper() ! NOPASS: parts.append(fP:{escape(password)}) if hidden: parts.append(H:true) return WIFI: ;.join(parts) ;;注意SPECIAL里\\排第一這不是隨便排的——str.replace是順序執(zhí)行的先處理反斜杠能保證后續(xù)插入的轉(zhuǎn)義符不會(huì)被二次轉(zhuǎn)義。最后的;;是格式約定每個(gè)字段自帶一個(gè)分號(hào)末尾再補(bǔ)一個(gè)收尾缺了它有些老設(shè)備的解析器會(huì)認(rèn)為串沒(méi)結(jié)束。auth傳nopass時(shí)直接不寫(xiě)P字段而不是寫(xiě)P:空值這兩種在部分系統(tǒng)實(shí)現(xiàn)里行為不同空值可能被當(dāng)成空密碼去嘗試關(guān)聯(lián)結(jié)果是反復(fù)失敗。生成完別急著打印先自己解析一遍做閉環(huán)校驗(yàn)把build_wifi_qr的輸出喂給你 Android 側(cè)那個(gè)parse斷言parse(build(...)).ssid 原 SSID。這條斷言能擋掉八成以上的轉(zhuǎn)義問(wèn)題成本只有五行代碼。3. 掃碼鏈路CameraX 抓幀 ML Kit 出串把識(shí)別率從 60% 拉到 95%二維碼解析再漂亮識(shí)別不出來(lái)等于零。這一段的常見(jiàn)失敗不是“完全掃不到”而是“要舉著手機(jī)對(duì)準(zhǔn)三秒才出結(jié)果”用戶體驗(yàn)上跟壞了沒(méi)區(qū)別。原因是很多人用PreviewView截圖再去解碼或者把ImageAnalysis的分辨率設(shè)成默認(rèn)的 640×480二維碼在畫(huà)面里只占幾十個(gè)像素解碼器自然吃力。3.1 依賴(lài)、權(quán)限與一個(gè)容易漏的 manifest 標(biāo)記依賴(lài)就三塊相機(jī)、分析器、條碼識(shí)別。// build.gradle.kts版本號(hào)以你倉(cāng)庫(kù)里能拉到的最新穩(wěn)定版為準(zhǔn) implementation(androidx.camera:camera-camera2:1.3.4) implementation(androidx.camera:camera-lifecycle:1.3.4) implementation(androidx.camera:camera-view:1.3.4) implementation(com.google.mlkit:barcode-scanning:17.2.0)權(quán)限這塊是 Android 版本差異最集中的地方建議一次性寫(xiě)全靠maxSdkVersion讓系統(tǒng)自己裁剪uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE / uses-permission android:nameandroid.permission.CHANGE_WIFI_STATE / uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE / !-- Android 12 及以下WiFi 相關(guān)操作被視為可推斷位置必須給精確定位 -- uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION android:maxSdkVersion32 / !-- Android 13 起用獨(dú)立權(quán)限聲明 neverForLocation 可免掉定位授權(quán)彈窗 -- uses-permission android:nameandroid.permission.NEARBY_WIFI_DEVICES android:usesPermissionFlagsneverForLocation tools:targetApi33 /neverForLocation這個(gè)標(biāo)記值得單獨(dú)說(shuō)一句。它的語(yǔ)義是“我承諾不用 WiFi 掃描結(jié)果去推斷地理位置”加上之后 Android 13 不會(huì)再要求用戶額外授予定位權(quán)限彈窗從兩次變一次。但代價(jià)是一旦你聲明了它就不能再調(diào)用任何會(huì)被判定為位置推斷的 API比如主動(dòng)掃描周?chē)?AP 列表并上報(bào)。只做“按 SSID 直連”的話完全夠用所以門(mén)店場(chǎng)景我一般都會(huì)加上。反之如果你的 App 還要展示附近可用網(wǎng)絡(luò)列表這個(gè)標(biāo)記就得去掉老老實(shí)實(shí)申請(qǐng)定位。ACCESS_FINE_LOCATION的maxSdkVersion32也不是可選項(xiàng)。Android 12 及以下只要涉及 WiFi 連接系統(tǒng)就要求精確定位權(quán)限給ACCESS_COARSE_LOCATION不夠Android 13 起這個(gè)要求被NEARBY_WIFI_DEVICES接管舊的定位權(quán)限反而變成冗余。兩條并存、靠版本裁剪是唯一不用寫(xiě)版本分支的寫(xiě)法。3.2 用 ImageAnalysis 抓幀別用 Preview 截圖PreviewView的bitmap是給用戶看的經(jīng)過(guò)了縮放和裁切拿去解碼等于自己給自己降分辨率。正確路徑是ImageAnalysis拿到ImageProxy轉(zhuǎn)InputImage直接喂給識(shí)別器。分辨率選擇器我一般顯式設(shè)成 1280×720再高解碼耗時(shí)上去了再低小碼識(shí)別不了。private val cameraExecutor Executors.newSingleThreadExecutor() private var lastRaw: String? null private var lastTime 0L private fun startScanner(lifecycleOwner: LifecycleOwner, previewView: PreviewView) { val analyzer ImageAnalysis.Builder() .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .setResolutionSelector( ResolutionSelector.Builder() .setResolutionStrategy( ResolutionStrategy( Size(1280, 720), ResolutionStrategy.FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER ) ).build() ) .build() val scanner BarcodeScanning.getClient( BarcodeScannerOptions.Builder() .setBarcodeFormats(Barcode.FORMAT_QR_CODE) .build() ) analyzer.setAnalyzer(cameraExecutor) { proxy - val media proxy.image if (media null) { proxy.close(); returnsetAnalyzer } val input InputImage.fromMediaImage(media, proxy.imageInfo.rotationDegrees) scanner.process(input) .addOnSuccessListener { codes - val raw codes.firstOrNull()?.rawValue ?: returnaddOnSuccessListener val now SystemClock.elapsedRealtime() // 同一張碼 2 秒內(nèi)只處理一次避免連續(xù)回調(diào)把連接請(qǐng)求打爆 if (raw lastRaw now - lastTime 2000) returnaddOnSuccessListener lastRaw raw lastTime now onQrDecoded(raw) } .addOnCompleteListener { proxy.close() } } val provider ProcessCameraProvider.getInstance(previewView.context) provider.addListener({ val cameraProvider provider.get() val preview Preview.Builder().build() preview.setSurfaceProvider(previewView.surfaceProvider) cameraProvider.unbindAll() cameraProvider.bindToLifecycle( lifecycleOwner, CameraSelector.DEFAULT_BACK_CAMERA, preview, analyzer ) }, ContextCompat.getMainExecutor(previewView.context)) }幾個(gè)參數(shù)值得掰開(kāi)說(shuō)。STRATEGY_KEEP_ONLY_LATEST是必須的默認(rèn)的KEEP_ONLY_LATEST在識(shí)別器處理不過(guò)來(lái)時(shí)會(huì)積壓幀表現(xiàn)為“畫(huà)面在動(dòng)但結(jié)果延遲兩秒”設(shè)成只保留最新幀后識(shí)別永遠(yuǎn)跟著當(dāng)前畫(huà)面走。FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER表示優(yōu)先挑不低于 720p 的檔位挑不到再往下降比精確匹配穩(wěn)因?yàn)椴煌瑱C(jī)型支持的預(yù)覽尺寸差異很大。proxy.close()的位置是另一個(gè)血淚點(diǎn)。ImageProxy是有數(shù)量上限的緩沖區(qū)你不關(guān)它幾幀之后分析器就再也不回調(diào)了現(xiàn)象是“第一次能掃之后就死了”。上面代碼把它放在addOnCompleteListener里保證成功失敗都會(huì)釋放。lastRaw那個(gè)去重也必要識(shí)別器一秒能回調(diào)十幾次不去重的話連接請(qǐng)求會(huì)被連續(xù)觸發(fā)WifiNetworkSpecifier那邊會(huì)直接拋“已有請(qǐng)求在進(jìn)行中”。3.3 從 Barcode 到 WifiQr中間加一層容錯(cuò)拿到rawValue之后不要直接扔給parse中間隔一層處理更穩(wěn)。真實(shí)場(chǎng)景里二維碼可能是從別的工具導(dǎo)出的前綴寫(xiě)成WIFI:也可能寫(xiě)成wifi:末尾可能少分號(hào)SSID 前后可能帶空格。我一般做三件事trim()去掉首尾空白、大小寫(xiě)不敏感地校驗(yàn)前綴、解析失敗時(shí)用寬松模式再試一次比如把沒(méi)有T字段的直接當(dāng) WPA 處理。private fun onQrDecoded(raw: String) { val result WifiQrParser.parse(raw) if (result.isSuccess) { val qr result.getOrThrow() // 交給下一章的連接分派邏輯 connect(qr) } else { // 明確告訴用戶是哪一步失敗而不是籠統(tǒng)的“二維碼無(wú)效” showError(result.exceptionOrNull()?.message ?: 無(wú)法識(shí)別的二維碼) } }這層的價(jià)值體現(xiàn)在錯(cuò)誤提示上。解析失敗的原因就那么幾種前綴不對(duì)、沒(méi)有 SSID、加密網(wǎng)絡(luò)沒(méi)密碼。把它們分別提示出來(lái)用戶才知道是“掃錯(cuò)碼了”還是“這張碼印壞了”?;\統(tǒng)地報(bào)“二維碼無(wú)效”用戶唯一能做的就是再掃一次然后你收到第二條同樣的日志。4. 連接鏈路Android 10 這道分水嶺兩套 API 與三條權(quán)限鏈到這一步SSID 和密碼都在手上了剩下的看起來(lái)只是“調(diào)個(gè) API”。但 Android 10API 29把舊的WifiManager.addNetwork標(biāo)記為廢棄并收緊了權(quán)限同一個(gè)功能從此分裂成兩條完全不同的實(shí)現(xiàn)路徑。更麻煩的是新路徑還分叉成兩個(gè)語(yǔ)義不同的 APIWifiNetworkSpecifier是臨時(shí)的、應(yīng)用級(jí)的、退到后臺(tái)可能斷WifiNetworkSuggestion是持久的、系統(tǒng)級(jí)的、需要用戶點(diǎn)一次通知同意。選錯(cuò)了不是連不上是“連上了但過(guò)一會(huì)兒自己斷了”這種問(wèn)題最難解釋。4.1 API 29 以下WifiConfiguration 直連注意引號(hào)老路徑繞不開(kāi)WifiConfiguration它的字段賦值有幾個(gè)格式要求寫(xiě)錯(cuò)了addNetwork直接返回 -1。Suppress(DEPRECATION) fun connectLegacy(wifiManager: WifiManager, qr: WifiQr): Boolean { val config WifiConfiguration().apply { // SSID 與密碼必須帶雙引號(hào)包裹這是 WifiConfiguration 的格式要求 SSID \${qr.ssid}\ hiddenSSID qr.hidden when (qr.type) { AuthType.NOPASS - { allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE) } AuthType.WEP - { allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE) allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN) allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED) wepKeys[0] \${qr.password}\ wepTxKeyIndex 0 } else - { allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK) preSharedKey \${qr.password}\ } } } val netId wifiManager.addNetwork(config) if (netId -1) return false wifiManager.disconnect() val enabled wifiManager.enableNetwork(netId, true) return enabled wifiManager.reconnect() }三個(gè)參數(shù)細(xì)節(jié)。第一SSID和preSharedKey的雙引號(hào)是硬性要求少了的話系統(tǒng)會(huì)把它當(dāng)成十六進(jìn)制原始的寫(xiě)法去解析返回 -1 且沒(méi)有任何錯(cuò)誤信息這是最容易卡住新手的地方。第二enableNetwork(netId, true)第二個(gè)參數(shù)是attemptConnect必須傳true傳false只是把網(wǎng)絡(luò)標(biāo)記為可用但不主動(dòng)連。第三先disconnect()再enableNetwork再reconnect()這個(gè)順序不是玄學(xué)某些定制 ROM 上如果不先斷開(kāi)新網(wǎng)絡(luò)會(huì)一直處于“已保存但未連接”的狀態(tài)。還需要注意addNetwork的返回值語(yǔ)義它返回的是系統(tǒng)分配的netId同一個(gè) SSID 且密碼相同的情況下重復(fù)調(diào)用會(huì)返回同一個(gè) ID冪等但密碼變了會(huì)新建一條配置舊的那條還留著。做門(mén)店應(yīng)用的話連上之后我一般會(huì)順手把除當(dāng)前netId之外的舊配置removeNetwork掉否則配置文件越積越多用戶下次手動(dòng)進(jìn)設(shè)置會(huì)看到一堆重名網(wǎng)絡(luò)體驗(yàn)很糟。4.2 API 29 及以上Specifier 管當(dāng)下Suggestion 管長(zhǎng)期新路徑的兩個(gè) API 語(yǔ)義完全不同選錯(cuò)就是線上事故。WifiNetworkSpecifier配合ConnectivityManager.requestNetwork使用特點(diǎn)是會(huì)彈出系統(tǒng)選擇框讓用戶確認(rèn)、連接是應(yīng)用級(jí)的、App 進(jìn)程退到后臺(tái)或銷(xiāo)毀時(shí)網(wǎng)絡(luò)會(huì)被回收、不需要用戶去系統(tǒng)設(shè)置里操作。它適合“掃完碼馬上要用一下”的場(chǎng)景比如掃碼后立刻打開(kāi)一個(gè)局域網(wǎng)配置頁(yè)面。RequiresApi(Build.VERSION_CODES.Q) fun connectWithSpecifier(context: Context, qr: WifiQr) { val specifier WifiNetworkSpecifier.Builder() .setSsid(qr.ssid) .apply { when (qr.type) { AuthType.NOPASS - Unit AuthType.WEP - setWepKey(qr.password!!) AuthType.SAE - setWpa3Passphrase(qr.password!!) else - setWpa2Passphrase(qr.password!!) } } .build() val request NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 關(guān)鍵移除 INTERNET 能力避免系統(tǒng)對(duì)這個(gè)網(wǎng)絡(luò)做連通性校驗(yàn) .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .setNetworkSpecifier(specifier) .build() val cm context.getSystemService(ConnectivityManager::class.java) cm.requestNetwork(request, object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // 需要把業(yè)務(wù)流量綁到這個(gè)網(wǎng)絡(luò)上否則仍走默認(rèn)網(wǎng)絡(luò) cm.bindProcessToNetwork(network) } override fun onUnavailable() { // 用戶點(diǎn)了取消或密碼錯(cuò)誤 } override fun onLost(network: Network) { cm.bindProcessToNetwork(null) } }) }removeCapability(NET_CAPABILITY_INTERNET)這行是整個(gè)方法里最值得抄的一行。加上它系統(tǒng)不會(huì)對(duì)這個(gè) WiFi 做“是否能訪問(wèn)公網(wǎng)”的探測(cè)也就不會(huì)彈出那個(gè)“此網(wǎng)絡(luò)無(wú)法訪問(wèn)互聯(lián)網(wǎng)是否保持連接”的二次確認(rèn)。門(mén)店的 WiFi 很多是內(nèi)網(wǎng)、沒(méi)有外網(wǎng)出口不加這行的話用戶會(huì)被多問(wèn)一次很多人就在這里點(diǎn)了“否”然后反饋“你們這個(gè)掃碼連不上”。bindProcessToNetwork也不能省。requestNetwork只是“建立”了連接你的 App 默認(rèn)流量還是走原來(lái)的網(wǎng)絡(luò)可能是移動(dòng)數(shù)據(jù)。不綁的話你以為連上了 WiFi實(shí)際請(qǐng)求還是從 4G 出去的訪問(wèn)局域網(wǎng) IP 自然全超時(shí)。WifiNetworkSuggestion則是另一套邏輯RequiresApi(Build.VERSION_CODES.Q) fun suggestNetwork(context: Context, qr: WifiQr): Int { val suggestion WifiNetworkSuggestion.Builder() .setSsid(qr.ssid) .apply { when (qr.type) { AuthType.NOPASS - Unit AuthType.SAE - setWpa3Passphrase(qr.password!!) else - setWpa2Passphrase(qr.password!!) } } .setIsHiddenSsid(qr.hidden) .build() return context.getSystemService(WifiManager::class.java) .addNetworkSuggestions(listOf(suggestion)) }它不會(huì)立刻建立連接而是把這張網(wǎng)絡(luò)“推薦”給系統(tǒng)用戶會(huì)在通知欄收到一條“某應(yīng)用想要連接到 xxx”的提示同意之后系統(tǒng)就會(huì)像對(duì)待自己保存的網(wǎng)絡(luò)一樣自動(dòng)連接。返回值是STATUS_NETWORK_SUGGESTIONS_SUCCESS之類(lèi)的狀態(tài)碼注意它只代表“建議已提交”不代表“用戶已同意”真正的連接結(jié)果要靠監(jiān)聽(tīng)ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION廣播。所以選型結(jié)論很清楚掃碼后馬上就要用網(wǎng)絡(luò)配網(wǎng)、局域網(wǎng)控制——用WifiNetworkSpecifier希望用戶下次來(lái)門(mén)店自動(dòng)連上——用WifiNetworkSuggestion。兩個(gè)都要的話就都調(diào)先 specifier 保當(dāng)下再 suggestion 保下次。4.3 權(quán)限與版本分派一張表把分支寫(xiě)清楚運(yùn)行時(shí)權(quán)限的申請(qǐng)順序也有講究。相機(jī)權(quán)限和 WiFi 權(quán)限不要一次性全申請(qǐng)用戶看到連著彈三個(gè)框會(huì)直接拒絕。我的做法是進(jìn)頁(yè)面先要相機(jī)掃到碼之后再要 WiFi 相關(guān)權(quán)限這樣用戶的理解鏈路是連貫的——“我要掃碼” → “掃到了現(xiàn)在要連網(wǎng)”。版本分派寫(xiě)成表更清楚系統(tǒng)版本連接 API必須權(quán)限用戶交互≤ API 28WifiConfigurationenableNetworkCHANGE_WIFI_STATE、ACCESS_FINE_LOCATION無(wú)彈窗直接連API 29–32WifiNetworkSpecifierACCESS_FINE_LOCATION、ACCESS_NETWORK_STATE系統(tǒng)選擇框 可能的“無(wú)互聯(lián)網(wǎng)”確認(rèn)API 29–32WifiNetworkSuggestionACCESS_FINE_LOCATION、CHANGE_WIFI_STATE通知欄同意API 33同上兩者NEARBY_WIFI_DEVICES帶neverForLocation同上分派代碼本身很短但要用Build.VERSION.SDK_INT卡在 29而不是 30 或 31——WifiNetworkSpecifier是 29 引入的卡錯(cuò)版本會(huì)在 Android 10 設(shè)備上走到廢棄分支然后靜默失敗。fun connect(qr: WifiQr) { if (Build.VERSION.SDK_INT Build.VERSION_CODES.Q) { connectWithSpecifier(appContext, qr) // 順手提交一條持久化建議下次進(jìn)店免掃碼 if (qr.password ! null) suggestNetwork(appContext, qr) } else { val wm appContext.getSystemService(WifiManager::class.java) connectLegacy(wm, qr) } }一個(gè)額外提醒WifiNetworkSpecifier在同一時(shí)刻只能有一個(gè)活躍請(qǐng)求。用戶連掃兩張不同的碼第二個(gè)requestNetwork會(huì)拋IllegalStateException。所以調(diào)用前必須先unregisterNetworkCallback掉上一個(gè)或者用一個(gè)布爾量擋住重復(fù)點(diǎn)擊。這個(gè)異常在文檔里寫(xiě)得很輕線上卻是高頻崩潰點(diǎn)。5. 避坑排查五類(lèi)掃描后連不上的現(xiàn)場(chǎng)復(fù)盤(pán)前面四章講的是“應(yīng)該怎么寫(xiě)”這一章講“寫(xiě)完為什么還是不通”。下面五條都是我在真機(jī)上反復(fù)遇到過(guò)的按“現(xiàn)象 → 原因 → 解決”記每條都對(duì)應(yīng)一個(gè)具體的日志特征方便你對(duì)照自己的現(xiàn)場(chǎng)。5.1 現(xiàn)象掃出來(lái)了提示密碼錯(cuò)誤但密碼肉眼看著沒(méi)錯(cuò)原因基本鎖定在轉(zhuǎn)義還原。生成端把;、,、:、轉(zhuǎn)義了解析端卻沒(méi)還原導(dǎo)致傳給系統(tǒng)的密碼里還帶著反斜杠abc\;123被當(dāng)成密碼去認(rèn)證當(dāng)然失敗。還有一種變體解析端做了一次unescape連接層又做了一次\\被還原成\之后又被當(dāng)成轉(zhuǎn)義符吃掉一個(gè)字符密碼少一位。解決在parse返回之前打一條日志把最終password的長(zhǎng)度和hashCode打出來(lái)跟生成端對(duì)比。長(zhǎng)度對(duì)不上就是轉(zhuǎn)義問(wèn)題長(zhǎng)度對(duì)得上但連不上就是加密類(lèi)型判斷錯(cuò)了。我現(xiàn)在的習(xí)慣是parse方法里常駐一行Log.d(WifiQr, ssid${ssid.length} pwdLen${password?.length})不為別的就為了這種時(shí)候不用改代碼重打包。5.2 現(xiàn)象addNetwork一直返回 -1沒(méi)有任何報(bào)錯(cuò)在 API 28 及以下的機(jī)型上addNetwork返回 -1 最常見(jiàn)的原因是 SSID 或密碼沒(méi)加雙引號(hào)。WifiConfiguration.SSID期望的是帶引號(hào)的字面量你直接塞Shop-5G系統(tǒng)會(huì)嘗試按十六進(jìn)制解析解析失敗就返回 -1日志里連個(gè) warning 都沒(méi)有堪稱(chēng)黑匣子。解決SSID \${qr.ssid}\preSharedKey \${qr.password}\兩個(gè)都要。另外檢查allowedKeyManagement有沒(méi)有設(shè)置只填preSharedKey不設(shè)WPA_PSK同樣返回 -1。這兩條占了我早期踩坑記錄的絕大部分。5.3 現(xiàn)象Android 10 上彈窗點(diǎn)了“連接”然后什么也沒(méi)發(fā)生requestNetwork的回調(diào)有三個(gè)onAvailable、onUnavailable、onLost。很多人只處理了onAvailable用戶點(diǎn)取消走onUnavailable代碼里靜默無(wú)聲界面就卡在那里。更隱蔽的一種是onAvailable觸發(fā)了但業(yè)務(wù)請(qǐng)求還是超時(shí)——因?yàn)闆](méi)調(diào)bindProcessToNetwork流量仍然走默認(rèn)網(wǎng)絡(luò)。解決三個(gè)回調(diào)全實(shí)現(xiàn)onUnavailable里給明確提示“已取消或密碼錯(cuò)誤”onAvailable里立刻bindProcessToNetwork(network)onLost里置回null。驗(yàn)證方法是連上之后訪問(wèn)一個(gè)局域網(wǎng)內(nèi)的固定 IP能通才說(shuō)明綁定生效。用公網(wǎng)地址驗(yàn)證是無(wú)效的因?yàn)楣W(wǎng)走哪條路都能通。5.4 現(xiàn)象連著連著網(wǎng)斷了尤其是切到后臺(tái)再回來(lái)WifiNetworkSpecifier建立的連接生命周期綁在發(fā)起請(qǐng)求的進(jìn)程上。App 退到后臺(tái)被系統(tǒng)回收、或者用戶手動(dòng)劃掉網(wǎng)絡(luò)就會(huì)被移除。這不是 bug是設(shè)計(jì)如此。把它當(dāng)“臨時(shí)連接”用沒(méi)問(wèn)題當(dāng)“連上就一直在”用必然翻車(chē)。解決需要長(zhǎng)期保持的場(chǎng)景改用WifiNetworkSuggestion讓系統(tǒng)接管這條網(wǎng)絡(luò)的生命周期。如果兩個(gè)都要就在 specifier 連上之后再提交一次 suggestion用戶同意之后下次就由系統(tǒng)自動(dòng)連不再依賴(lài)你的進(jìn)程。這里有個(gè)細(xì)節(jié)suggestion 提交后用戶沒(méi)點(diǎn)同意的話那條通知會(huì)一直掛著所以提交時(shí)機(jī)最好放在“用戶已經(jīng)成功連上一次”之后轉(zhuǎn)化率會(huì)高很多。5.5 現(xiàn)象部分機(jī)型掃得飛快部分機(jī)型死活掃不出來(lái)同一張碼某廠商 Android 13 的機(jī)器一秒出結(jié)果另一臺(tái) Android 11 的機(jī)器舉十秒都沒(méi)反應(yīng)。原因通常是相機(jī)分辨率協(xié)商失敗——ResolutionSelector請(qǐng)求 1280×720但該機(jī)型不支持這個(gè)預(yù)覽尺寸組合回退到了 640×480二維碼在畫(huà)面里像素太少。另一種可能是該機(jī)型的ImageAnalysis默認(rèn)走了 YUV_420_888 之外的格式InputImage.fromMediaImage轉(zhuǎn)換失敗process一直不回調(diào)。解決ImageAnalysis.Builder().setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888)顯式指定格式兼容性最好。分辨率那邊把回退規(guī)則設(shè)成FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER之外再加一層兜底連續(xù) 5 秒沒(méi)有識(shí)別結(jié)果就主動(dòng)unbindAll后用 1920×1080 重試一次。這個(gè)“重試一次”的邏輯聽(tīng)著土但在中低端機(jī)型上救回過(guò)好幾個(gè)現(xiàn)場(chǎng)。6. 生成端與自檢自己造碼、批量回連把兼容性驗(yàn)證做成流水線真機(jī)兼容性這件事靠手動(dòng)一臺(tái)臺(tái)試是撐不住的。我的做法是把驗(yàn)證拆成兩段先在生成端造一批“故意刁難”的碼再在連接端跑一遍自動(dòng)化回連把兼容性問(wèn)題在發(fā)版前逼出來(lái)。6.1 造一批邊界碼把轉(zhuǎn)義和長(zhǎng)度全覆蓋正常碼誰(shuí)都能過(guò)邊界碼才是照妖鏡。我一般固定造這么一組SSID 含分號(hào)、SSID 含中文、SSID 正好 32 字節(jié)、密碼含反斜杠和雙引號(hào)、密碼 8 位與 63 位各一、無(wú)密碼開(kāi)放網(wǎng)絡(luò)、隱藏網(wǎng)絡(luò)。用第 2 章那個(gè)build_wifi_qr生成再配qrcode庫(kù)出圖。import qrcode from qr_builder import build_wifi_qr # 第 2 章的生成函數(shù) CASES [ (Normal-2G, 12345678, WPA, False), (Coffee;Bar, pa\\ss\word, WPA, False), # 分號(hào)、反斜杠、雙引號(hào)全覆蓋 (中文網(wǎng)絡(luò)-5G, 12345678, WPA, False), (Open-Guest, , nopass, False), (Hidden-Lab, 12345678, WPA, True), (A * 32, 1 * 63, WPA, False), # SSID 與密碼長(zhǎng)度上限 ] for ssid, pwd, auth, hidden in CASES: payload build_wifi_qr(ssid, pwd, auth, hidden) img qrcode.make(payload) img.save(fqr_{abs(hash(ssid)) % 10000}.png) print(payload)跑完先別急著掃碼做一次閉環(huán)校驗(yàn)把每一條payload喂給你 Kotlin 側(cè)的parse可以把解析邏輯抽成一個(gè)純 JVM 模塊跑單元測(cè)試斷言還原出的ssid和password跟輸入完全一致。這一步能擋掉絕大部分轉(zhuǎn)義錯(cuò)誤而且跑一次只要幾百毫秒比真機(jī)試快兩個(gè)數(shù)量級(jí)。6.2 用 adb 把連接結(jié)果撈出來(lái)別靠肉眼看真機(jī)回連的時(shí)候界面提示“連接成功”并不可信因?yàn)閛nAvailable只代表鏈路建立不代表能通信。我會(huì)用幾條命令做交叉驗(yàn)證# 看當(dāng)前連的是哪個(gè) SSID部分機(jī)型需要 root 或調(diào)試版本 adb shell dumpsys wifi | grep -i mWifiInfo | head -n 3 # 看系統(tǒng)里保存的網(wǎng)絡(luò)建議與其狀態(tài) adb shell dumpsys wifi | grep -i -A2 NetworkSuggestion # 確認(rèn)進(jìn)程綁定的網(wǎng)絡(luò)配合 App 內(nèi)日志一起看 adb shell dumpsys connectivity | grep -i Bound to第一條命令的輸出里能找到當(dāng)前SSID:字段跟你要連的那個(gè)比對(duì)。如果顯示的還是舊網(wǎng)絡(luò)說(shuō)明bindProcessToNetwork沒(méi)生效或者連接壓根沒(méi)建立。第二條用來(lái)確認(rèn) suggestion 是否真的被系統(tǒng)接受——addNetworkSuggestions返回成功只代表提交成功系統(tǒng)側(cè)可能因?yàn)橹貜?fù)提交或策略限制而丟棄。6.3 一個(gè)收尾習(xí)慣把“連不上”的日志字段固定下來(lái)排查這類(lèi)問(wèn)題最耗時(shí)間的不是修復(fù)是復(fù)現(xiàn)。所以我現(xiàn)在每接一個(gè) WiFi 相關(guān)需求都會(huì)在連接失敗的分支里固定打這幾個(gè)字段sdkInt、ssid 長(zhǎng)度、password 長(zhǎng)度、authType、走的分支legacy/specifier/suggestion、回調(diào)名onUnavailable/onLost。這幾項(xiàng)加起來(lái)不到一百字節(jié)但基本能把問(wèn)題定位到具體某一步不用再問(wèn)用戶“你手機(jī)什么系統(tǒng)”。吃過(guò)一次虧某批門(mén)店的 Android 11 設(shè)備反饋“掃碼后彈窗閃一下就沒(méi)了”日志里只有一句籠統(tǒng)的失敗。后來(lái)補(bǔ)上分支標(biāo)記才發(fā)現(xiàn)是WifiNetworkSpecifier拋了IllegalStateException——上一個(gè)請(qǐng)求沒(méi)注銷(xiāo)。加了“先unregisterNetworkCallback再發(fā)新請(qǐng)求”之后同類(lèi)問(wèn)題再?zèng)]出現(xiàn)過(guò)。從那以后我每次發(fā)版前都會(huì)強(qiáng)制走一遍這套邊界碼加 adb 交叉驗(yàn)證的流程寧可多花半小時(shí)也不想再在群里被追著問(wèn)“為什么我這臺(tái)連不上”。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产美脚女优尤物在线观看| 欧美精品一二三| 国产一级内射无挡观看| 欧美亚洲中文字幕| 麻豆性爱视频在线播放| 日本丝袜美腿人妻九九| 白嫩国模丰满一二三区| 天天看天天日天天操| 美女诱惑在线一区| 成人网欧美风情| 伊人久久大香线蕉无码| 96久久久久| 中文字幕免费观看| 久久久久久亚洲精品不卡人乳 | 无码人妻精品一区二区三区99不卡| 欧美国产操逼| 精品久久久久久久久久久久| 最新欧洲欧美日本激情网站| 金莲网址| 国产成久久综合片| 神马久久久久久| 亚洲综合 欧美| 97 超碰 人人做 人人爱| 日本网色| 成人美女av| 亚洲国产成人7777| 国产毛片片精品天天看视频| 亚洲欧洲激情卡通另类文学四射小说网站 | 国产污视频麻豆传媒一区二区 | 天天影视之亚洲综合网| 2019天天操天天爽天天拍| 五月丁香六月激情综合| 狠狠狠狠狠狠| 翘臀vidoes| 大香蕉九九| 艹比视频国产精品| 999国产精品999| 神马久久久久久伦理片| 伊人精品久久网站| 中文字幕五月婷婷免费| 国产亚洲性生活视频播放| 一起草三级AV电影在线观看 | 人妻色偷色噜| 69XX一中文字幕人妻91| 啊啊啊啊操死我| 亚洲熟妇白浆无码AV| 四虎视频在线观看| 97 视频在线| 99综合自拍| 大香蕉国产中文自拍| 亚洲情色婷婷五月天| 色欧美天天| 五月天精品| 婷婷五月综合激情| 啊啊啊啊啊啊在线看| 精品超碰中文在线| 禁片 高清 在线观看视频网站| 亚洲午夜AV| 99热免费| 中文字幕一区二区三区蜜臀| 欧美男人亚洲天堂| 欧美特黄视频网站| 日本 色 导航| 色精品极品| 国产农村妇女精品一| 久久久久久波多野吉衣高潮| 91美女视频电影| 大香蕉中文网| 无码高清操逼网址| av天堂手机版追回 | 久热99| 欧美极品少妇交| 四虎影视在线| 久神马| 伊人在线大香蕉视频久久| 曰本特级特黄特色黄色A级网站高清在线免费看| 国产又粗又又黄又猛| 午夜福利久久久噜久噜久久综合 | 亚洲影视第一页| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 欧美性爱综合,免费| 95自拍视频在线观看| 伊人黄色视频免费观看| 97精品国产97久久久久久户外免费| 第四色色综合91| 国产一区二区久久| 精品视频一二三中文| 久热影视| 色婷五月天| 国产精品网站免费| 偷拍盗拍亚洲色图图片| 熟女字幕| 亚洲最大的黄色电影网站。 | 91中出视频| 久久黄片国产一区二区| 国内三级自拍小视频在线观看 | 97日视频| 92性色国产午夜福利在线661| 图片区小说区| 久久久久大香青草精品综合| 97干在线| 超碰成人免费| 91亚洲综合在线| 国产乱伦亚洲| 夜夜高潮夜夜爽高清视频一| 日韩射精| 亚洲激情网一二三四区| 极品少妇久久久| 岛国黄| 91殴美大片| 夜夜高潮夜夜爽夜夜爱爱一区 | 色婷婷aV一区二区三区麻豆综合| 中文字幕无码不卡啪啪| 国产精品美女在线一区| 99国产精品免费| 丝袜AV一区二区三区| 亚洲成人在线高清| 青青欧洲黑| 久久产精品一区二区三区电影| 日欧亚洲二三区大片不卡| 神马福利久草| 日韩亚洲精品一区二区| 中文字幕乱碼在线| 97综合网| 亚州国产精品乱| 中文字幕免费看| 成全在线观看免费观看| 东京热av男人的天堂| 亚洲欧美另类激情小说| 国产亚洲人妻综合日韩 久久| 超碰一区二区| 婷婷AV一区二区三区| 97久久国产亚洲精品超碰热| 精品国产www久久| 我爱搞逼综合网| 国产女人操逼视频| 97超碰免费生活| 欧美乱伦专区| 天天综合有色网| 中国农村熟妇毛片视频| 欧美熟女激情| 成人性爱AV在线免费观看| 欧美亚洲丝袜美女电影| 自拍偷拍第26| 蜜臀av网址| 91动漫操逼视频| 国产超碰欧美| 91女在线观看| 日韩欧美tv一区二区在线观看| 蜜桃视频精品一区二区三区| 亚洲国产一级精品毛一级精品看免费视频| 国产情色第一第二页在线观看| 无码高清国产AV| 无码精品啪啪啪一区二区三区三州| 强奸乱伦大香蕉网| 中文 人妻 制服| 丝袜熟女2P| 四虎国产精品永久在线囯在线| 青青草五月天| 熟女啪啪视频| 亚洲色图尤物视频| 校园春色美腿丝袜 | 久久一区二区三区四区五区| 天天综合精品| 人伦四五区| av天堂影视中文在字幕在线中文| 色色色日本| 超碰97在线中文| 丁香五月天激情网站| 日比av无码| 中文字幕在线观看AV| 天天干天天舔| 久久久青青草| 九九自拍伦理| 夜夜骑天天燥| 色噜噜狠狠色综无码久久合欧美| 亚洲精品一二牛牛| 18禁久久| WWW.加勒比人妻一区不卡.com| 操逼1区| 碰碰97| 久久一本大香蕉| 9色在线| 91丨国产丨白浆秘 洗澡动漫| 91劲爆| 久久综合乱子伦国产免费| 欧美日韩国产三级黄色| 大香蕉欧美| av一区二区三区四区五区久草臀| 欧苏综合色综合| 欧美一级国产一级| 久久系列| 色吊丝 日日骚 清纯唯美| 亚洲综合在线高清| 精品女人999| 亚洲AV秘 精品久久老牛影视| 91五十路| 中文字幕视频二区| 久久久久久久久一区二区三区| 亚洲揄拍网| 毛片17S| 涩五月婷婷| 国产日逼视频| 东京热91| 久久大香蕉97| 蜜臀在线看片| 欧美激色| 51一区二区三区| 日韩电影天堂视频一区二区| 九一屌逼| 亚洲大色堂| 99999精品视频| 精品一区二区啪啪啪| 亚洲天堂无码| 欧美黄色大香蕉一区二区| WWW啪啪的com| 国产美女mm131爽爽爽爽| 日本熟女不卡视频| 欧成人精品一区二区三区| 国产三级中文字幕粉嫩 | 五月天AV资源| 九九九九一区| 欧美不卡五十路| 91爱网| 伊人久久AV诱惑悠悠| 亚洲图片偷拍欧美| 偷拍导航视频网站| 国色综合天| 亚洲se91| 国产无码精品久久久久久| 夜夜骑夜夜操| 日韩在线欧美精品一区二区| 日本黄色精品专区网站| 在线看片国产精品每日更新| 午夜丁香婷婷| 欧亚洲精品有视频| 亚洲美女精品| 劲爆欧美人妖三区91| 超碰97久久国| 亚洲中文sv| 精品人妻一区二区三区不卡断| 0755午夜福利视频| 亚洲精品少妇| 黄页网站免费高清在线观看| 秋霞曰韩R级| 99久久综合| 人人喜人人妻| 超碰伊人在线| 丝袜足交视频| 免费一级性爱久久| 欧美性爱精品一区二区| 啪啪视频mP4| av东京热男人的天堂| 少妇人妻激情四射| 神马午夜久久| 日本操大逼| 91精品久久综合熟女| 热久久这里只有精品| 校园春色之综合网| 91美女高潮| 91处女在线观看| 吖在线不卡一区二区国产剧情 | 人人摸人人干| 熟人人妻少妇精品久久| 91精品久久久久五月天精品| 91亚·色| 日日97| 亚洲熟女乱色一区二区三区| 激情综合五月丁香| 青青欧美| 中文字幕人妻资源在线| 色五月婷婷五月天| 九九九九一级| 91黑丝在线播放| 中文一区在线视频| 夜夜性| 四虎国产精品永久在线囯在线| 免费日韩黄片| 日本高清电影欧美色图| 久久久专区| 91四海无码日韩欧美| 人人人摸人人| 亚洲三级网址久久最新| 性欧美999| 老熟妇一区二区三区…| 欧色综合| 国产9 9在线 | 亚洲| 亚洲激情在线| 美女91av| 九九热久久99精品re| 男人的天堂2019AV| 91处女在线观看| 综合色99| 漂亮人妻被强中文字幕hd| 亚洲精品国产专区在线观看| 久久一区,青青青青草视频在线播放| 久久久九| 五月丁香啪| 精品在线78| 国产a级午夜毛片| 91色综合激情| 亚洲少妇视频| 亚洲性综合9| 久久在肏| 日韩99999色| 亚欧美综合网| 天天做天天爱天天爽| 亚洲97网站| 国产97视频免费观看| 91伊人大香蕉| 女人被男人桶爽视频网站| 好好的日:com久久九九| 久久透逼视频| 亚州熟妇精品| 新婚人妻扶着粗大强行坐下| 亚洲日精品| 日本欧美一区二区三区免费| 天天干2019| 天天影视色香欲综合网小说| 日韩中文字幕宗合在线| 狠狠色婷婷777| 搡老女人老91二区| 97蜜桃综合| 久久久久久久9| 久久久工口| 思思视频免费看网站| 超碰人妻久久人妻中文97| 日韩无码操逼片| 东北操逼| 精品国产一区二区三区av在线资源| 67914在线兔费成人视频| 高清在线偷拍自拍视频| 色色97爱| 亚洲激情天堂网| 中国一级操逼视频| 射丝袜大香蕉| 色五月婷婷五月天| 精品人妻视频入口| 黄久久| 国色天香av| 超碰人人操97碰| 天天超级碰碰碰| 99热这里只有精品8| 女色综合| 国产传媒一区日韩| 国产亚洲精品自在线亚洲情侣| 天天爽天天操啊啊啊| 嗯嗯,啊啊,国产精品| 丰满人妻一区二区三区四区| 热99re69精品8在线播放| 日韩一级二级| 亚洲强奸乱伦影视网| 欧美东京热青青草| 婷婷激情一区二区三区俺也去| 欧美精品99久久久**| 青青久草| 99re99视频在线免费观看| 久久婷婷精品| 日本一区二区不卡精品| 欧美成人免费在线观看| 97欧美色综合| 人妻一区久久二区三区色播| 五月丁香激情综合网| 久久免费99精品久久久久久| 国产久久天堂资源| 天天情欲宗合网| 中文字幕精品丝袜| 夜色五月天| 凸凹视频在线观看| 国产精品亚洲高清在线| 97欧美超碰| 天堂亚洲精品| 免费看国产大AB| 天天综合香 ld视频| 志村玲子视频一区二区| 成人一道本免费视频| 天天躁日日躁狠狠狠躁| 日本不卡二三区| 蜜桃色色网站视频三区| 国产成人网址| 操逼1区| 欧美日韩日产免费网站看| 熟女探花啪啪| 亚欧成人一级片在线播放| 67914在线兔费成人视频| 色欧洲97| 亚洲精品一区二区免费在线观看| 欧美色图偷拍另类| 激情自拍 校园春色| 亚洲欧洲另类| 97操操| 国产精品无码论坛| 亚洲强奸乱伦影视网| 日韩人妻一二三区视频| 亚欧视频在线| 亚欧视频在线| 午夜.DJ高清在线观看免费7| 最新三级网址| 日本一级性爱| 人妻中文在线| 日本精品一区三区| 乱伦熟女区| av国产无码| 激情综合五月| 亚洲最大91网| 亚州再线| 美女大乳久久久久久久女人18| 日韩传媒在线| 乱子伦一区二区三区国产精品| 啊啊啊啊啊啊啊啊啊啊在线观看| 大肉棒导航| 精品欧美日韩在线观看| 超碰色大香蕉| 日本精品五区| 中文字幕人成乱码熟女香港| 国产亚洲精品一区二区三区| 色在线亚洲视频www| 色呦呦国产精品免费看| 国产毛片在线| 91精品无码人妻系列| 日本一级一级一级一级| 丁香六月婷婷久久综合| 青娱乐av在线| 亚洲AV不卡在线观看尤物| 精品成人女人久久| 免费视频97| 国产三级在线现体验区| 大香蕉一线视频| 99色视频| 欧美色日本| 精品日日人妻| 日本精品无码三级网站| 日韩欧美经典在线观看| 九九九综合精品| 涩涩久久精品| 狠狠操狠狠操操| 嗯啊视频免费在线观看| 亚洲综合中文字幕有码| av在线浏览| 亚洲涩图欧美| 人妻色偷色噜| 久久色情| 夜夜操中文字幕| 色色97爱| 一区二区三区免费岛国片| 欧美有码激情视频一区二区三区| 蜜臀av网址| 日韩欧美性吧婷婷乱伦大香蕉| 亚洲人妻中文高清| 人妻天堂综合网| 久久久久9| 酒色综合网| 免费操逼视频下载| 亚洲凸凹超碰成人| 欧美精品二区视频在线| 天天操夜夜操| 欧洲亚洲人妻无码久久三区四区| 色五天伊人| 久久久久久久少妇| AV色女综合| 日本性爱网址| 91男人综合| 欧美人妻精品一区二区| 欧美 亚洲 综合 制服 另类| 人妻偷拍一区二区三区| 91色黑人少妇| 欧洲欧美视频一区二区| 超碰99热中文字幕| 日韩无码三级影院| 天美传媒在线一区| 制度丝袜99| 天美一区在线| 波多野结衣之双飞调教在线播放| 啊好大好舒服| 亚洲一区二区在线观看91| 91狠狠色丁香婷婷综合久久精品| 一本色道久久综合狠狠操| 国产肏逼网站| 久久久久9999妇女| 三级AV入口| 国产精品色哟哟| 国产亚洲精品A在线观看下载| 天天添天天干电影| 中文字幕后石码三区四区| 精品一区二区三区蜜桃臀赵总| 在线观看啊啊啊啊啊| 亚洲啪啪视频一区二区| 精彩久久中文| 成人av影院在线观看| 国产精品91ai| 操逼大黄片| 欧美青青视频| 五月天成人综合| 色图综合| 亚洲少妇激情视频| 欧美在线观看综合国产| 精品69网| 欧美 熟女 日韩| 色久桃花影院在线观看| 久久激情四射婷婷丁香五月天| 能看的AV| 欧美aa一级片| 色约约一区=区三区| av大香蕉网站| 亚洲精品成人激情在线| 日韩无码极品| 国产91丝袜在线播放蜜月| 97色婷婷| 欧美日韩日产免费网站看| 91亚.色| 真实高潮91| 日韩一级片在线看| 欧美爆乳精品一区二区| 啊啊啊啊,啊啊好多水| 欧美三级不卡| 亚洲黄色网址视频| TS人妖另类精品视频系列| 亚洲无限观看| 亚洲无套久久嗯嗯| 色五月婷婷中文字幕| 国产欧美日本亚洲精品| 99热在线只有精品| 91超碰碰在线| 色呦呦、国产精品| 人妻AV在线| 精品人妻av在线播放| 熟女人妻精品一区二区视频 | 精品无码一区二区三区| 台湾大香蕉99热| 性吧在线视频| 国产亚洲禁久一区二区| 日本高清免费一本视频在线观看| 91欧美色| 日日爽熟女| 午夜福利在线合集| 亚洲第一色页夜| 日韩乱码av| 国产自偷自拍一区| 一级久久性爱视频| 蜜桃视频成a人v在线| 国产精品免费久久久久久久久久| 亚洲天天自拍| 后入精品| 97超碰影音| 国产精品动态一区二区三区四四| 使劲用力艹少妇视频一区二区| 久久免费中文字幕在线观看| 色色综合网站| 日本99热| 99综合免费视频| 免费一级毛片在线视频观看| 色色香蕉| 插日本熟女视频| 约操熟妇| 久久精品亚洲成a人天堂| 日韩操啪| 亚洲。日韩。欧美| 精品国产污一区二区三区| 久久麻豆一区二区| 中文字幕老熟妇黄色视频| 亚洲欧美成人在线| 成人短视频在线观看| 丁香九月激情啪| 日韩国产中文字幕| 操人91| 曰韩精品九九无码| 超AV色女| 婷婷丁香一区二区三区| 亚洲日产专区婷婷| 激情久久日韩精品中文字幕麻豆| 另类图片五月天| 深夜激情 | 欧美美女视频| 欧美性xxxxx狂欢| 百度百度日本操逼| 色欲三区| 欧美麻豆成人同性GⅤ在线| 欧美亚洲中文字幕| 99热精品在线观看| 手机不卡视频不卡在线一二三区| 免费网色网站| 欧美日日人人天天| 亚洲久久久久| 亚洲精品无码成人久久久99| 国产激情在线| 综合色图亚洲欧美| 亚洲男人天堂2016| 97色欧洲| 成人免费毛片| 亚洲欧洲综合视频在线| 性欧美另类高清| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲av综合色| 99色在线| 1204金沙人妻懂旧版免费| 熟女熟妇一区二区三区视频| 啊啊啊啊好多水| 免费久久一级毛片大黄| 强奸乱亚洲| 97se综合网| 999色欧美中文字幕| 黑人免费福利视频| 伊人女女资源在线观看| 久久久9视频| 欧美日本不卡| 欧美Ⅴ性爱| 日本韩欧美在线播放a| 黄色大片一区二区密桃丝袜| 亚州九九九精品视频| 欧美中出| 免费AV播放| 亚洲成人妻日韩在线| 校园春色亚洲| av资源在线播放天堂| 久久久国产精品人妻丝袜| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 日本成人A片网站| 东京热男人的天堂网| 自拍亚洲综合| 亚洲码在线中文在线观看| 97综合在线| 熟女精品一区二区在线观看| 亚洲 暴爽 AV人人爽日日碰| 91婷婷| 天天操天天7| 偷拍三区| 亚洲高清内射| 国产精品又黄又猛又粗| 在线观看AV不卡| 黑人精品欧美一区二区蜜桃| 成年人性爱日韩| 久久夜夜夜| 日本国产亚洲一区在线观看| 日韩另类色图| 女优大全 - 91n| 中文字幕在线免费观看视频| 天天综合网~91综合网| 久久久久久69国产一区二区| 青青草视频爽一爽| 在线午夜成人无码视频| 成人五月香网在线| 1240青青草一区二区三区视频天爱| 九九性爱网| 久久久久婷婷精品av电影| 大香蕉一区二区在线观看.| 久插综合| 日韩中文字幕国产| 亚洲www91| 人妻人人操| 久久久久幕乱码| 国产强奸超碰AV| www.人人摸在线视频| 亚洲国产欧美中日韩成人综合视频| 国产精品久久久久久夜夜夜夜| 国模不卡| 天美传媒精品一区二区三区| 午夜欧美女人操逼| 极品少妇久久久| 激情文学网伊人| 97超碰超碰| 亚洲码和欧洲精品激情系列| 中文字幕五月婷婷免费| 极品色电影院| 成人综合久久精品色婷婷| av草草在线电影| 开心五月婷婷激情| 亚洲中文字幕熟女| 97色涩| 无码少妇精品一区二区60岁老人| 91熟女网| 国产久久日韩网站导航| 日韩人妻制服丝袜av| 91碰碰| 熟女人妻av在线资源,黄色的资源| 激情五月天中文字幕色| 美女91在线观看| 无码免费精品高清| 97手机日韩| 97公开久久| 亚洲少妇中文字幕网址| 激情文学88| 夜夜嗨绯色| 在线只有精品| 亚洲国产精品9999在线观看| 欧美淫乱视频| 亚洲欧美另类少妇精品| 国产激情av女片自拍| 欧美人妻制服| 大乔未久88一区| 激情五月激情综合网| 国产最火爆久久国产网站网站| av日韩中文字幕| 青青草吊丝| 欧美综合区| 国产真乱mangent| 校园春色 亚洲| 求求你操操我| 人人摸人人干| 亚洲AV无码AV吞精久久久久| 夜色91| 天天天堂影视日韩亚洲91| 久久精品亚洲婷婷| 日韩黄色电影网站| 色欲av一区二区三区蜜芽| 一区二区无码视频| 日本九九久久99| 日本亚洲vr欧美不卡高清专区| 熟女精品va中文字幕| 高清国产精品福利网站| 亚洲激情深爱文学小说网站| 青青草日本中文字幕 | 在线色资源| 白丝AV网站| Julia在线播放亚洲久久| 天天色,天天干,天天干| 久久这里只有精品9| 福利五区| 亚洲91大片| 97视频在| 伊人97色天使| 夜夜中出国产| 日日日日日| 在线视频日韩欧美国产| 亚洲图片色图欧美另类| 人人操欧美风骚| 九九九999久久久网站| 日本一久是| 欧美久久人妻少妇一区二区| 国产精品小视频一区二区三区| 69人妻精品一区二区绯色| HEYZO高无码国产精品227| 国产人妖的免费的视频| 人妻9117c| 国产高清成人免费视频| 综合久久97| 久久性爱精品一区| 国产对白刺激视频| 欧美中文字幕日韩在线| 中国操逼无码| 操逼逼一区视频| 久久亚洲中文字幕视频| 富女玩鸭子一级毛片| 大学生美女口爆| 东京热一区二区中文字幕| 综合网天天| 精品视频一区二区| 日韩一级久久毛片| 欧美区亚洲区偷拍区 | 超硑97精品| 亚洲色图欧美色图制服丝袜| 青青草黑寡妇男人天堂| 无码人妻丰满熟妇奶水区毛片| 久久综合中文国产| 伦在线97| 另类成人首页一区| 96精品久久久| 大香蕉视频啪啪啪啪| 国产免费内射视频| 18禁看网站一区| www.久久制服糖| 国产精品久久久久亚洲av| 欧美自拍偷拍免费观看| 国产成人网站在线观看| 欧美日韩丝袜 | av天堂电影网| 999久久久免费精品国产牛牛| 少妇高潮流水av免费| 一区二区三区视频国产免费| 睡产熟女乱伦| 一区二区激情国产熟女 | 人人操人人操人人人操| www.久久久久| 精品9999| 欧美韩日精品99综合| 少妇大屁屁| 亚洲**2021在线观看| 最新三级网址| 日韩成人精品中文字幕| 中文字日本乱码| 中文字幕午夜精品久久久| 亚洲人综合19| 色五天伊人| 日日干夜夜干| 亚洲欧洲第二视频在线观看色图| 97亚洲国产| 久久伊人最新网址视频| AV污污污污| 少妇二级| 啊啊啊在线看| 1000部熟女视频在线观看| 免费在线观看国内色片网站网址| 美女露胸露尿口| 国产欧洲精品亚洲午夜拍精品| 欧美熟妇精品黑人巨大91| 九九热久久99精品re| 人人操人人狠狠操| 欧美日动态视频| 在线综合网| 亚洲一本大道中文字幕无码在线| 国产老熟女| 33044男人的天堂深夜备| 国产综合在线视频网站| 99成人| 骚女高跟AV在线| 中文操逼字幕| 久99热| 懂色av中文字幕一区二区三区天美| 欧美黄页| 亚洲天堂久久| 女人天堂网| 手机在线视频国内精品| 99r九九| 亚洲图片另类| 丁香五月色情| 91天天综合在线观看| 亚欧免费| 淫色网综合| 九九AV| 丝袜美腿欧美| 久久有码视频| 一起草精品人妻| 亚洲色图 图片| 91亚洲色人| 亚洲综合在线高清| 国内一区二区免费| 丰满人妻一区二区三区免费,| 91在线国产后入风骚翘臀美女素人| 啪啪视频亚洲第一| 亚洲第一色页夜| 亚洲欧美一区二区网址| 97色插| 激情五月天中文字幕色| 91狠婷| 国产精品天堂| 日韩99神马视频播放片在线播放| 色噜噜国产精品视频一区二区| 久久久com| 国产农村妇女毛片精品久久| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 亚洲va有码在线天堂| 久久男人网| 91香蕉视频在线观看免费| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 无码精品久久久久久亚洲| 中文字暮97| 精品九九九| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 免费伦费视频在线观看| 99热日| 性爱精品一区| 国内毛片四区| 91 刺激在线| 亚洲无992tv| 日韩中文字幕av在线播放| 国产精品视频91久久| 美女大乳久久久久久久女人18| 一级日本牲交大片好爽在线看| 小草av不卡亚洲二区| 欧美性巨大╳╳╳╳╳高跟鞋| 后入式五六区| 天天色综合图片| a亚洲欧美色欲| 欧美91精彩| 欧美成人黄网色网站| 91bbbbbb| 91色综合色| 97啪啪| 翔田千里爆乳巨臀无码| 少妇内射www在线观看视频| 日韩av在线免费网站| 91热| 欧美色图天堂网m| 亚洲黄色a级片| 亚洲情色 欧美| 射欧美综合| 视频分类 国内精品| 97干在线| 破处bbq| 青娱乐 成人娱乐在线| 久久五十路熟女人妻| 玖色av| 青青草手机在线免费观看| 亚洲Av无码成人精品国产| 国产精品久久久久久久久久久久久久吹 | 影音先锋中文字幕日本好一区二区| 人人妻人人澡人人爽人人精品浪潮| 欧美性,亚州色| 欧美很很操视频| 国产午夜在线观看视频| 精品国产乱码久久久久久免费| 天美国产精品| 女人被添高潮免费视频| 久9re热视频这里只有精品| 91少妇通奸网站| 国产性刺激| 97色色婷婷| 再深点灬舒服灬太大了添视频| 91性网| 欧美高清在线| 极品内射| 啊啊啊啊啊啊啊国| 一区在线国产播放| 国产东北女人在线视频| 国产福利合集| 91日韩网站| 欧亚日韩综合精品国产| 亚洲精品色| 亚洲精品99| 国产美女高潮叫床视频| 第四色奇米影视777| 91天美| 熟妇人妻精品一区二区| 丝袜狂射91| 青春草A| 欧美日韩国产中文精品字幕自在自线,| av片在线观看免费播放| 国产人伦a片信息免费片| 国产1024在线播放| 另类图片天天影视| 后入合集| 九九九偷拍| 亚洲综人| 天天情欲宗合网| 欧美大片天天看| 欧美另类自拍| 97精品视频免费| 欧美综合色站| 久久这里精品国产99丫e6| 中文字幕一区av| 综合熟女| 天天日日夜夜| 99热这里只有精| 久久久久久久人妻| 色五月综合网| 97香蕉碰碰人妻国产欧美| 日韩精品中文字幕一| 再深点灬舒服灬太大了添视频| 俺去啦俺来也久久综合| 免费岛国一级片| 欧美影院一区二区三区| 黄色视频高清无码网站| 男女一进一出视频久久| 一区二区乱码福利| 国产精品久久久久久亚洲色欲| 小说区 图片区色 综合区| 欧美一级A一级a爱片久久| 思思久热在线精品66| 亚洲本色精品一区二区久久| 精品视频在线观看精品| 国产福利一区二| 偷拍三区| 国产精品一区二区 尿失禁| 欧美久久伊人| 色婷婷丁香五月天| 97中文超碰| 天天亚洲综合| 久久久一区二区| 91高清欧美| 亚洲精品久久久久毛片A片拉屎| 免费人成毛片乱码| 亚洲激情综合另类男同| 天天视频黄网站| 色情成人五月天| 人妻插插人妻人| 少妇内射www在线观看视频| 舔舔啊| 外国91| 另类小说综合网| av一区二区三区 中文| 夜夜嗨AV一区天天| 绑缚麻绳人妻寝取完整版| 久久九操在线观看| 国色综合天| 亚欧毛片基地国产毛片基地| 欧美亚洲尤物久久| 婷婷月色| 青青草五月天| 69久久| 自拍偷拍第26| 午夜黄色免费在线观看| A V少妇特黄三级| 伊人久久亚洲中文字幕不卡| 欧美九九九| 免费看片黄| 久久婷婷色| 日本不卡二三区| 欧美丝袜91| 精品国产91av一区二区三区| 操人无码| 亚洲诱惑| 亚洲国产成人精品女人久久久| 盗摄女人妻在线| 国产最新AV| 超碰偷拍| 超碰色男人操熟女| 九九久久九九久久| 97网址97| 精品亚洲成人免费在线| 97人妻碰碰中文无码久热丝袜| 九九九久久久久| 囯产精品久久久久久久久久二区三区| 亚洲天堂中文字| 亚洲欧洲视频小说在线观看| 亚洲男人天堂2| 亚洲精品性爱片| 欧美|91色综合| 性高潮久久久| 再深点灬舒服灬太大了添视频| 日韩天美| 亚洲欧美骚| 亚洲制服欧美另类内射| 操B久久| 无遮挡男女激烈动态图| 丁香婷婷久久 | 百度百度日本操逼| 99操| 玖色av| 日韩欧美中文日韩欧美色| 精品国产91久久久久久一区黄无| 国产熟女无套内射| 毛片电影一区二区三区| 亚洲自拍欧美色综合| 欧洲亚洲国产综合在线| 草b在线 | 色婷婷色99国产综合精品| 久久久禁| 色操逼网| 传媒免费一区二区三区| 激情黄色片在线观看| 免费视频在线观看啊啊啊啊啊| 欧美热图99| 97自拍视频在线| 色路综合| 久久综合九九| 黑人性欧美| 国产毛片精品一区二区色欲黄A片| 色欲久久99精品久久| 国产女人操逼视频| 劲爆欧美人妖三区91| 日韩A优精品在线观看| 超碰中文字幕人妻草一区| 久久av无码| 人妻 制服 日韩 中文 在线| 自拍偷拍第26| 久久久久久91香蕉国产| 国产精品99精品视频网站| 欧美 青青草| 小日子操bb在线看| 97在线观视频免费观看| 天天草夜夜草高潮片| 欧美 亚洲 综合 制服 另类| 国产精品视频麻豆入口| 国产欧美后入| 国产激情在线| 成人国产二区三区在线,男女精品。| 婷婷精品| 人人插人人搞人人操| 欧美日韩亚洲国产中文永久天天看| 岛园激情| 九热久| 久艹伊人精品综合在线| 激情五月天插| 久艹99| 五月激情小说| 精品蜜乳AV免费观看| 亚洲视频二区 | 亚洲中文字幕一区| 五月丁香啪啪网| 狠狠婷婷亚洲中文综合久久| 天天日天天舔东京热| 欧美国产精品| 91痴汉| 中文字幕精品人妻丝袜| 欧美1区二区三区公司| 欧美 综合 亚洲| 五月婷婷激情综合| 五月天婷婷在线看| 欧美 综合 亚洲| 99热| 丰满人妻无码一区二区三区| 丝袜美腿操av| 96AV久久久| 人人摸人人添人人操 | 国产无码一二三区| 美女久久久| 日日骚精品视频| 3571色综合一区二区二区| 亚洲日本激情| 欧美人妖内射| 国产性刺激| 高清在线偷拍自拍视频| 日韩欧美性吧婷婷乱伦大香蕉| 日韩精品大香蕉伊人在线| 欧美夜夜狠| 国产成人亚洲精品无码古代早漏男 | 97色碰| 国产热av| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 中文字幕成人乱码熟女精品国50 | 国产第12页| 久久一区二区蜜桃| 久日综合网| 免费看美国人人爽,人人操 | 久久久久久久| 97丝袜亚洲在线播放| 偷窥自拍亚洲色图| 欧美精品日韩一区二区| 免费观看网黄| 熟妇色99| 性生活性生大爱77AV国产| 亚洲永久AV无码精品秋霞| 色色色综合| 精品亚洲国产成人AV制服丝袜 | 国产性刺激| 日韩人妻精品久久久久| 一区二区三区四区免费视频| 精品日韩人妻精品一二三区| 嗯嗯不要 视频| 久久99深爱久久99精品| 内射黑人| 99国产精品人妻人伦| 亚欧毛片基地国产毛片基地| 成人性爱高清视频免费看| 久久久久97| 视频二区美腿制服人妻欧美| av72网| 亚洲、日韩、综合、另类| 97精品综合| 国产高清无码一区二区三区四区皇冠| 青青青国产手线观看视频2| 超碰97日韩| 欧美淫乱视频| 一区二区亚州激情久婷婷欧美| 老汉网| 最新精品久久蜜桃 | 台湾大香蕉99热| 亚洲精品一区二区三区新线路| 色噜噜狠狠色综无码久久合欧美| 屁屁影院一区二区三区国产| 操迟操逼在巾线Fre看| 久热影视| 偷拍三区| 啪啪啪东京| 懂色av色欲av蜜臀av| 国产精品久久久久久久AV大片| 免费观看网黄| 操逼视频国产无套| 国产黄色在线播放观看| 日韩免费av片高清无码| 成人五月天丁香激情综合| 农村女一级毛卡片| 日语五十路和六十路亚洲国产精品 | 2018天天干在线视频| 国产精品亚洲无码| 亚洲AV无码AV吞精久久久久| www.91逼逼.com| 亚洲最大AV网| 激情四射五月天| 男人的天堂在线有码|