国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成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 開發(fā)者的「掃描 WiFi 二維碼自動(dòng)連接」實(shí)戰(zhàn)項(xiàng)目聚焦掃碼解析網(wǎng)絡(luò)信息并完成配網(wǎng)的需求適合具備基礎(chǔ)組件與權(quán)限知識(shí)、希望理解 WifiManager 連接流程的開發(fā)者參考。壓縮包共 141 個(gè)文件約 2.16MB以 41 個(gè) class、20 個(gè) java 源碼和 13 個(gè) xml 配置為主另含 png 界面素材、jar 依賴及可運(yùn)行 apk 等兼顧源碼、資源與演示產(chǎn)物。已有 2015 人學(xué)習(xí)下載。內(nèi)容圍繞二維碼掃描、SSID 與密碼及加密類型解析、WifiConfiguration 構(gòu)建、addNetwork 與 connect 調(diào)用以及 WiFi 狀態(tài)與修改權(quán)限處理展開并涉及連接結(jié)果提示和失敗場(chǎng)景反饋。借助現(xiàn)成工程可對(duì)照理解相機(jī)掃碼、配置保存和自動(dòng)連接鏈路定位權(quán)限申請(qǐng)、網(wǎng)絡(luò)添加與兼容性排錯(cuò)思路。1. 掃一掃就連上二維碼里裝的是什么誰在替你完成連接門店換了路由器墻上那張二維碼得重打客人問“掃這個(gè)能連嗎”你說能結(jié)果他掃出來只看到一段WIFI:S:Shop-5G;T:WPA;P:abc12345;;的純文本復(fù)制粘貼到設(shè)置里還提示“密碼錯(cuò)誤”——這是最典型的一次翻車。掃碼連 WiFi 這件事真正的難點(diǎn)從來不在“掃碼”而在掃碼之后識(shí)別出的字符串怎么拆、拆出來的密碼怎么轉(zhuǎn)義還原、不同 Android 版本該走哪套連接 API。多數(shù)“掃了個(gè)寂寞”的案例都是這三步里至少斷了一環(huán)。這篇拆的是一份 Android 端的 WiFi 二維碼掃描自動(dòng)連接實(shí)現(xiàn)。它的能力邊界很清楚相機(jī)取幀識(shí)別二維碼解析出 SSID 和密碼然后按系統(tǒng)版本降級(jí)到WifiConfiguration或升級(jí)到WifiNetworkSpecifier把用戶從“打開設(shè)置、找網(wǎng)絡(luò)、輸密碼”里解放出來。適合誰做門店/會(huì)議室/展臺(tái)的一線開發(fā)做設(shè)備配網(wǎng)的工具類 App 開發(fā)以及要給客戶演示“一貼即連”卻總被吐槽連不上的那些人。新手能照著步驟跑通熟手能在這里看到 Android 10 之后那些不寫在文檔首頁(yè)的限制。2.WIFI:串拆解六個(gè)字段、一次轉(zhuǎn)義和一段必須自己寫的狀態(tài)機(jī)二維碼里那串東西不是隨便定出來的它有一個(gè)被各家相機(jī) App 和系統(tǒng)設(shè)置共同沿用的約定格式以WIFI:開頭后面是一串用分號(hào)分隔的鍵:值對(duì)結(jié)尾再用一個(gè)分號(hào)收掉??雌饋硐?key-value實(shí)際上它比 key-value 難纏——因?yàn)橹道锟梢院戏ǖ爻霈F(xiàn)冒號(hào)、分號(hào)、逗號(hào)和雙引號(hào)靠split(;)硬切必然出事。這一章先把格式吃透再寫解析器最后反過來講生成端最容易踩的轉(zhuǎn)義坑。2.1 六個(gè)字段與一張反斜杠轉(zhuǎn)義表字段名都是單字母最常用的只有四個(gè)鍵含義示例備注T認(rèn)證類型WPA/WEP/nopass/SAE/WPA2-EAP省略時(shí)按nopass兜底SSSIDShop-5G中文 SSID 走 UTF-8別用 GBKP密碼abc12345nopass時(shí)不存在該字段H是否隱藏網(wǎng)絡(luò)true不寫就是falseE/I/A/PH2企業(yè)級(jí)認(rèn)證相關(guān)PEAP/user/anon/MSCHAPV2個(gè)人場(chǎng)景基本用不到轉(zhuǎn)義規(guī)則只有一條但很多人不寫\、;、,、:、這五個(gè)字符出現(xiàn)在值里時(shí)前面必須加一個(gè)反斜杠。比如 SSID 叫Coffee;Bar寫成二維碼就是WIFI:S:Coffee\;Bar;T:WPA;P:12345678;;。如果生成端漏了這一步解析端就會(huì)在分號(hào)處截?cái)郤SID 變成Coffee剩下Bar被當(dāng)成一個(gè)沒有冒號(hào)的野字段丟掉——現(xiàn)象就是“掃出來連上了但連的是隔壁那個(gè)叫 Coffee 的網(wǎng)絡(luò)”。還有一個(gè)容易忽略的點(diǎn)T的值大小寫不敏感但S和P是大小寫敏感的密碼里的大寫字母不能被任何環(huán)節(jié)規(guī)范化。我見過一個(gè)實(shí)現(xiàn)為了“容錯(cuò)”把整串轉(zhuǎn)成小寫再解析結(jié)果所有含大寫字母的密碼全線崩盤排查了一下午才發(fā)現(xiàn)是lowercase()寫在了parse的第一行。2.2 解析器不要用 split寫個(gè)四十行的狀態(tài)機(jī)先把最容易翻車的寫法貼出來不是讓你抄是讓你認(rèn)出來自己代碼里有沒有它// 反例看起來簡(jiǎn)潔實(shí)際把轉(zhuǎn)義吃掉了 val parts raw.substring(5).split(;) val ssid parts.first { it.startsWith(S:) }.substring(2)問題有兩個(gè)。第一S:Coffee\;Bar會(huì)被切成S:Coffee\和Bar第二P值里如果出現(xià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的大小寫判斷我用了ignoreCase true因?yàn)榇_實(shí)有生成工具寫成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)樗恰皩戝e(cuò)了也能出圖只是掃出來不對(duì)”。最典型的錯(cuò)誤是轉(zhuǎn)義順序必須先把\換成\\再處理其他四個(gè)字符。反過來的話你把;變成\;緊接著又把那個(gè)剛加進(jìn)去的\再轉(zhuǎn)義一次變成\\;解析端還原出來就是\;而不是;。密碼里帶反斜杠的人不多但 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)為串沒結(jié)束。auth傳nopass時(shí)直接不寫P字段而不是寫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)義問題成本只有五行代碼。3. 掃碼鏈路CameraX 抓幀 ML Kit 出串把識(shí)別率從 60% 拉到 95%二維碼解析再漂亮識(shí)別不出來等于零。這一段的常見失敗不是“完全掃不到”而是“要舉著手機(jī)對(duì)準(zhǔn)三秒才出結(jié)果”用戶體驗(yàn)上跟壞了沒區(qū)別。原因是很多人用PreviewView截圖再去解碼或者把ImageAnalysis的分辨率設(shè)成默認(rèn)的 640×480二維碼在畫面里只占幾十個(gè)像素解碼器自然吃力。3.1 依賴、權(quán)限與一個(gè)容易漏的 manifest 標(biāo)記依賴就三塊相機(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 版本差異最集中的地方建議一次性寫全靠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ú)說一句。它的語義是“我承諾不用 WiFi 掃描結(jié)果去推斷地理位置”加上之后 Android 13 不會(huì)再要求用戶額外授予定位權(quán)限彈窗從兩次變一次。但代價(jià)是一旦你聲明了它就不能再調(diào)用任何會(huì)被判定為位置推斷的 API比如主動(dòng)掃描周圍 AP 列表并上報(bào)。只做“按 SSID 直連”的話完全夠用所以門店場(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)限反而變成冗余。兩條并存、靠版本裁剪是唯一不用寫版本分支的寫法。3.2 用 ImageAnalysis 抓幀別用 Preview 截圖PreviewView的bitmap是給用戶看的經(jīng)過了縮放和裁切拿去解碼等于自己給自己降分辨率。正確路徑是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ù)值得掰開說。STRATEGY_KEEP_ONLY_LATEST是必須的默認(rèn)的KEEP_ONLY_LATEST在識(shí)別器處理不過來時(shí)會(huì)積壓幀表現(xiàn)為“畫面在動(dòng)但結(jié)果延遲兩秒”設(shè)成只保留最新幀后識(shí)別永遠(yuǎn)跟著當(dāng)前畫面走。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)出的前綴寫成WIFI:也可能寫成wifi:末尾可能少分號(hào)SSID 前后可能帶空格。我一般做三件事trim()去掉首尾空白、大小寫不敏感地校驗(yàn)前綴、解析失敗時(shí)用寬松模式再試一次比如把沒有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)的“二維碼無效” showError(result.exceptionOrNull()?.message ?: 無法識(shí)別的二維碼) } }這層的價(jià)值體現(xiàn)在錯(cuò)誤提示上。解析失敗的原因就那么幾種前綴不對(duì)、沒有 SSID、加密網(wǎng)絡(luò)沒密碼。把它們分別提示出來用戶才知道是“掃錯(cuò)碼了”還是“這張碼印壞了”?;\統(tǒng)地報(bào)“二維碼無效”用戶唯一能做的就是再掃一次然后你收到第二條同樣的日志。4. 連接鏈路Android 10 這道分水嶺兩套 API 與三條權(quán)限鏈到這一步SSID 和密碼都在手上了剩下的看起來只是“調(diào)個(gè) API”。但 Android 10API 29把舊的WifiManager.addNetwork標(biāo)記為廢棄并收緊了權(quán)限同一個(gè)功能從此分裂成兩條完全不同的實(shí)現(xiàn)路徑。更麻煩的是新路徑還分叉成兩個(gè)語義不同的 APIWifiNetworkSpecifier是臨時(shí)的、應(yīng)用級(jí)的、退到后臺(tái)可能斷WifiNetworkSuggestion是持久的、系統(tǒng)級(jí)的、需要用戶點(diǎn)一次通知同意。選錯(cuò)了不是連不上是“連上了但過一會(huì)兒自己斷了”這種問題最難解釋。4.1 API 29 以下WifiConfiguration 直連注意引號(hào)老路徑繞不開WifiConfiguration它的字段賦值有幾個(gè)格式要求寫錯(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)制原始的寫法去解析返回 -1 且沒有任何錯(cuò)誤信息這是最容易卡住新手的地方。第二enableNetwork(netId, true)第二個(gè)參數(shù)是attemptConnect必須傳true傳false只是把網(wǎng)絡(luò)標(biāo)記為可用但不主動(dòng)連。第三先disconnect()再enableNetwork再reconnect()這個(gè)順序不是玄學(xué)某些定制 ROM 上如果不先斷開新網(wǎng)絡(luò)會(huì)一直處于“已保存但未連接”的狀態(tài)。還需要注意addNetwork的返回值語義它返回的是系統(tǒng)分配的netId同一個(gè) SSID 且密碼相同的情況下重復(fù)調(diào)用會(huì)返回同一個(gè) ID冪等但密碼變了會(huì)新建一條配置舊的那條還留著。做門店應(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 語義完全不同選錯(cuò)就是線上事故。WifiNetworkSpecifier配合ConnectivityManager.requestNetwork使用特點(diǎn)是會(huì)彈出系統(tǒng)選擇框讓用戶確認(rèn)、連接是應(yīng)用級(jí)的、App 進(jìn)程退到后臺(tái)或銷毀時(shí)網(wǎng)絡(luò)會(huì)被回收、不需要用戶去系統(tǒng)設(shè)置里操作。它適合“掃完碼馬上要用一下”的場(chǎng)景比如掃碼后立刻打開一個(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ǎng)”的探測(cè)也就不會(huì)彈出那個(gè)“此網(wǎng)絡(luò)無法訪問互聯(lián)網(wǎng)是否保持連接”的二次確認(rèn)。門店的 WiFi 很多是內(nèi)網(wǎng)、沒有外網(wǎng)出口不加這行的話用戶會(huì)被多問一次很多人就在這里點(diǎn)了“否”然后反饋“你們這個(gè)掃碼連不上”。bindProcessToNetwork也不能省。requestNetwork只是“建立”了連接你的 App 默認(rèn)流量還是走原來的網(wǎng)絡(luò)可能是移動(dòng)數(shù)據(jù)。不綁的話你以為連上了 WiFi實(shí)際請(qǐng)求還是從 4G 出去的訪問局域網(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之類的狀態(tài)碼注意它只代表“建議已提交”不代表“用戶已同意”真正的連接結(jié)果要靠監(jiān)聽ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION廣播。所以選型結(jié)論很清楚掃碼后馬上就要用網(wǎng)絡(luò)配網(wǎng)、局域網(wǎng)控制——用WifiNetworkSpecifier希望用戶下次來門店自動(dòng)連上——用WifiNetworkSuggestion。兩個(gè)都要的話就都調(diào)先 specifier 保當(dāng)下再 suggestion 保下次。4.3 權(quán)限與版本分派一張表把分支寫清楚運(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)”。版本分派寫成表更清楚系統(tǒng)版本連接 API必須權(quán)限用戶交互≤ API 28WifiConfigurationenableNetworkCHANGE_WIFI_STATE、ACCESS_FINE_LOCATION無彈窗直接連API 29–32WifiNetworkSpecifierACCESS_FINE_LOCATION、ACCESS_NETWORK_STATE系統(tǒng)選擇框 可能的“無互聯(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è)異常在文檔里寫得很輕線上卻是高頻崩潰點(diǎn)。5. 避坑排查五類掃描后連不上的現(xiàn)場(chǎng)復(fù)盤前面四章講的是“應(yīng)該怎么寫”這一章講“寫完為什么還是不通”。下面五條都是我在真機(jī)上反復(fù)遇到過的按“現(xiàn)象 → 原因 → 解決”記每條都對(duì)應(yīng)一個(gè)具體的日志特征方便你對(duì)照自己的現(xiàn)場(chǎng)。5.1 現(xiàn)象掃出來了提示密碼錯(cuò)誤但密碼肉眼看著沒錯(cuò)原因基本鎖定在轉(zhuǎn)義還原。生成端把;、,、:、轉(zhuǎn)義了解析端卻沒還原導(dǎo)致傳給系統(tǒng)的密碼里還帶著反斜杠abc\;123被當(dāng)成密碼去認(rèn)證當(dāng)然失敗。還有一種變體解析端做了一次unescape連接層又做了一次\\被還原成\之后又被當(dāng)成轉(zhuǎn)義符吃掉一個(gè)字符密碼少一位。解決在parse返回之前打一條日志把最終password的長(zhǎng)度和hashCode打出來跟生成端對(duì)比。長(zhǎng)度對(duì)不上就是轉(zhuǎn)義問題長(zhǎng)度對(duì)得上但連不上就是加密類型判斷錯(cuò)了。我現(xiàn)在的習(xí)慣是parse方法里常駐一行Log.d(WifiQr, ssid${ssid.length} pwdLen${password?.length})不為別的就為了這種時(shí)候不用改代碼重打包。5.2 現(xiàn)象addNetwork一直返回 -1沒有任何報(bào)錯(cuò)在 API 28 及以下的機(jī)型上addNetwork返回 -1 最常見的原因是 SSID 或密碼沒加雙引號(hào)。WifiConfiguration.SSID期望的是帶引號(hào)的字面量你直接塞Shop-5G系統(tǒng)會(huì)嘗試按十六進(jìn)制解析解析失敗就返回 -1日志里連個(gè) warning 都沒有堪稱黑匣子。解決SSID \${qr.ssid}\preSharedKey \${qr.password}\兩個(gè)都要。另外檢查allowedKeyManagement有沒有設(shè)置只填preSharedKey不設(shè)WPA_PSK同樣返回 -1。這兩條占了我早期踩坑記錄的絕大部分。5.3 現(xiàn)象Android 10 上彈窗點(diǎn)了“連接”然后什么也沒發(fā)生requestNetwork的回調(diào)有三個(gè)onAvailable、onUnavailable、onLost。很多人只處理了onAvailable用戶點(diǎn)取消走onUnavailable代碼里靜默無聲界面就卡在那里。更隱蔽的一種是onAvailable觸發(fā)了但業(yè)務(wù)請(qǐng)求還是超時(shí)——因?yàn)闆]調(diào)bindProcessToNetwork流量仍然走默認(rèn)網(wǎng)絡(luò)。解決三個(gè)回調(diào)全實(shí)現(xiàn)onUnavailable里給明確提示“已取消或密碼錯(cuò)誤”onAvailable里立刻bindProcessToNetwork(network)onLost里置回null。驗(yàn)證方法是連上之后訪問一個(gè)局域網(wǎng)內(nèi)的固定 IP能通才說明綁定生效。用公網(wǎng)地址驗(yàn)證是無效的因?yàn)楣W(wǎng)走哪條路都能通。5.4 現(xiàn)象連著連著網(wǎng)斷了尤其是切到后臺(tái)再回來WifiNetworkSpecifier建立的連接生命周期綁在發(fā)起請(qǐng)求的進(jìn)程上。App 退到后臺(tái)被系統(tǒng)回收、或者用戶手動(dòng)劃掉網(wǎng)絡(luò)就會(huì)被移除。這不是 bug是設(shè)計(jì)如此。把它當(dāng)“臨時(shí)連接”用沒問題當(dāng)“連上就一直在”用必然翻車。解決需要長(zhǎng)期保持的場(chǎng)景改用WifiNetworkSuggestion讓系統(tǒng)接管這條網(wǎng)絡(luò)的生命周期。如果兩個(gè)都要就在 specifier 連上之后再提交一次 suggestion用戶同意之后下次就由系統(tǒng)自動(dòng)連不再依賴你的進(jìn)程。這里有個(gè)細(xì)節(jié)suggestion 提交后用戶沒點(diǎn)同意的話那條通知會(huì)一直掛著所以提交時(shí)機(jī)最好放在“用戶已經(jīng)成功連上一次”之后轉(zhuǎn)化率會(huì)高很多。5.5 現(xiàn)象部分機(jī)型掃得飛快部分機(jī)型死活掃不出來同一張碼某廠商 Android 13 的機(jī)器一秒出結(jié)果另一臺(tái) Android 11 的機(jī)器舉十秒都沒反應(yīng)。原因通常是相機(jī)分辨率協(xié)商失敗——ResolutionSelector請(qǐng)求 1280×720但該機(jī)型不支持這個(gè)預(yù)覽尺寸組合回退到了 640×480二維碼在畫面里像素太少。另一種可能是該機(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 秒沒有識(shí)別結(jié)果就主動(dòng)unbindAll后用 1920×1080 重試一次。這個(gè)“重試一次”的邏輯聽著土但在中低端機(jī)型上救回過好幾個(gè)現(xiàn)場(chǎng)。6. 生成端與自檢自己造碼、批量回連把兼容性驗(yàn)證做成流水線真機(jī)兼容性這件事靠手動(dòng)一臺(tái)臺(tái)試是撐不住的。我的做法是把驗(yàn)證拆成兩段先在生成端造一批“故意刁難”的碼再在連接端跑一遍自動(dòng)化回連把兼容性問題在發(fā)版前逼出來。6.1 造一批邊界碼把轉(zhuǎn)義和長(zhǎng)度全覆蓋正常碼誰都能過邊界碼才是照妖鏡。我一般固定造這么一組SSID 含分號(hào)、SSID 含中文、SSID 正好 32 字節(jié)、密碼含反斜杠和雙引號(hào)、密碼 8 位與 63 位各一、無密碼開放網(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é)果撈出來別靠肉眼看真機(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ò)說明bindProcessToNetwork沒生效或者連接壓根沒建立。第二條用來確認(rèn) suggestion 是否真的被系統(tǒng)接受——addNetworkSuggestions返回成功只代表提交成功系統(tǒng)側(cè)可能因?yàn)橹貜?fù)提交或策略限制而丟棄。6.3 一個(gè)收尾習(xí)慣把“連不上”的日志字段固定下來排查這類問題最耗時(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)加起來不到一百字節(jié)但基本能把問題定位到具體某一步不用再問用戶“你手機(jī)什么系統(tǒng)”。吃過一次虧某批門店的 Android 11 設(shè)備反饋“掃碼后彈窗閃一下就沒了”日志里只有一句籠統(tǒng)的失敗。后來補(bǔ)上分支標(biāo)記才發(fā)現(xiàn)是WifiNetworkSpecifier拋了IllegalStateException——上一個(gè)請(qǐng)求沒注銷。加了“先unregisterNetworkCallback再發(fā)新請(qǐng)求”之后同類問題再?zèng)]出現(xiàn)過。從那以后我每次發(fā)版前都會(huì)強(qiáng)制走一遍這套邊界碼加 adb 交叉驗(yàn)證的流程寧可多花半小時(shí)也不想再在群里被追著問“為什么我這臺(tái)連不上”。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美日韩天堂| 成人天天爽| 丁香五月综合| 久久精品女同亚洲女同13| 情趣丝袜无码操逼视频| 国产女同视频在线播放| 国模不卡一本二本三电影| 亚洲精品白浆高清久久久久久| 天天透伊人| 色妇综合网| 天天爱天天韩国日本牛牛牛牛 | 日韩操呦呦影院在线观看| 亚洲色图亚洲| 国产一区二区三区不卡手机在线| 韩国手机不卡无码三级视频| 一级性爱视频免费观看| 丁香五月大香蕉| 香蕉国产97| 青娱乐日韩无码| 操人妻视频| 9长久久精品| 99热在线观看| 91春色| 色嘟嘟人妻天堂网| 超碰在线观看av不卡| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 中国一区二区亚洲人妻| 国产精品另类| 欧美亚洲涩涩| 免费网站观看www在线观| 91综合天天看| 美女十八禁| 久久久一区二区三区四区五区| 超碰超碰欧美| 欧美 亚洲 综合 制服| 黄色网址在线免费观看| 青娱乐国产剧情av一区| 淫淫综合网| 婷婷五月天无码 | 五月久久HDAV| 亚洲精品一二牛牛| www久久国产精品| 乱伦熟女论坛| 91P0RNY大屁股人妻| 日韩猛交| 97欧美日韩精品| 在线色资源| 九九九九88| 久久久精品无码亚免费| 久干9操| 国产熟女精品一区二区| 日韩国产中文字幕| 亚洲av性爱电影| 亚洲一区二区三区四区视频| 大香蕉懂9| 日韩久久艹| 精品四五区| 东北黄色电影| 欧美国产操逼| 99999国产精品| 色图综合网| 色网站导航大全| 青青草五月份天| 国产又粗又长又大的视频| 久久激情婷婷| 天天做天天爱夜夜爽毛片试看| 综合网亚洲在线| 亚洲日韩狠狠撸视频| 国产精品午夜福利视频| 亚州男人的天堂| 99久久久无码国产精品性啊聊| 欧美色青| 色色色天美视频| 一区二区娱乐网站| 精品国产一区二区久久| 福利一级版子| 农村少妇久久久久久久| 成人26uuu| 97超碰精品| WWW啪啪的com| 亚洲精品视频二区| 欧美亚洲综合色| 啊好大好舒服| 亚洲好色人妻| 日韩极品无码B| 国产精品久久久久久 百度| 色五月激情网| 国产一级αv免费看片| 99re9在线| 热99这里有精品综合久久| 中文久久96| V A在线| www.亚洲黄色| 操国产高清| 嫩草一区二区在线观看| 久久五月丁香| 天美传媒av 在线| 亚洲老司机123专区| 少妇超碰在线| 影音先锋日本乱伦| 天天综合精品| 宗合情欲网| 欧美AB在线观看| 亚洲中文字幕一区| 在线看片国产精品每日更新| 色狠狠综合噜一二三区| 夜夜 中文视频rt| 欧美色图片| 蜜乳av首页| 久久久久78| 国产精品视频内谢女人| 校园春色之综合网| 欧美黄色手机在线观看| 男人的天堂啪啪| 久久久亚洲熟妇资源| 欧美日韩激情无码专区| 97色碰| 亚洲综合草草| 国产JDAV无码视频在线观看| 欧美日韩亚洲五月天婷婷| 亚洲日韩在线a不卡99精品| 精品夜夜澡人妻无码| 风间由美日韩欧美久久| 久久精品国产亚洲AV片多多| 大香蕉中文网| 日本一本道A级黄色毛片试看60分钟| 欧美97视频| 一级性爱视频免费观看 | 欧美 传媒 麻豆 日韩 偷拍| 3p国产色噜噜一区| 久久亚洲天堂| 无码操逼视频一下| 伊人久久亚洲中文字幕不卡| 五月婷婷激情网| 综合天天。| 强奸乱伦资源| 亚州五月| 精品国产乱码久久久久久久久1| 新怡红院| 亚洲色资源| 亚洲日韩成人性爱视频| 黄骗免费网站| 你草精品在线视频| 久久大香蕉97| 一区二区三区视频| 日本国产欧美一区三区二区| 亚洲色人阁| 女性91网站| 日韩有码免费视频| 操逼片国产| 一区二区日韩欧美久久| 小草av不卡亚洲二区| 欧美色一二三| 亚洲性猛| 伊人网免费视频| 高跟伊人julia ann| 国产中文字幕在线点播| 大香蕉日亚洲日本亚大| 色色色综合网| 国产精品久久久无码AV网站| 97精品网站| 91久久久久久| 国产美女口爆吞精视频| 九九九热精品| 91人人看| 午夜欧美女人操逼| 日韩AV无码中文一区二区| japan日本高清乱xxxx| 黄站在线免费观看| 黄色大片一区二区密桃丝袜| 亚洲人妻中文高清| 国产色产精品在线观看| 欧美激情亚洲情色| 北京专精特新企业招聘信息| 东京热男人的天堂精品| 久草看看看| 少妇69中文| 国产成人自拍视频在线| 亚洲少妇色图自慰直播| 岛国1区2区3区在线观看| 天天天天做夜夜夜夜做| 日本一区二区三区欧美日韩中文字幕| 在线无码操| 校园春色AV天堂| 丝袜综合| 一二三四日本视频高清| 亚洲成人性爱在线观看| 精品黄色电影| 男生女生啊啊啊啊| av天堂影视中文在字幕在线中文| 综合久久六月久久婷婷| 久久中文字幕不卡人妻| 亚洲成人ab| 欧美成人免费在线观看| 国产操伦| 天天上日日上日韩精品| 亚洲牲交| 夜草网站| 丝袜AV一区二区三区| 国产精品高潮久久AV| 五月婷婷六月激情| 色黄色美女大长腿午夜视频| 超碰日本97美女人妻人人玩人人爱| 亚洲国成人情色好看电影| 色婷婷导航| 啪啪视频亚洲第一| 亚洲 小说 欧美 激情 另类| 久草成人| 超碰97久久| 欧美精品宗合| 熟女少妇视频| 日本高清视频在线观看黄已三辽| 丝袜天堂网| 欧美国产有色电影| 日韩美脚一区二区网站| 国产白领连续中出在线观看| 噜噜噜亚洲精| 国产乱伦性爱区| 亚洲全色网| 极品色综合| 91w欧美| 乱伦熟女专区| 日韩欧无码一区二区三区免费不卡| 亚洲棕合电彰| 欧美情色贴图| 成人黄页| 搡老女人老91妇女熟女| 亚洲色资源| 少妇三P| 九九热超碰97亚洲最新香蕉| 亚洲综合图文| 日本一级不卡一二区| 韩国女主播青草在线| 97超碰亚洲| 男人的天堂欧美| 日夜干射色啊| 亚洲色图 综合| 不卡一区视频| 少好三P| 97超碰欧美精品| 男人天堂2030| 久久透逼视频| 久久成人国产| 人人扣人人操| 青青草吊丝| 你操综合| 97超碰超欧美。| 超碰碰小说97| 亚洲欧洲激情卡通另类文学四射小说网站| 欧美综合网A| 小视频国产| 欧美亚洲日本视频久久久| 亚洲成人久久美女| 亚洲AV免费在线观看| 亚洲人妖网| 亚洲无码电影久久久| 天天夜夜rb| 亚州欧美色图| 一本大道不卡一二三区| 99热这里只有精品8| 99激情视频| 亚洲91av| 91精品少妇搡搡搡| 超碰97精品| 久久青青草原免费视频| 丁香五月社区| av大香蕉网站| 久久久555| 性爱乱伦视频免费| 天天综合精品| 中文字幕版| 免费国产| 中国AAAAAA黄色片| 亚洲情色在线| 国产精品女久久久久av爽| 日韩中文字幕二区| 精品十三区| 大香蕉日韩欧美| 性饥渴少妇av无码毛片| www.色综合| 亚州综合AⅤ| 青青伊人加勒比海| 六月丁香久久| 91天天看| 琪琪精品免费一区二区三区| 久久久com| 日韩二区三四区五区六区在线看| 欧美欧美啪啪视频| 六月丁香啪啪| 97超级久久| 97在线精品观看视频| 伊人色综合网电影| 极品出轨视频网站| 久操凹凸视频| 国产精品乱码久久久久久久久久久久| 欧美 亚洲 第一页 | 成人黑料社久久| 欧美国产日韩清纯唯美| 桑老女人九区| 午夜超爽| 成人天天爽| 超清福利精品视频在线| 黄色成品网站| 熟女乱3伦999| 日日夜夜国产综合| 一类无码操逼视频| 97超碰免费生活| 久久无码成人| 欧美青青视频| a v网站在线播放| 麻豆AV96熟妇人妻| 天天摸夜夜添无码小视频| 伊人色综合超碰| 超碰免费人妻在线| 探花在线免费观看视频国产一区| 欧美aⅴ99久久黑人专区| 国内偷拍精品一区二区| 精品欧美日韩在线观看| 一区二区偷拍拍视频| 国产热av| 九九热九九| 一区二区亚州激情久婷婷欧美| 乱操乱伦AV| 九热大香蕉| 欧美亚洲丝袜人妻制服中文99| 色婷婷狠狠18禁| 欧美操逼录像国产黄色国产| 久久熟女人| 激情综合网激情综合| 伊人影院中文字幕| 热99这里有精品综合久久 | 夜夜操美女| 亚州再线| 天天天天天干夜夜夜夜夜操| 日日做夜狠狠爱欧美黑人| 韩日性爱av| 五月天亚洲网| 亚洲精品视频二区| 中文字幕日韩人妻视频| 毛片99-全集电影手机免费观看完整-B029AV| 国产无码久久高清| 蜜桃臀一区二区aV| 超踫中文字幕| 三级激情网站| 欧美日韩97在线| 大香蕉婷婷| 91精品国产91久久福利| 天天激色| 99久久com免费视频′| 少妇一级婬片免费放一级a性色.| 大干人妻| 日韩中文字幕熟妇人妻| 自拍偷拍国产欧美日韩韩| 激情综合网一盗摄| 久操高青| 日本熟女中文| 成年无码动漫av片无尽在线| 精品色色| 日韩精品在线视频在线观看| 久久久久久久国产视频| 欧美激情 亚洲色图| 大香蕉人妻久久| 午夜福利在线视频1000| 人人摸人人干| 国产高清亚洲日韩一区| 丁香五月天久久精品视频一区二区三区| 日本一区视频在线观看| 男人的天堂va| 毛片99-全集电影手机免费观看完整-B029AV| 很很热性爱视频| 国产免费一区2区3区| 国产后入清纯| 亚洲精品天天影视综合网 | 内射日韩大臀美女| 久久伊人青青草| 色哟哟511老熟女| 久久精品亚洲东京热色播| 性色乱AV一区二区| 国产成人综合网| 国产在线激情视频| 操逼天美3区| 亚洲综合91| 学生妹天天看| 中国熟女91| 亚洲黄日韩无码专区| 99爱在线视频| 亚洲色色探花| 日韩图区 偷拍| 手机在线人成免费视频| 97视频在线视频| 日本A级视频| 99精品热| 色av中文字| 欧美久久九九| 天堂蜜桃无码视频一区二区| 一区二区激情国产熟女| 91丨九色丨熟女高潮| 一级特级aaaa毛片免费观看| 台湾成人无码AV| 亚州熟女乱伦| 婷婷色色五月天福利| 成人精品在线免费视频| 日韩欧无码一区二区三区免费不卡| 大香蕉日韩| 91男同| 1024亚洲中文字幕久在线看片你懂的| 素人美腿视频网站| 久久av网| 欧亚日韩三区| 亚洲天堂电影网99999| 蜜臀在线网站| 熟女精品日韩一区二区三区| 天天色欧美| 久久久久久97| 青娱乐福利99| 亚洲免费成人在线高清无码视频 | 中文字幕在线观看网址| 日韩一区二区精彩视频| 国产一区二区三三视频| 女人 A一级| 亚洲中文日韩精品| 亚洲天堂电影精品一区| 欧美天天综| 97精品久久久久中文字幕| 97精品久久久久中文字幕| 九一国产精品| 69精品| 大香蕉黄色一级片免费看| 日韩色| 在线播放一级无码视频| 三级激情网站| 超碰精品在线| 躁躁日曰躁2020| 欧美在线视频播放| 淫荡网址| 综合欧美激情网| 97天天弄| 中文字幕激情小说| 人人干黄色| 婷婷四五区| 日韩无码三级影院| 日本黄 R色 成 人网站| 精品乱子一区二区三区99| 四虎在线观看网站| 国产精品一区二区手机看片| 91free福利| 亚洲AV资源| 大香蕉伊人75| 日韩成人大片一区二区| 欧美亚洲激情小说| 熟妇无码视频三区| 午夜.DJ高清在线观看免费7| 开心五月深爱五月| 风月影院男女十八禁| 欧美色图色综合| 夜夜天天噜狠狠爱2021| 大香蕉免| 97在线亚洲| 日韩免费av片高清无码| 天天看,天天做| 国产精品网站免费| 极品销魂美女一区二区 | 无码人妻精品一区二区三区九九| 久久久青青草| 国产人妖视频一区在线观看| 超碰在线974| 一本色道综合久久欧美日韩精品| 极品色www影院| 天美传媒av一区二区| 蜜臀一区二区三区在线 | 91精品在线播放| 欧美网站免费| 中亚黄色三级大片| 日本性爱视频一级| 六九九九| 嫩草黄页| α√在线| 98超碰日本| 乱伦熟女专区| 97超碰无码网| 久久成年片色大黄全免费网站| 美國A片| 色麻豆AV| 老熟妇一区二区三区…| 粉嫩少妇自慰在线| 亚洲一级黄色毛片| 男人的天堂色偷偷青青草视频婷婷网| 91少妇人妻| 91oumei| 黄页av| 99色热| 99国产精品久久久久久久成人热| 大学生美女口爆| 国产精品一区二区在钱播放| 中文字幕蜜乳av| 欧美成人9797| 久艹免费| 亚洲,欧美,春色,另类| 黄页av| 美女91网| 日本成人免费一区二区三区| 91红杏| 亚欧性爱无码| 97Ai亚洲| 在线欧美69V免费观看视频| 亚洲天堂人妻熟妇视频| 精品人妻一区二区三区夜夜| 国产AV毛片| 婷婷九月丁香| 精品久久久久久亚洲| 搡老女人老熟女91老熟女综合网| 中文字幕艹艹| aaaa少妇高潮大片| 91精品91久久久久77777俄罗斯老妇姓x| 亚洲AV免费在线| 激情综合网激情综合| 情色五月天久久久| 久久精品三级影视| 91被操| 欧美日韩中国x| 九九人人操| 亚洲春色一区二区三区| 2019久久久久久久久福利| 中文字幕在线高清男人的天堂 | 欧美性天天影视| 欧洲黄色网| 天天综合站| 亚洲精品熟妇1区2区3区。| 九月色婷婷| 欧美日韩另类在线播放| 色婷婷日韩精品一区二区三区| 美中韩AV综合网| 国产精品婬乱一级毛片彝族| 91亚洲欧洲| 蜜桃精品一区二区三区久在线| 丁香五月婷婷啪啪| 国产操伦| 人人弄人人摸| 久久久久久久| 久操| 色婷婷婷五月天激情四射| 亚洲日韩一区电影| 中文字幕一二三区| 99热99re超碰精品| 亚码激情| 1240青青草一区二区三区视频天爱| 日韩欧美俄罗斯A片| 欧美日韩国产精品久久色婷婷| 亚洲综合贴图91| 亚洲aw毛茸茸在线| 東南亚性呦成人伦理资源在线视频| 国产情侣自拍在线播放| 婷婷五月激情综合| 亚州综合电影| 国产视频第2页| 人妻黑丝袜电影| 久久久性少妇| 免费自拍三级综合| 午夜精品久久久久| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 熟女突然公开看18禁影片| 国产不良强奸视频免费看| 日韩超碰97| 男人的天堂三级| 亚洲人久久久网| 午夜精品久久久久久久99热影院| 欧美日韩夜夜| 日韩无码嘿咻黑热久| 激情综合五月| www.五月天| 五月天综合网| 国产剧情一区在线观看| 涩五月婷婷| 天天日少妇逼AV| 日韩有码一区三区| 蜜臀久久久久久999| 欧美色棕合| 久久久艹艹艹| 超碰97玖玖爱| 免费观看有码高清视频| 日韩97超碰中文字幕| 国产少妇肉丝在线观看| av优播| 怡红院视频在线| 日韩AV电影网站| julia在线观看久久| 91九色丨国产丨爆乳| 欧美日韩精品国产91| 婷婷丁香一区二区三区| 秋霞福利网| 精品久久久一本一道| 欧美少妇高潮视频| 9久久久久| 青青草在线视频美女| 国产成人五月天丁香花| 黄污污污污| 中日无幕一二三四区| 日韩精品熟妇| 超碰久久网| 日日不卡av| 日韩在线观看三级电影| 亚洲图片色图欧美另类| 欧亚在线视频| 九月丁香婷婷| 亚码激情| 亚洲综合校园春色| 600国产精品视频| 久久69| 在线国产一区二区av| 亚洲综合嫩| 亚洲国产另类在线中文| 久久久久亚洲AV无码专区少妇| 青娱乐国产盛宴视频| 伊人五月天激情| 夜夜爽33333| 天天摸夜夜操视频| 久久啊啊| 人人操人人摸人| 亚洲图片欧美91N| 江都AV在线| 久久精品一区一起草| 久久黄人人爽视频| 国产女人操逼视频| 精品免费1| 女人18精品一区二区三区| 好色综合| 欧美不卡二区| 美女在线H91| 国产精品一区二区麻豆| 欧美亚洲素人制服精品| 日本99热| 日本黄色天堂| 成人无码在线超碰网| 婷婷丁香六月天| 亚洲综合贴图91| 免费a v| 99色婷婷| 天天操天天日天天干| 九九五月天| 另类 日韩 熟女| 夜夜嗷嗷一区二区| 国产精品久久久久久久久久梁医生| 五月天婷婷久久| 欧美在线 亚洲| 日本1区2区不卡视频| 欧美日韩丝袜| 亚洲熟女人妻中文字幕一区二区| 无色无码| 后入式视频国产自| 人人摸.人人色| 久久综合精品一区二区三区| 欧美97在线欧| 色约约一区=区三区| 久久高清欧美国产| 高跟丝袜AV专区国产| 人干人人人操人人摸| 日本免费专区| 久久久久78| 人妻 制服 日韩 中文 在线| 国产1024在线播放| 大香蕉伊利av| 亚洲综合电影| 国产原创精品| 日本一区二区中文字幕久久| 啊啊啊好爽快点啊啊啊嗯嗯| 酒色综合网| 日韩性爱电影一区| 亚洲清纯综合| 91狠狠综合久久久久久| 国产欧美另类久久久精品课程| 一级A啪啪啪啪| 1204人成网站色www| 干婷婷综合网| 久操国产在线| 欧美日韩高潮喷水91| 国产丝袜一区二区三区| 成人av影院在线观看| 色臀av| 99在线免费视频| site:sinbotex.com| 大香蕉伊人久久| 九99久久| 亚洲综合五月天| 高潮精品| 亚洲欧洲第二视频在线观看色图| 色乱二区| 超碰久超碰久| 麻豆久久久久久久久丝袜| 亚洲天堂男人的天堂| 哈哈操电影AV| 夜色五月天| 日韩性爱小视频| 欧日韩在线观看| 亚洲一区在线观看欧洲| 毛片麻豆91糖心精品毛情片| 久久98| 91在线免费精品视频| 好看的久久不射无码影视影院| 超碰成人公开| 国产AV中文| 国产青青美女玩逼视频| 婷婷五月天激情网| 五月婷亚洲精品天堂| 亚洲日本大香蕉1| 美女被啪到深处抽搐视频| 天天综合精品| 偷拍盗拍亚洲色图图片| 九九热超碰97亚洲最新香蕉| 91青青在线视频| 一区二区三区探花在线观看| 蜜桃久久综合视频| 国产一区二区三区久久久精品| 一级片视频啪啪| 欧美日不卡| 久久无码一区二区二三区性色| 欧洲精品在线播放| 欧美美女自慰一区二区三区| 精品人妻久久久久一区二区三区| www国产天美久久久| 91久热| 亚洲美欧999| 大香蕉丝袜一级片| 国产精品内射婷婷一级二| 日韩有码回春沙龙第一页| 日本精品人妻少妇一区二区| 亚洲一区二区三区欧美日韩| 久久东京热久久| 久久久久国产精品人妻aⅴ天堂| 男人的天堂2019AV| 国内毛片国产专区二| 麻豆视频国产一区二区| 成人性生活高清视频在线播放| 天天摸天天舔天天操| 色婷婷aV一区二区三区麻豆综合 | 色999人与兽| 极品白嫩美女白浆成人福利在线看| 亚洲性爱乱操x| 国产AV线| www…国产操逼| 九九RE视频在线精品| 99热精品在线播放| 探花精品视频| 国产久久天堂资源| 夜夜免费视频| 精品人妻一区春色| 亚洲一区二区 麻豆传媒| 亚洲人精品久久久喷水| 亚洲有薄码区日本系列中文字幕| 久久久免费一级黄片| 国产精品久久久久亚洲av| 欧美 色 亚洲| 欧美亚州综合网图片| 欧美激情一| 中文字幕人乱码中文字的预防方法 | 熟女网站最新| 97一本大道亚洲一区| 玖玖97综合 | 吊色| 日骚逼视频| 404操逼福利视频| 在线人成亚洲视频免费观看| 亚州综合色| 东京热大香蕉| 呦呦一区| 一级做a爰片性色毛片久久| 91天天| 天天影视色香欲综合网小说| 成人无码欧美一级A片狼牙直播| 夜夜骑日日| 97超级久久| 老司机福利社视频在线观看| 9 9无尺码天堂网| 啊啊啊啊啊啊啊网址在线观看| 999综合色| 97久久国产精品| 99综合自拍| 天天综合网国产| 偷拍亚洲高清图片| 日韩午夜国产| 中亚黄色三级大片 | 男人天堂网址| 囯产精品久久久久久久久久梁医生 | av绯色| 天天谢天天干| 日韩欧美亚洲一区二区三区影院| 一区二区娱乐网站| 极品极品色影院| 嗯嗯嗯好爽| 久久999久| 骚妻少妇精品性色无码四色A V| 亚洲天堂另类| 成人av影院在线观看| 网页导航五月天免费一二三区| 国产精品老熟女一区二区| 中文字幕版| 欧美极品少妇| 97久久久| 8050无码八戒| 天天摸夜夜摸| 欧美天天影院| 94色色电影网| 无码99| 成人毛片免费| 欧美第一页性| 超碰78| 亚洲AV成人无码一区二区三区在线观看| 久久五月份| 国产后入精品| 人妻人人做人人澡人人爽欧美一区| 国产主播福利| 丁香五月天激情网站| 久妇网| 黑人综合色| 超碰免费人妻人人| 亚洲日本韩国在线| 欧美日动态视频| 久热最新在线杭州| Sekablack无码一区| 天天插天天射| 日本性一区| 91 丝袜在线播放| 神马麻豆福利院| 国产家庭乱伦网址| 日韩 欧美 校园一区| 射久久| 日韩久久激情精品| 台湾大香蕉99热| 亚洲综合97| 久99视频| 亚洲亚洲亚洲天堂天堂| 精品久久久久久AV无码| 老鸭窝亚洲毛片| 日天天九九天堂666| 国产网红精品| 蜜臀久久99精品久久久老,,| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 婷婷色综合欧美日韩| 国产精品岛国片在线观看| 亚洲 欧美 另类 日韩 人妻一区| 久草加勒比一区在线| 久久精品天美| 夜夜操老骚逼视频网站| 久久精品视| 91网亚洲| 家庭乱伦麻豆| 中文字幕精品一区二区精品| 久久久久久久久女黄| 欧美性爱1080p| 超碰综合色| 狠狠中文字幕| 中文字幕第23区| 久久久久久日韩| 蜜臀色乳| 秋霞操逼片| 超碰在线974| 亚洲日韩视频二区| 麻豆AV96熟妇人妻| 欧洲欧美视频一区二区| 精品人妻视频一区二区三区蜜桃视频| 欧美极品美女aaaaaa级黄片| 爱欲AV| 国产中文字幕在线点播| 麻豆天美传媒在线视频天堂| 中国熟妇| 欧美亚洲日本激情在线| 色婷婷A V一二三四区麻豆综合| 天天谢天天干| 欧美精品亚洲精品日韩传电影| 国内自拍 日韩激情 99| 精品超碰色| 江都AV在线| a片 xxxx受爽视频| 性性欧美| 亚洲欧美在线观看无码| 嫩草黄页| 久久99人妖视频国产| 一区二区无码视频| 欧美黑人猛交春色影视大全| 熟女探花啪啪| 97伪v| AV无码久久久精品| 亚洲天堂资源在线| 熟女一区二区| 2019精品国产无码成人| 精品一区二区三区18| 中文字幕美女91| 粉嫩久久久久| 少妇高潮喷水无套久久久久久| 久久精彩免费视频| 一本正道久久熟女| 久久99久久99精品天美传媒棢·纸:. | 亚洲情色欧美| 色色毛片| 精品久久久久久无码| 91老熟妇| 91干熟女| 精品国产久久乱码| 国产白丝AV| 日曰骚久久精品| 日本熟妇人妻中出视频| 欧美少妇高潮| 思思热影视| 精精品人妻一区二区三区| 日本在线一二 | 色色97爱| 欧美夜色| 国内91熟女人妻丝袜天天精品视频在线 | 无码又爽又硬又激情免费视频| 无遮挡又黄又刺激的视频| 丝袜天堂网| 人妻啊啊人妻啊| 亚洲操逼视频网站| 国产成久久综合片| 欧美丝袜中文字幕07在线| 四虎免费看黄| 天堂精品在线| 中文字幕 国产 精品| 亚洲国产精品无码AV久久久| 91大香蕉伊人| 欧色性第一页| 欧美草草高清日韩视频| 男人天堂黄片| 东北黄色电影| 黄色片A级一区二区三区| 欧美 日韩 婷婷 五月| 日韩精品字幕| 97超碰亚洲| 亚洲天堂男人在线| 97人妻人人躁人人玩人人| 欧美亚洲厕所精品偷拍91| 综合熟女| 成人性爱美曰韩| 日韩中文字幕精品一区在线| 欧美综合自拍| 91老司机精品| 国产熟码AV| 强奸熟女一区二区三区| 欧色综合| 国产精品午夜成人福利| 精品久久久av| 综合色图亚洲欧美| 99久久99九九99九九九| 亚洲无码?第一页| 久久啊啊| 综合网亚洲| 淫纸中9区| 碰人碰碰人人开房人肉| 东京热精品97综合网| 六月丁操逼| 人妻人人澡人人爽人人| 7月婷婷综合| 1024香蕉视频| 熟女精品一区二区三区| 五月天激情四射| 色丁香五月婷婷| 久久久九九网站| 国产综合在线视频网站| 高清国产精品无码| 乱伦图一区| 中文字幕欧美丝袜07资源| 久久啊啊| 成年无码动漫av片无尽在线| 18+91网站| 日本 情色 1区| 欧美日韩另类在线播放| 51久久夜色精品国产麻豆| 男女做爰猛烈动高潮A片免费应用| 少妇熟女一区二区三区| 三级色影综合网| 欧美丝袜91| 天天噜| 啪啪视频免费在线观看| 国产成人久久精品蜜臀| yaouchengrenav| 午夜无遮挡男女啪啪视频| 五月天玖玖资源站| 色丁香久久| 99丝袜福利在线播放| 欧美色图天堂网m| 日韩丝袜高跟制服在线观看| 少妇内射视频| 亚洲资源一区| 精品无码久久久久久久久果冻糖心 | www.91理论| 国产女人操逼视频| 能看的AV| 你草精品在线视频| 嗯嗯啊啊的视频| 国产精品农村妇女| 欧美手机在线综合| 97操| 欧亚乱色熟女一区二区| 1956日韩精品| 久草男人天堂| 91美女精品| 亚洲一区在线观看欧洲 | 人人操天天爽| 久久久久久中文| 中文一区二区三区影院| 日日操丁香五月天| 亚洲熟妇自偷自拍另欧美| 久久偷拍人| 蜜桃久久一区| 久久久久久久97| 在线人人人人人人精品超 | 亚洲天堂人人妻| 中文字幕一区二区三区人妻不卡| 欧美一区二区男人天堂| 国产精品69人妻无码久久久| 91操操| 天天综合网久久ww| 东北女人性交| 中文字幕日韩电影人妻| 超碰在线看| 91美女色视频亚洲| 火箭成精品视频884必出精品| 91影库| 99热这里只有精| 久久久久婷婷精品av电影| 中文字幕成人乱码熟女精品国50 | 欧美日不卡| 欧亚揄拍偷拍精品视频| 久久久精品91八戒| 加勒比大香蕉视频在线| 久久香蕉网| 国产97/欧美| 国产精品亚洲高清在线| 成人女人国产| 屁股久久久久久| www欧美性爱| 99re99视频在线免费观看| 欧美日韩亚洲少妇寂寞影院正在播放 | 青青久久手机线视频| 男人的天堂在线2| 大香久久| 九九综合| 国产精品对白自产拍| 激情五月天社区| 亚洲91网站| 久久精品 六十路 熟女 欧美| 婷婷香蕉欧美在线一区二区三区| 一本大道久| 自拍欧美| 加勒比在线视频| 久久久久久少妇| 无码最新| 国产四虎在线| 伊人宅男大香蕉| 国产成人无码网站在线视频| 久久久禁| 国产区性爱在线视频秋霞豆| 午夜精品久久久久| 国产精品一级特黄aaa大片在线观看| 色婷婷综合久久久久中文一区二区| 欧美日韩中文字幕人妻| 一区二区娱乐网站| 青青草依人大香蕉| 色九九九九久| 干少妇视频| 久久免费中文字幕在线观看| 亚洲无码日韩电影| 五月天色图影视| 亚洲色婷婷久久久综合日本| 中文字幕免费看大片| 天美传媒精品一区二区三区| 人人干人人搞人人摸| 97超碰影音| 狠狠操综合| 视频国产欧美在线播放| 日韩超碰精品综合| 国产极品美女高潮无套在线观看| 操老熟女AV| 色优久久| 日日夜夜摸| 九九热在线视频| 国产精品一区二区a| 欧美|91色综合| 日韩欧美亚洲自拍偷拍| 国产高清不卡视频| 亚洲最新a在线观看| 欧美韩国你懂得在线 | 岛国毛片手机在线观看| 很黄很色的视频在线观看| 久久国产精品,久久国产| 亚洲欧洲日本精品中文a∨| 试看福利| 亚洲欧美日韩综合在线尤物| 91色香| 日韩成人午夜精品久久高潮| 最新日韩黄片| 亚洲综合97| 97九色人妻| 国产日韩区| 久久久久久久久久久久黄色 | 天堂资源欧美| 人人人人插| 人妻熟女一区二区三区视频| 电影69乱码96| 国产一级137片内射麻豆| 91在线丝袜| 夜夜一区二区| 麻豆成人影音在线| 欧美78| www.99热| 操逼www.| 啊啊啊想要| 日影院久久婷婷夜夜网| 黄污污污污| 中文字幕久热视频在线| 天天久久| 我中文字幕6区| AV老汉| 婷婷五月天激情网| 太久视频| 欧美18老人禁| 蜜臀久久99精品久久久久久婷婷| 一区| 超碰79人人乐| 强奸国产在线| 国产精品福利视频| 国产91丝袜 在线播放| 青青草精品| 屌逼麻豆| 强奸乱伦动态污图免费| 不卡中文字幕aⅴ在线| 欧美少妇高潮久久91| 人妻少妇久久久| 精品国产久热在线观看| 飘花国产午夜精品不卡| 天天综合-91入口| 天堂av最新电影网| 天天影视色香色欲| 亚洲第一成人影院色播| 成·人免费午夜在线观看| 欧美日韩欧美| 四虎在线免费视频| 乱子伦一区二区三区国产精品| 欧美久久婷| 性感女人网页在线观看视频| 婷婷天堂站| 天天激情干| 国产av激情无码久久天堂| 精品人妻一区二区免费蜜桃视频| 加勒比无码毛片| 偷拍片久久| 97超碰大| 91婷婷伊人狠人| 美国一区二区免费视频| 国产美女裸体秘 永久无遮挡| 97精品综合久久网| 亚洲国产剧情少妇激情| 97婷婷色| 精品一区二区三区蜜桃臀赵总 | 国产亚洲综合欧美一区| 中国探花熟女| 一起草精品人妻| 久久精品亚洲成a人天堂| 国产大学生口爆吞精合集| 成人无码在线超碰网| 妇女性内射冈站HDWWWCOM|