欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

Android 12藍(lán)牙掃描權(quán)限適配:解決掃描不到設(shè)備問(wèn)題

Android 12藍(lán)牙掃描權(quán)限適配:解決掃描不到設(shè)備問(wèn)題 1. 項(xiàng)目背景與問(wèn)題現(xiàn)象最近在適配Android 12API 31及以上版本的藍(lán)牙功能時(shí)一個(gè)非常典型且高頻的“坑”出現(xiàn)了你的應(yīng)用明明在Android 11上運(yùn)行得好好的藍(lán)牙掃描能發(fā)現(xiàn)一堆設(shè)備但一到Android 12的設(shè)備上掃描結(jié)果就空空如也日志里除了你自己的應(yīng)用日志系統(tǒng)關(guān)于藍(lán)牙發(fā)現(xiàn)的日志也少得可憐。這絕不是你的代碼邏輯突然失效了而是Google在Android 12中引入了一套更嚴(yán)格的運(yùn)行時(shí)權(quán)限模型特別是針對(duì)藍(lán)牙掃描這一涉及位置信息的行為。這個(gè)問(wèn)題困擾了相當(dāng)多的開(kāi)發(fā)者尤其是那些需要與藍(lán)牙低功耗BLE設(shè)備或經(jīng)典藍(lán)牙設(shè)備交互的應(yīng)用比如智能家居控制、健康設(shè)備數(shù)據(jù)同步、文件傳輸工具等。從用戶(hù)和測(cè)試的角度看應(yīng)用“失靈”了但從開(kāi)發(fā)角度看這是一個(gè)必須跨越的權(quán)限門(mén)檻。我花了些時(shí)間把Android 12及更高版本上藍(lán)牙掃描所需的權(quán)限梳理了一遍并記錄了完整的排查和解決方案。如果你也遇到了“掃描不到設(shè)備”的靈異事件這篇筆記應(yīng)該能幫你快速定位問(wèn)題。2. Android 12藍(lán)牙權(quán)限模型的核心變化要解決問(wèn)題首先得理解Google為什么這么做以及具體改了哪里。在Android 12之前進(jìn)行藍(lán)牙掃描特別是BLE掃描主要需要兩個(gè)權(quán)限ACCESS_FINE_LOCATION精確定位和BLUETOOTH_SCAN在Android 11引入。當(dāng)時(shí)的邏輯是因?yàn)樗{(lán)牙掃描結(jié)果特別是BLE設(shè)備的信號(hào)強(qiáng)度RSSI可以被用來(lái)進(jìn)行粗略的室內(nèi)定位所以它被歸類(lèi)為一種“位置信息”訪問(wèn)需要位置權(quán)限。到了Android 12權(quán)限管理變得更加精細(xì)和嚴(yán)格。核心變化在于將“藍(lán)牙掃描”這個(gè)行為本身從“位置信息”的范疇中部分剝離出來(lái)并強(qiáng)調(diào)了其“鄰近設(shè)備”訪問(wèn)的特性。這帶來(lái)了幾個(gè)關(guān)鍵點(diǎn)2.1 新增的BLUETOOTH_SCAN權(quán)限成為絕對(duì)主角在Android 12API 31及以上版本BLUETOOTH_SCAN權(quán)限從之前的“普通”權(quán)限升級(jí)為“運(yùn)行時(shí)”權(quán)限。這意味著必須聲明在AndroidManifest.xml中必須聲明此權(quán)限。必須動(dòng)態(tài)申請(qǐng)?jiān)诖a中必須在運(yùn)行時(shí)向用戶(hù)彈窗請(qǐng)求授權(quán)就像請(qǐng)求相機(jī)、位置權(quán)限一樣。獨(dú)立控制用戶(hù)可以在系統(tǒng)設(shè)置中單獨(dú)控制某個(gè)應(yīng)用是否擁有“藍(lán)牙掃描”的權(quán)限而不再完全與位置權(quán)限綁定。2.2 與位置權(quán)限的“脫鉤”與“有條件關(guān)聯(lián)”這是最容易讓人困惑的地方。Android 12允許你的應(yīng)用在不訪問(wèn)設(shè)備位置信息的前提下進(jìn)行藍(lán)牙掃描。這是通過(guò)BLUETOOTH_SCAN權(quán)限的android:usesPermissionFlags屬性實(shí)現(xiàn)的。你可以在聲明權(quán)限時(shí)添加neverForLocation標(biāo)志。這樣系統(tǒng)就會(huì)明白“這個(gè)應(yīng)用掃描藍(lán)牙只是為了連接設(shè)備不是為了獲取位置。” 用戶(hù)授予BLUETOOTH_SCAN權(quán)限時(shí)系統(tǒng)可能就不會(huì)再?gòu)?qiáng)制要求位置權(quán)限。但是“脫鉤”是有條件的如果你的應(yīng)用需要從掃描結(jié)果中獲取位置信息例如你需要使用ScanResult中的Rssi信號(hào)強(qiáng)度或TimestampNanos等信息來(lái)進(jìn)行三角定位或位置推斷那么你仍然需要ACCESS_FINE_LOCATION權(quán)限。如果你的應(yīng)用僅為了發(fā)現(xiàn)和連接設(shè)備例如連接一個(gè)藍(lán)牙音箱、智能燈泡你只需要知道附近有這些設(shè)備并獲取其地址MAC地址用于連接那么你可以聲明neverForLocation標(biāo)志從而可能避免申請(qǐng)位置權(quán)限。2.3 其他必要權(quán)限的鞏固除了掃描連接和管理藍(lán)牙設(shè)備還需要其他權(quán)限BLUETOOTH_CONNECT用于連接藍(lán)牙設(shè)備、與已配對(duì)設(shè)備通信、訪問(wèn)設(shè)備信息等。這在Android 12也成為了運(yùn)行時(shí)權(quán)限。BLUETOOTH_ADVERTISE如果你的應(yīng)用自身要作為藍(lán)牙外圍設(shè)備廣播例如讓手機(jī)模擬一個(gè)Beacon則需要此權(quán)限。ACCESS_BACKGROUND_LOCATION如果你的應(yīng)用需要在后臺(tái)應(yīng)用不可見(jiàn)時(shí)持續(xù)進(jìn)行藍(lán)牙掃描那么即使你聲明了neverForLocation在Android 10及以上版本后臺(tái)掃描行為本身就可能觸發(fā)系統(tǒng)對(duì)后臺(tái)位置訪問(wèn)的限制可能需要此權(quán)限。但情況較為復(fù)雜通常前臺(tái)掃描足夠。下表總結(jié)了不同場(chǎng)景下的權(quán)限需求操作場(chǎng)景Android 11及以前Android 12及以后 (聲明neverForLocation)Android 12及以后 (需要位置信息)前臺(tái)掃描發(fā)現(xiàn)BLE設(shè)備BLUETOOTH_SCAN(普通) ACCESS_FINE_LOCATION(運(yùn)行時(shí))BLUETOOTH_SCAN(運(yùn)行時(shí))BLUETOOTH_SCAN(運(yùn)行時(shí)) ACCESS_FINE_LOCATION(運(yùn)行時(shí))連接已發(fā)現(xiàn)/已配對(duì)設(shè)備BLUETOOTH(普通) BLUETOOTH_ADMIN(普通)BLUETOOTH_CONNECT(運(yùn)行時(shí))BLUETOOTH_CONNECT(運(yùn)行時(shí))應(yīng)用作為外圍設(shè)備廣播BLUETOOTH_ADVERTISE(普通)BLUETOOTH_ADVERTISE(運(yùn)行時(shí))BLUETOOTH_ADVERTISE(運(yùn)行時(shí))后臺(tái)持續(xù)掃描上述權(quán)限 ACCESS_BACKGROUND_LOCATION(運(yùn)行時(shí))可能仍需ACCESS_BACKGROUND_LOCATION取決于掃描結(jié)果用途ACCESS_BACKGROUND_LOCATION(運(yùn)行時(shí))3. 完整解決方案與代碼實(shí)現(xiàn)理解了原理我們來(lái)看具體怎么做。這里以一個(gè)典型的“掃描并連接BLE設(shè)備”的應(yīng)用為例假設(shè)我們不需要位置信息僅為了設(shè)備連接。3.1 AndroidManifest.xml 權(quán)限聲明這是第一步也是最容易出錯(cuò)的一步。聲明必須準(zhǔn)確無(wú)誤。manifest xmlns:androidhttp://schemas.android.com/apk/res/android packagecom.example.mybluetoothapp !-- 對(duì)于 Android 12 (API 31) 藍(lán)牙掃描聲明不用于定位 -- uses-permission android:nameandroid.permission.BLUETOOTH_SCAN android:usesPermissionFlagsneverForLocation / !-- 對(duì)于 Android 12 (API 31) 藍(lán)牙連接 -- uses-permission android:nameandroid.permission.BLUETOOTH_CONNECT / !-- 對(duì)于 Android 6.0 到 Android 11 (API 23-30) 藍(lán)牙掃描需要的位置權(quán)限 -- !-- 注意即使你的 targetSdkVersion 31為了兼容舊設(shè)備最好也加上 -- uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / !-- 如果需要后臺(tái)掃描則還需要這個(gè)謹(jǐn)慎使用 -- !-- uses-permission android:nameandroid.permission.ACCESS_BACKGROUND_LOCATION / -- !-- 傳統(tǒng)藍(lán)牙權(quán)限用于 Android 11 及以下 -- uses-permission android:nameandroid.permission.BLUETOOTH / uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN / !-- 如果只針對(duì) BLE 設(shè)備可以聲明此 feature -- uses-feature android:nameandroid.hardware.bluetooth_le android:requiredtrue/ application ... ... /application /manifest關(guān)鍵點(diǎn)解析android:usesPermissionFlagsneverForLocation這是Android 12權(quán)限聲明的精髓。它明確告知系統(tǒng)你申請(qǐng)BLUETOOTH_SCAN權(quán)限的目的不是為了獲取位置。這能帶來(lái)兩個(gè)好處1) 在Android 12設(shè)備上系統(tǒng)可能不會(huì)強(qiáng)制要求你同時(shí)擁有位置權(quán)限2) 在申請(qǐng)彈窗中向用戶(hù)說(shuō)明的理由會(huì)更清晰例如“允許應(yīng)用發(fā)現(xiàn)附近的設(shè)備”而不是“允許應(yīng)用訪問(wèn)位置”。兼容性聲明即使targetSdkVersion設(shè)為31或更高你仍然需要聲明ACCESS_FINE_LOCATION。因?yàn)楫?dāng)你的應(yīng)用安裝在Android 11API 30的設(shè)備上時(shí)系統(tǒng)會(huì)忽略BLUETOOTH_SCAN的聲明因?yàn)樵撓到y(tǒng)版本不存在此權(quán)限轉(zhuǎn)而檢查ACCESS_FINE_LOCATION。這是一種標(biāo)準(zhǔn)的向后兼容做法。BLUETOOTH和BLUETOOTH_ADMIN在舊版本系統(tǒng)上這些是必需的。即使在新系統(tǒng)上聲明它們也無(wú)害系統(tǒng)會(huì)忽略已廢棄的權(quán)限。3.2 運(yùn)行時(shí)權(quán)限動(dòng)態(tài)申請(qǐng)聲明了權(quán)限接下來(lái)就是在合適的時(shí)機(jī)例如進(jìn)入掃描界面時(shí)向用戶(hù)申請(qǐng)。我們需要處理Android 12的新權(quán)限和舊版本的位置權(quán)限。import android.Manifest import android.bluetooth.BluetoothAdapter import android.content.pm.PackageManager import android.os.Build import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat class BluetoothScanActivity : AppCompatActivity() { private lateinit var bluetoothAdapter: BluetoothAdapter // 使用 Activity Result API 簡(jiǎn)化權(quán)限請(qǐng)求回調(diào)處理 private val requestPermissionLauncher registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions - val allGranted permissions.entries.all { it.value } if (allGranted) { // 所有必要權(quán)限都已授予可以開(kāi)始掃描 startBluetoothScan() } else { // 有權(quán)限被拒絕向用戶(hù)解釋為什么需要這些權(quán)限 showPermissionDeniedDialog() } } override fun onStart() { super.onStart() checkAndRequestPermissions() } private fun checkAndRequestPermissions() { val permissionsToRequest mutableListOfString() // 檢查藍(lán)牙硬件支持 bluetoothAdapter BluetoothAdapter.getDefaultAdapter() ?: run { showToast(該設(shè)備不支持藍(lán)牙) return } // 1. 檢查并添加 Android 12 (API 31) 的權(quán)限 if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) { // BLUETOOTH_SCAN 權(quán)限用于發(fā)現(xiàn)設(shè)備 if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) ! PackageManager.PERMISSION_GRANTED ) { permissionsToRequest.add(Manifest.permission.BLUETOOTH_SCAN) } // BLUETOOTH_CONNECT 權(quán)限用于連接設(shè)備如果你在掃描后需要連接 if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) ! PackageManager.PERMISSION_GRANTED ) { permissionsToRequest.add(Manifest.permission.BLUETOOTH_CONNECT) } } else { // 2. 檢查并添加 Android 6.0 到 Android 11 (API 23-30) 的位置權(quán)限 // 注意在 Android 11 上即使聲明了 BLUETOOTH_SCAN普通權(quán)限掃描 BLE 仍需位置權(quán)限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ! PackageManager.PERMISSION_GRANTED ) { permissionsToRequest.add(Manifest.permission.ACCESS_FINE_LOCATION) } } // 3. 對(duì)于所有版本檢查藍(lán)牙開(kāi)關(guān)這不是權(quán)限但必須開(kāi)啟 if (!bluetoothAdapter.isEnabled) { // 可以引導(dǎo)用戶(hù)打開(kāi)藍(lán)牙這里使用一個(gè)簡(jiǎn)單的提示 showEnableBluetoothDialog() return // 先不請(qǐng)求權(quán)限等藍(lán)牙打開(kāi)再說(shuō) } // 4. 如果有需要申請(qǐng)的權(quán)限則發(fā)起請(qǐng)求 if (permissionsToRequest.isNotEmpty()) { requestPermissionLauncher.launch(permissionsToRequest.toTypedArray()) } else { // 所有權(quán)限都已具備藍(lán)牙已開(kāi)啟直接開(kāi)始掃描 startBluetoothScan() } } private fun startBluetoothScan() { // 這里實(shí)現(xiàn)你的藍(lán)牙掃描邏輯例如使用 BluetoothLeScanner // val scanner bluetoothAdapter.bluetoothLeScanner // val settings ScanSettings.Builder().build() // val filters listOfScanFilter() // 可以添加過(guò)濾條件 // scanner.startScan(filters, settings, scanCallback) showToast(權(quán)限檢查通過(guò)開(kāi)始掃描...) // ... 實(shí)際掃描代碼 } // 輔助方法顯示對(duì)話框等UI交互 private fun showEnableBluetoothDialog() { /* ... */ } private fun showPermissionDeniedDialog() { /* ... */ } private fun showToast(message: String) { /* ... */ } }代碼邏輯拆解版本判斷是核心我們首先根據(jù)Build.VERSION.SDK_INT判斷設(shè)備系統(tǒng)版本。對(duì)于Android 12S/API 31及以上我們動(dòng)態(tài)申請(qǐng)BLUETOOTH_SCAN和BLUETOOTH_CONNECT。對(duì)于Android 11及以下我們申請(qǐng)ACCESS_FINE_LOCATION。權(quán)限檢查前置在申請(qǐng)前先用ContextCompat.checkSelfPermission檢查權(quán)限是否已授予。只申請(qǐng)未被授予的權(quán)限避免不必要的彈窗打擾用戶(hù)。藍(lán)牙開(kāi)關(guān)檢查無(wú)論權(quán)限如何藍(lán)牙硬件必須開(kāi)啟。這是一個(gè)獨(dú)立于權(quán)限的系統(tǒng)狀態(tài)檢查。通常我們會(huì)先確保藍(lán)牙開(kāi)啟再處理權(quán)限問(wèn)題。使用現(xiàn)代APIregisterForActivityResult配合ActivityResultContracts.RequestMultiplePermissions是處理運(yùn)行時(shí)權(quán)限的最佳實(shí)踐它避免了重寫(xiě)onRequestPermissionsResult方法的繁瑣使代碼更清晰。優(yōu)雅降級(jí)如果用戶(hù)拒絕了權(quán)限應(yīng)該有一個(gè)友好的界面showPermissionDeniedDialog向用戶(hù)解釋這些權(quán)限對(duì)于應(yīng)用核心功能如連接智能設(shè)備的必要性并引導(dǎo)用戶(hù)去應(yīng)用設(shè)置頁(yè)面手動(dòng)開(kāi)啟。3.3 掃描邏輯的實(shí)現(xiàn)與適配權(quán)限搞定后掃描邏輯本身也需要針對(duì)Android 12進(jìn)行微調(diào)。主要是ScanSettings的配置。import android.bluetooth.le.ScanCallback import android.bluetooth.le.ScanFilter import android.bluetooth.le.ScanResult import android.bluetooth.le.ScanSettings import android.os.Build import android.os.Handler import android.os.Looper private val scanCallback object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { // 處理掃描到的設(shè)備 val device result.device val rssi result.rssi // 注意在聲明了 neverForLocation 后此值可能為0 val scanRecord result.scanRecord // ... 更新UI將設(shè)備添加到列表 } override fun onScanFailed(errorCode: Int) { // 掃描失敗處理常見(jiàn)錯(cuò)誤碼如 SCAN_FAILED_APPLICATION_REGISTRATION_FAILED應(yīng)用注冊(cè)失敗通常權(quán)限問(wèn)題 // 或 SCAN_FAILED_FEATURE_UNSUPPORTED不支持BLE等 showToast(掃描失敗錯(cuò)誤碼: $errorCode) } } private fun buildScanSettings(): ScanSettings { val builder ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // 掃描模式低延遲發(fā)現(xiàn)設(shè)備最快 // Android 12 的重要適配如果你聲明了 neverForLocation且不需要RSSI可以設(shè)置此標(biāo)志 if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) { // 這個(gè)標(biāo)志告訴硬件可以為了省電而降低掃描報(bào)告頻率因?yàn)槲覀儾魂P(guān)心精確的RSSI // 注意設(shè)置此標(biāo)志后onScanResult回調(diào)的頻率可能會(huì)降低且RSSI可能不準(zhǔn)確或?yàn)? builder.setLegacy(false) // 對(duì)于只關(guān)心新BLE設(shè)備的情況可以設(shè)為false // 如果你確實(shí)需要RSSI做信號(hào)篩選就不要加下面這行 // builder.setPhy(ScanSettings.PHY_LE_ALL_SUPPORTED) } return builder.build() } fun startScan() { val scanner bluetoothAdapter.bluetoothLeScanner val filters listOfScanFilter() // 可以按設(shè)備名、服務(wù)UUID等過(guò)濾提高效率 val settings buildScanSettings() // 開(kāi)始掃描 scanner.startScan(filters, settings, scanCallback) showToast(掃描已啟動(dòng)) // 可選掃描10秒后自動(dòng)停止節(jié)省電量 Handler(Looper.getMainLooper()).postDelayed({ stopScan() }, 10000) } fun stopScan() { bluetoothAdapter.bluetoothLeScanner?.stopScan(scanCallback) showToast(掃描已停止) }關(guān)鍵點(diǎn)與避坑指南setLegacy(false)在Android 12上這個(gè)設(shè)置與neverForLocation標(biāo)志協(xié)同工作。它告訴底層藍(lán)牙棧你不需要為了向后兼容舊版掃描報(bào)告格式而做額外處理。對(duì)于只針對(duì)Android 5.0以上新BLE規(guī)范的應(yīng)用設(shè)置為false可能更高效。但如果你需要掃描一些舊設(shè)備或遇到掃描問(wèn)題可以嘗試設(shè)為true或移除這行。RSSI值可能為0這是聲明neverForLocation后一個(gè)非常重要的副作用。系統(tǒng)或硬件為了保護(hù)位置隱私可能會(huì)在掃描結(jié)果中屏蔽或歸零RSSI值。如果你的邏輯依賴(lài)RSSI來(lái)篩選信號(hào)強(qiáng)的設(shè)備比如只連接-70dBm以上的設(shè)備那么你就不能聲明neverForLocation必須同時(shí)申請(qǐng)位置權(quán)限。掃描過(guò)濾使用ScanFilter能極大提升掃描效率減少不必要的回調(diào)和處理。例如如果你只尋找特定服務(wù)UUID的設(shè)備務(wù)必加上過(guò)濾器。4. 問(wèn)題排查與深度調(diào)試即使按照上面的步驟做了有時(shí)候掃描依然不工作。這時(shí)候就需要系統(tǒng)化的排查。以下是我總結(jié)的排查清單按照從外到內(nèi)、從易到難的順序進(jìn)行。4.1 基礎(chǔ)環(huán)境檢查設(shè)備藍(lán)牙是否真的開(kāi)啟通過(guò)系統(tǒng)設(shè)置確認(rèn)而不僅僅是代碼檢查。有時(shí)代碼檢查返回true但硬件或驅(qū)動(dòng)層可能有問(wèn)題。目標(biāo)藍(lán)牙設(shè)備是否處于可發(fā)現(xiàn)模式BLE設(shè)備通常需要處于廣播狀態(tài)經(jīng)典藍(lán)牙設(shè)備需要處于“可被檢測(cè)”狀態(tài)。物理距離和干擾將設(shè)備靠近1米內(nèi)排除信號(hào)弱的問(wèn)題。遠(yuǎn)離Wi-Fi路由器、微波爐等2.4GHz干擾源。其他應(yīng)用能否掃描到使用“nRF Connect”、“LightBlue”等通用的藍(lán)牙調(diào)試APP測(cè)試。如果它們也掃不到很可能是目標(biāo)設(shè)備或手機(jī)藍(lán)牙硬件的問(wèn)題。如果它們能掃到而你的應(yīng)用不能問(wèn)題就在你的應(yīng)用上。4.2 應(yīng)用權(quán)限與配置檢查檢查AndroidManifest.xml確保權(quán)限聲明沒(méi)有拼寫(xiě)錯(cuò)誤uses-permission標(biāo)簽在正確的層級(jí)。特別注意android:usesPermissionFlagsneverForLocation是否只附加在BLUETOOTH_SCAN上。檢查targetSdkVersion在app/build.gradle中確保targetSdkVersion至少為31如果你要適配Android 12的新權(quán)限模型。如果targetSdkVersion低于31系統(tǒng)會(huì)使用舊版的權(quán)限規(guī)則但你又聲明了新權(quán)限可能導(dǎo)致行為不一致。動(dòng)態(tài)權(quán)限狀態(tài)復(fù)查在申請(qǐng)權(quán)限的回調(diào)中打印或記錄所有請(qǐng)求權(quán)限的授予狀態(tài)。使用ActivityResultContracts.RequestMultiplePermissions返回的MapString, Boolean來(lái)確認(rèn)。private val requestPermissionLauncher registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions - permissions.entries.forEach { entry - Log.d(PermissionDebug, ${entry.key} : ${entry.value}) } // ... 后續(xù)處理 }檢查是否在后臺(tái)從Android 10開(kāi)始對(duì)后臺(tái)應(yīng)用獲取位置信息包括通過(guò)藍(lán)牙掃描間接獲取有嚴(yán)格限制。確保你的掃描代碼是在應(yīng)用處于前臺(tái)Activity可見(jiàn)時(shí)執(zhí)行的。如果你需要在后臺(tái)掃描那將是一個(gè)更復(fù)雜的課題涉及前臺(tái)服務(wù)、后臺(tái)位置權(quán)限和更嚴(yán)格的審核。4.3 日志與系統(tǒng)信息分析當(dāng)基礎(chǔ)檢查都通過(guò)后就需要深入系統(tǒng)內(nèi)部看日志。查看應(yīng)用日志過(guò)濾你的應(yīng)用Tag檢查是否有SecurityException或類(lèi)似“Permission Denial”的異常拋出。查看系統(tǒng)藍(lán)牙日志這是最有效的手段。使用adb logcat命令過(guò)濾藍(lán)牙相關(guān)的系統(tǒng)日志。adb logcat | grep -E (Bluetooth|BT|BLE|ScanManager|AdapterService)或者更精確地在Android Studio的Logcat中選擇設(shè)備后添加過(guò)濾器tag:Bluetooth或tag:BluetoothAdapter。重點(diǎn)觀察以下日志當(dāng)你調(diào)用startScan()時(shí)是否有類(lèi)似App your.package.name is not allowed to use Bluetooth或Scan failed, app uid XXXX not allowed to scan的錯(cuò)誤。這直接指向權(quán)限問(wèn)題。是否有Scanning too frequent之類(lèi)的警告Android對(duì)掃描頻率有限制過(guò)于頻繁的啟停掃描會(huì)被系統(tǒng)限制。檢查系統(tǒng)權(quán)限設(shè)置頁(yè)面手動(dòng)進(jìn)入手機(jī)的設(shè)置 應(yīng)用 你的應(yīng)用 權(quán)限查看“附近設(shè)備”對(duì)應(yīng)BLUETOOTH_SCAN和“位置信息”權(quán)限是否確認(rèn)為“允許”。注意在Android 13位置權(quán)限可能細(xì)分為“僅在使用中允許”和“始終允許”確保符合你的場(chǎng)景。4.4 代碼邏輯與API使用復(fù)查掃描回調(diào)是否注冊(cè)成功確保startScan被調(diào)用并且傳入的scanCallback對(duì)象是有效的、未被垃圾回收的例如作為Activity的成員變量持有。掃描設(shè)置是否過(guò)于苛刻檢查ScanSettings比如setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)在低功耗模式下發(fā)現(xiàn)設(shè)備會(huì)很慢。對(duì)于測(cè)試建議使用SCAN_MODE_LOW_LATENCY。過(guò)濾器是否過(guò)濾掉了所有設(shè)備如果你使用了ScanFilter檢查過(guò)濾條件如設(shè)備名稱(chēng)、MAC地址、服務(wù)UUID是否寫(xiě)錯(cuò)導(dǎo)致所有設(shè)備都被過(guò)濾掉。嘗試不設(shè)過(guò)濾器或設(shè)置一個(gè)寬泛的過(guò)濾器進(jìn)行測(cè)試。是否在掃描過(guò)程中停止了藍(lán)牙適配器確保在掃描生命周期內(nèi)從startScan到stopScanBluetoothAdapter對(duì)象是有效的并且藍(lán)牙沒(méi)有在中間被系統(tǒng)或用戶(hù)關(guān)閉。4.5 針對(duì)特定機(jī)型或系統(tǒng)的特殊處理有些廠商如小米、華為、OPPO、Vivo的定制系統(tǒng)MIUI、EMUI等有更激進(jìn)的權(quán)限管理或后臺(tái)限制。自啟動(dòng)管理在部分系統(tǒng)上即使授予了所有權(quán)限應(yīng)用如果被“禁止自啟動(dòng)”或“關(guān)聯(lián)啟動(dòng)”后臺(tái)掃描可能被殺死。需要引導(dǎo)用戶(hù)手動(dòng)在手機(jī)管家中設(shè)置。省電策略檢查是否將你的應(yīng)用加入了“電池優(yōu)化”的白名單。在設(shè)置中搜索“電池優(yōu)化”找到你的應(yīng)用選擇“不優(yōu)化”。懸浮窗權(quán)限等雖然與藍(lán)牙掃描無(wú)直接關(guān)系但某些系統(tǒng)會(huì)將這些非常規(guī)權(quán)限與后臺(tái)活動(dòng)關(guān)聯(lián)導(dǎo)致應(yīng)用行為異常。如果排查所有可能性后仍無(wú)效可以查閱該機(jī)型開(kāi)發(fā)者的官方論壇或社區(qū)看是否有已知的特定限制。5. 進(jìn)階考量與最佳實(shí)踐解決了基本掃描問(wèn)題后為了構(gòu)建一個(gè)健壯的藍(lán)牙應(yīng)用還需要考慮以下幾點(diǎn)。5.1 后臺(tái)掃描的復(fù)雜性如前所述在后臺(tái)進(jìn)行藍(lán)牙掃描是一個(gè)“深水區(qū)”。從Android 10開(kāi)始后臺(tái)應(yīng)用訪問(wèn)位置信息受到嚴(yán)格限制。即使你聲明了neverForLocation持續(xù)的后臺(tái)掃描行為本身也可能被系統(tǒng)視為潛在的位置訪問(wèn)行為從而觸發(fā)限制。建議盡量避免持續(xù)后臺(tái)掃描這是最省心省電的做法??紤]使用以下替代方案前臺(tái)服務(wù)當(dāng)應(yīng)用需要長(zhǎng)時(shí)間掃描時(shí)啟動(dòng)一個(gè)帶有持續(xù)通知的前臺(tái)服務(wù)。這明確告知用戶(hù)應(yīng)用正在活動(dòng)并通常能獲得更穩(wěn)定的系統(tǒng)資源。定時(shí)掃描使用WorkManager或AlarmManager安排定期、短暫的掃描任務(wù)而不是7x24小時(shí)不間斷掃描。使用系統(tǒng)廣播有限對(duì)于已配對(duì)設(shè)備的連接狀態(tài)變化可以監(jiān)聽(tīng)BluetoothDevice.ACTION_ACL_CONNECTED和ACTION_ACL_DISCONNECTED廣播但這無(wú)法發(fā)現(xiàn)新設(shè)備。如果必須后臺(tái)掃描確保申請(qǐng)了ACCESS_BACKGROUND_LOCATION權(quán)限這是一個(gè)敏感權(quán)限上架Google Play需要額外聲明和審核。在應(yīng)用商店的描述中清晰說(shuō)明為什么需要此權(quán)限。準(zhǔn)備處理用戶(hù)拒絕該權(quán)限的情況并提供優(yōu)雅降級(jí)方案例如僅支持前臺(tái)掃描功能。5.2 權(quán)限申請(qǐng)的時(shí)機(jī)與用戶(hù)體驗(yàn)不要一進(jìn)入應(yīng)用就彈出一堆權(quán)限請(qǐng)求這會(huì)讓用戶(hù)反感。適時(shí)請(qǐng)求在用戶(hù)即將使用需要該權(quán)限的功能時(shí)再請(qǐng)求。例如在用戶(hù)點(diǎn)擊“掃描設(shè)備”按鈕后再執(zhí)行權(quán)限檢查和申請(qǐng)流程。解釋必要性在請(qǐng)求權(quán)限前尤其是BLUETOOTH_SCAN和位置權(quán)限用一個(gè)簡(jiǎn)單的對(duì)話框或界面文字向用戶(hù)解釋“我們需要掃描附近藍(lán)牙設(shè)備的權(quán)限以便為您連接智能音箱/手環(huán)?!?這能顯著提高授權(quán)率。處理“不再詢(xún)問(wèn)”如果用戶(hù)拒絕了權(quán)限并勾選了“不再詢(xún)問(wèn)”下次shouldShowRequestPermissionRationale()會(huì)返回false。此時(shí)你應(yīng)該引導(dǎo)用戶(hù)前往系統(tǒng)設(shè)置頁(yè)面手動(dòng)開(kāi)啟權(quán)限。提供一個(gè)清晰的指引按鈕和說(shuō)明文字。5.3 兼容舊版本Android的優(yōu)雅處理你的應(yīng)用可能需要支持Android 11甚至更早的版本。權(quán)限代碼需要做良好的分支處理。private fun checkPermissions(): ListString { val neededPermissions mutableListOfString() if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) { // Android 12 if (!hasPermission(Manifest.permission.BLUETOOTH_SCAN)) { neededPermissions.add(Manifest.permission.BLUETOOTH_SCAN) } if (!hasPermission(Manifest.permission.BLUETOOTH_CONNECT)) { neededPermissions.add(Manifest.permission.BLUETOOTH_CONNECT) } // 注意在聲明了 neverForLocation 后可以不主動(dòng)請(qǐng)求位置權(quán)限 // 但如果功能需要RSSI則仍需檢查并請(qǐng)求 // if (needLocationForScan !hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) { // neededPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION) // } } else { // Android 6.0 - 11 if (!hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) { neededPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION) } // Android 12以下BLUETOOTH 和 BLUETOOTH_ADMIN 是普通權(quán)限無(wú)需運(yùn)行時(shí)申請(qǐng) // 但需要在 Manifest 中聲明 } return neededPermissions } private fun hasPermission(permission: String): Boolean { return ContextCompat.checkSelfPermission(this, permission) PackageManager.PERMISSION_GRANTED }這種結(jié)構(gòu)清晰的版本判斷使得權(quán)限邏輯一目了然便于維護(hù)。5.4 測(cè)試策略藍(lán)牙開(kāi)發(fā)測(cè)試至關(guān)重要。準(zhǔn)備多版本測(cè)試機(jī)至少準(zhǔn)備一臺(tái)Android 12和一臺(tái)Android 11的設(shè)備進(jìn)行測(cè)試。模擬權(quán)限拒絕場(chǎng)景在開(kāi)發(fā)者選項(xiàng)中可以手動(dòng)撤銷(xiāo)應(yīng)用的具體權(quán)限測(cè)試應(yīng)用在權(quán)限缺失時(shí)的表現(xiàn)是否崩潰以及引導(dǎo)用戶(hù)開(kāi)啟權(quán)限的流程是否順暢。使用模擬器謹(jǐn)慎Android模擬器對(duì)藍(lán)牙的支持有限尤其是低功耗藍(lán)牙。大部分模擬器無(wú)法模擬真實(shí)的藍(lán)牙掃描。真機(jī)測(cè)試是唯一可靠的方式。日志是朋友養(yǎng)成在關(guān)鍵節(jié)點(diǎn)如權(quán)限檢查前后、掃描開(kāi)始/停止、回調(diào)觸發(fā)時(shí)打Log的習(xí)慣并熟練使用adb logcat查看系統(tǒng)藍(lán)牙日志。這是定位疑難雜癥的最強(qiáng)武器。我在實(shí)際項(xiàng)目中正是通過(guò)系統(tǒng)日志發(fā)現(xiàn)了一條關(guān)鍵的Permission denial for startLeScan日志才最終鎖定是Android 12上新權(quán)限模型導(dǎo)致的問(wèn)題。從那時(shí)起我就把權(quán)限檢查和適配作為藍(lán)牙功能開(kāi)發(fā)的第一步再也沒(méi)在這個(gè)坑里摔倒過(guò)。藍(lán)牙開(kāi)發(fā)本身就有很多坑從協(xié)議到硬件兼容性權(quán)限問(wèn)題只是第一道關(guān)卡但跨過(guò)它你的應(yīng)用才算是拿到了入場(chǎng)券。希望這篇詳細(xì)的筆記能幫你節(jié)省大量排查時(shí)間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日日夜夜干| 色99在线视频| 六月婷欧美| 色五月 五月婷婷| 丁香欧美| 色丁香在线视频| 五月丁香少妇| 99热全是精品| 婷婷伊人綜合中文| 九九九干精品| www.色五月| 成人国产综合| 日本久久精品18| 日本va欧美va精品发布视频| 五月天激情综合在线| 五月丁香综合久久夜夜| 一级内射毛片| 蜜乳AV成人| www婷婷| 五月天狠狠网| 99热这里只有精品3| 久久视这里只有精品| 亚洲综合视频八| 免费看欧美成人A片无码| 免费在线观看欧美激情xx小视频| 99热中文字幕久久| 婷婷婷婷婷开心无码播放| 婷婷五月天视频小说| 亚洲五月天婷婷| 丁香五月 性爱| 激情文学综合婷婷五月天丁香花| 婷婷激情四射| 色色五月婷婷| 色婷婷五月天| 99国产精品白浆在线观看免费| 日本综合久久| 99色色| 久色激情| 99色婷婷| 99久久国产宗和精品1上映| 五月伊人网| 丁香五月天电影| 天天综合亚洲| 9久久久久| 夜夜骑天天操| 99久久9| 二色AV| 91日视频| 超碰免费人人| 亚洲天堂色| 五月婷婷色欲| 丁香五月婷婷亚洲激情四射| 操逼三区| 俺也去婷婷五月天第五色| 永久免费视频| 99精品视频在线免费观看| 97色婷婷| 五月丁香色婷婷基地| 欧美97p| 九九在线这里只有精品视频| 美女网黄| 激情五月黄色| 色99热| 九色视频91疯狂| 成人在线网址| 玖玖精品视频99| 久久婷婷欧美| 五月 激情视频| 99色| 偷偷与邻居做爰完整视频| 99精品偷自拍| 99久久视频| 日本人妻A片成人免费看片| 亚洲啪啪视频| av人人操| 99视频自拍| 亚洲乱码日产精品BD| 色情终和网| 久久艹网| 久久国产精品乱子伦_靑青草…| 亚洲人人96@| 天堂草在线观| 久久婷婷五月天| 激情小说色五月| 亚洲啪啪精品| 99精品视频在线6| 激情六月一二| 国产精品大香蕉| 9热网站| 日本nghangse中文字幕| 色色综合日韩| 97久久超碰| 丁香五月激情五月| 久热91精品| 丁香五月天激情婷婷丁香六月| 爱草视频在线| www.yw尤物| 97sese婷婷| 国产免费一区二区在线A片视频| 一本久久亚洲五月婷婷| 一根材五月婷成人| 婷婷丁香五月欧美人| 26uuu亚洲欧美| 四色永久成人网站| 成人中文网| 久人人操| 午夜激情五月| a在线观看| 97搞在线| 热99精品视频观看| 亚洲操精品| 五月天开心网| 91精品久久久久久77777| 成 久久| AV成人在线播放| 天天艹夜夜艹| 色婷婷a| 天天射综合网天天插| 99日本视频| 久久这里这里有精品免费视频| 色丁香影院| 综合网天天| 久热精彩视频98| 色啪综合| 丁香五月婷婷偷拍| 激情骚五月| 99re思思精品视频在线观看| 激情婷婷| 人人操人人操919999| 激情五月天婷婷视频| 99久久99久久综合| 123草逼网| 六月婷婷色宗合| 思思re99视频在线观看| 久久婷婷综合基地| 99久精品视频| 熟女啪啪视频| 五月天婷婷综合| 九九视频在线观看视频6| 婷婷五月亚洲综合| 丁香五月欧美激情| 伊人久久大香蕉网| 综合性爱网| 在线五月婷| 26uuu美女三级视频| 久久五月天网| 97色色综合| 色五月综合婷婷| 天天爱天天做天天操| 99视频在线观看网址| 日本欧美国产| 六月婷婷天堂| 久久九九热视频| 综合久久五月| 婷婷激情六月中文| 深爱激情网综合| 先锋影音av色五月天资源站| 这里只有精品99www| www.五月天婷婷| 日本一级| 久久久免费精彩视频| 丁香婷婷色| 五月天婷婷免费视频| 伊人久久大香线蕉亚洲五月天,| 丁香五月婷婷色五月| 久久机热/这里只有精品| 色九亚洲| 婷婷五月色| 久9热| 在线成人网址| 五月天婷婷xxx| 色99在线视频| 五月婷婷六月丁香激情深爱| 天天做天天爱天天高潮| 开心五月色婷| 人碰91| 激情五月天偷拍综合网| 婷婷综合色图| 涩五月婷婷| bbwcuckold精品熟妇| 9色在线| 国产亚洲色婷婷99精品| av免费在线看不卡无毒| 色99网站| 五月激情综合网| 色碰碰视频| 另类视频一区| 草草夜夜操| 99福利视频| 91n网站cad入口在线观看| 操操操AV| 色99网站| 天天做天天要天天爽| 成人国产欧美大片一区| 亚洲操b| 欧美月久久| 亚洲婷婷基地| 这里只有精品99视频| 99ER热精品视频| 婷婷丁香五月欧美人| 色色色色色色色五月| 色五婷婷开心缴| 大香蕉九九热| 日本少妇裸体做爰高潮片| 色色亚卅| 超碰人人操在线| 婷婷色五月激情| 99精品无码网站| 毛v一区二区视频| 色婷婷久久综合| 丁香婷婷五月天色综合| 婷婷伊人綜合| 五月激情影院| 激情五月色婷婷| 国产中文亚洲欧美日韩性交| AV大片在线观看| 成人综合视频在线| 开心五月激情五月丁香五月婷婷| 日本系列_4页_777FP| 亚洲中文字幕av| 亚洲色色精品| 色五月天影视| 99热超碰天堂网| 五月天婷婷激情小说电影| 美女主播野战视步页| 五月婷婷亚洲色图| 久久人妻熟女一区二区| 九九色99| 岛国AV网| 五月丁香AV、伊人业余、性色熟妇| 色五月色五天色情网址| 丁香六月婷婷久久综合| 亚洲旡码| 99热首页| 婷婷色丁香五月| 91免费看片| 亚洲中文字幕在线观看| 日本久久天堂| 综合成人小说婷婷| 五月婷婷福利| 性小说五月天| 欧美性二区| 一区二区你懂的| 99在线免费视频| 国产无套精品一区二区| 天天橾日日橾夜夜橾17| 丁香无月在线观看| 色99在线视频| 99九九热视频免费| av免费在线观看0| 26UUU精品一区二区| 99热久| 色综合久久伊伊婷婷五月| 人人干女人| 99九九精品视频推荐| 婷婷五月色播放| 激情综合五| 五月天婷婷久色| 青青草原亚洲天堂| 99热热这里只精品996小说| 97超碰婷婷五月天| 丁香激情五月| www.激情| 国产精产国品一二三在观看| 婷婷五月天精品| 亚洲日日日| 天天日天天做天天操| 色噜噜狠狠色综合日日| 亚洲性爱电影| 97碰碰视频| 熟女色色一区二区| 天天揷综合网| 无码少妇高潮喷水A片免费| 欧洲亚洲免费视频9| va亚洲中文在线| 激情com| 婷婷五月香蕉| 国产成人av在线播放| 人人综合色| 婷婷五月天av| 大香蕉婷婷| 日本久久婷| 五月婷婷六月丁香在线| 亚洲国产精品VA在线看黑人| 26UUU欧美| 开心五月丁香婷婷| 五月亭亭综合五码| 狠狠五月天激情| 天天婷婷操| 午夜青草资源| xfplayav在线| 色5月婷婷| 婷婷五月丁香高清无码| 婷婷五月激情片| 夜夜夜夜操| 色色热| 久热这里只有精品6| AV在线大香蕉| 97天堂| 丁香五月六月欧美| 99热精品中文字幕| 日本色色网站| 九九婷婷网五月天| 天堂成人A片永久免费网站| 看片视频在线免费日产在线看| 开心激情综合| 97亚洲视频在线| 亚洲深喉AV| 久久精品一区二区三区四区| 伊久大香蕉| 五月天大香焦| 久久九九@| 99福利导航| 激情综合五月天| 國語久久婷| 在线日韩av| 99re热在线视频观看| 高清成人综合| 天堂AV三级| 亚洲99激情| 丁香婷婷久久激情| 色爱五月天| 玖玖在线| 99无码| 无码激情AAAAA片-区区| 丁香九色不卡aaa | 可以免费看av网站| 丁香网五月网| 99热亚洲| 少妇水多A片太爽了| 91九九九九九九| 欧美在线| 五月激情站| 操骚货在线| 九九热中文| 激情五月天网| www五月天com| 五月婷婷丁香成人网| 襙逼网| 99热这里只有精品免费观看| 综合色色网| 九月丁香很很色| 欧美人人超级碰| 色欲av伊人久久大香线蕉影院| 丁香六月婷婷综情欧美| 欧美天天干五月丁香| 免费五月婷婷网| 久久久久久97| 久久久av久av久片一区二区| AV动漫不卡无码免费| 丁香五月亚洲激情婷婷射| 欧洲亚洲激情五月天在线| 婷婷五月丁香五月综合网| 激情五月丁香五月| 天天操天天插天天射| 无码啪啪| 欧洲亚洲精品| 亚洲精品V天堂中文字幕| 亚洲无码影片| 丁香五月天天| WWW.99视频| 国产91资源在线| 伊人九九热| 亚洲色色图片| 久久久香| 9色天堂| 亚洲色色色色色色色色色| 五月婷婷深爱六月| 久久机热/这里只有精品| 激情五月婷婷综合秋霞| 天天久久人人| 伊人婷婷大香蕉| 激情丰满熟妇五月| 97超碰综合| 91a片爽| 婷婷色网| 99re视频在线播放| 亚洲第一影院高清无码网站| 激情婷婷五月天在线观看| 玖玖色综合网| 狠干综合| 欧美婷婷五月| 国产美女无遮挡裸体毛片A片| 精品在线网站| 久久人妻视频| 9一精品视频观看| 天天做天天双| 99操视频| 久久婷婷六月| 99热精品在这里| 人人妻人人澡人人爽| 婷婷六月天精品| 99热最新精品| 国产成人AV在线播放| 玖玖九九99| 99热亚洲| 亚洲小视频免费播放| 天天操中文字幕| αV电影| 五月婷婷香蕉| 五月天偷拍| 久热99| 中文字幕视频在线播放| 丁香六月激情四射| 日本高清久| 亚洲色色五月| 婷婷 丁香 精品| 98热精品| 色婷婷小说网| 97色操| 毛片色五月| 99爱最新免费视频在线观看| 粉嫩AV久久一区二区三区| 亚洲激情亚洲激情| 天天干天天干天天操| 91网站黄| 99热99色| 五月丁了香蕉综合| 丁香五月成人| 深爱激情五月天婷婷网| 天天干在线播放| 激情五月天婷婷图| 丁香五月天激情综合| 久久狠狠欧美| 99噜噜噜在线播放| WwW天天干| 中文字幕在线观看视频www| 五月天啪啪视频| AV五月丁香| 色综合色五月| 日本片日本片祼观看网站在线看中文版网页在线看| 天天更新天天亚洲| 久久人人添人人爽添人人片αV | 天天搽天天射| 在线看九一V图片| 五月婷婷插一插| 狠狠婷婷色| 26uuu另类| 欲求不满的人妻| 99热都是精品| 婷婷久久久| 五月天成人免费视频| 色播五月婷婷综合| 色婷婷播放| 丁香婷婷激情五月天无毒不卡蜜桃| CAoub青青超碰| 国产午夜精品一区二区| 久久天天天| 99婷婷精品推荐在线视频| 五月天婷婷高清无码| 婷婷丁香综合在线| www久久99| 色婷婷9| 婷丁香久综合| 性爱激情综合网| 成人免费va| 激情婷婷久久| 精品亚洲国产成AV人片传媒| 五月婷婷六月情| 色婷婷久久综合| 99热亚洲| 婷婷五月天天天| 色色五月天婷婷| 国产精品久久久久9999小说| 天天干天天干天天干天天干天天干| 国产激情在线| 五月天电影网| 庭庭久久内射| 草婷婷在线| 激情骚五月| 91蜜桃婷婷狠狠久久综合9色| 少妇久久诱惑视频| 久久综合伊人77777蜜臀| 国产精品大香蕉| 五月丁香五月激情综合色综合| www.九月婷婷丁香.com| 欧美槡BBBB槡BBB少妇| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 五月综合婷婷久久在线| 色99热| 日韩免费视频| 午夜成人网站在线观看| 丁香色播五月天| 夜夜爱影院| 无码免费人妻A片AAA毛片西瓜| 色五月婷婷久久| 激情久久久| 五月婷九九草| 欧美丰满熟妇BBB久久久| 狠狠人人婷婷| 色情五月天首页| 日本91在线| 日韩啪啪自拍| 中字幕视频在线永久在线观看免费 | 婷婷九九色| 亚洲综合视频网| 婷婷操逼网| 久久婷婷色情7777网站| 伊人爱爱日本| 无码成人AAAAA毛片AI换脸| 天天日天天插| 五月丁香六月婷婷综合网缴情| 久久性操| 色娸娸综合网| 中文字幕亚洲-区久久99婷婷| 色婷婷丁香五月| 久久丝袜婷婷| 天天爱天天秀天天做| 久久99热 这里有精品| 26uuu精品一区二区| 丁香花大香蕉婷婷综合| www.婷婷六月天| 九九黄色网| 亭亭五月丁香五月天激情| 天天日夜夜草进麻麻的子宫| 激情婷婷五月天| 67194中文在线| 五月天综合| 综合99久久天天综合| av网站中文| 丁香五月色播中文在线播放| 婷婷色激情网| 操97在线观看| 亚洲A片成人无码久久精品青桔| 99热这里都是精品| 色五月天中文字幕| 婷丁香久综合| 九九这里只有精品在线视频| 久久性爱视频| 久久五月网| 久热伊人9| 日韩欧美性爱| 丁香五月天社区婷婷| 久久人妻少妇嫩草AV| 成人精品视频99在线观看免费| 五月婷婷综合网| 久婷久婷| 久热 91| 婷婷色在线视频| 九九热在线视频观看| 久久久久人妻精选| 婷婷在线免费| www.久久av.com| 久狠日av| 婷婷综合在线| 婷婷色在线播放| 97婷婷丁香| 丁香五月激情网| 色婷婷综合丁香五月天| 大香蕉人人人| 亚洲激情综| 伊人婷婷大香蕉| 天堂久久婷婷| 色五月婷婷中文字幕在线观看 | www,av好吊操| 天天做天天摸| 六月婷婷色综合| 天天综合精品| 久久六月天| 四虎成人精品永久免费AV九九| 久久伦乱| 婷婷五月天开心网| 无码免费人妻A片AAA毛片西瓜| 欧美精品在线观看| 九九在线91| 小泽玛利亚视频一区二区| 丁香五月天狠狠操| 激情久久综合| 人人干天天操五月丁香| www.99热. com这里只有精品| 婷婷五月深爱五月| 综合性爱网| 色婷婷色99国产综合精品| 99精品在线观看视频| 色停停香蕉视频| 色婷婷综合网| 日韩AC在线免费观看| 久久婷婷综合五月| 伊人五月综合网| 亚洲成人AV在线播放| se99高清无码| 热热久久精品视频| 色婷婷电影网| 五月天色五月| 久操热线| 97在线观视频免费观看| 在线看黄色| 久久HD| 久久午夜理论| 婷婷五月天黄色小说| 91日日日| 97caop| 丁香五月手机视频| 欧美婷婷五月无砖| 婷婷国产欧美97| 欧美综合五月丁香六月婷| 天天肏屄夜夜爽| 欧美va亚洲va在线播放| 武则天精品久久| 成人午夜视频精品一区| 激情图片婷婷丁香五月| www.思思99热| 欧美久久婷婷| 大地9中文在线观看免费高清 | 岛国av网| 9999久久久久| 婷婷丁香精品视频在线观看| 久碰视频| 天天操人人干| AV在线观看网站| 婷婷五月天国产传媒| 超碰色色综合| 中文乱子伦视频| 伊人激情啪啪| 婷婷D区| 五月丁香色色网| 激情五月天色婷婷| 激情綜合W W W,激情五月天| 黄页免费一级视频懂色| 五月天婷婷网站| 婷婷五月六月丁香| 丁香情色五月| 色五月丁香总合网| 色噜噜狠狠色综合成人网| 国产真实乱对白精彩| 久99视频在线观看| 激情五月婷婷五月丁香五月开心五月| 99久久久99久久91熟女| 任你操精品免费| 操熟女成人网| 丁香五月电影| 99在线精品观看99| 婷婷色五天| 婷婷五月丁香五月基地| 激情涩涩网| 91丨九色丨丰满人妖| 狠狠色婷| 六月色五月天天婷婷| 婷婷色导航| AV网站免费在线| 欧美婷婷综合| 99精品丰满| 色高清无码视频| 99热日韩| 91ncm视频| 久久精品人妻| 激情婷婷综合网| 伊人深爱综合| 色五月婷婷在线| 九月婷婷综合| 99久久网站| 国产精品日日躁夜夜躁| 丁香五月在线播放| 日本三级网址| 99综合视频| 香蕉曰比| 人妻VideOssS人妻高清| 婷婷丁香五月天激情四射| 欧洲激情五月天婷婷| 丁香六月婷婷久久综合| 丁香激惜男女| 激情99| 人妻激情视频| 91丨九色丨白浆秘| av在线观看网站| 91色逼| 久热人妻| 26uuu精品国产| 五月丁香六月婷综合成人综合 | 国产精品激情AV久久久青桔| 日在线V视频在线播放| 色婷婷丁香五月| 天天日夜夜B久久| 精品人妻伦一二三区久久| 天天日天天插天天操| 狠狠操狠狠| 成人超碰AV| 久机视频这只有精品| 九九日本视频| 六月丁香久久| anquye伊人| 日本乱子人伦在线视频| 五区毛片七区毛片| 丁香色影院| 色婷婷亚洲| 热中文字幕| 99热啪啪| 黄色99网| 大香蕉伊然在亚洲90| 久久天天| 五月婷婷无码| 国产做爰视频免费播放| 婷婷五月天激情综合深爱激情| 丁香五月婷婷www..com| 狠狠色综合网| 五月色欧洲| 天天综合在线网| 丁香五月色网| 欧美色频| 亚洲夜夜操| 五月天丁香婷婷社区| 天天摸天天肏| 日本色色图| 日本久久婷| 色色网站在线免费观看视频| 狠狠干.com| 色婷六月| 久久这里面只有精品视频| 日本色色影片| 亚洲激情综合| 99热成人精品| 东北黄色一级| 久热9| 日婷婷久久开心| 99精品久久| 熟女人妻一区二区三区免费看| 婷婷五月天伊人网| 婷婷五月天成人在线视频| 黄色片久久| 色欧美影院| 婷婷深爱五月天在线| 丁香婷婷五月人体| 综合网色| 五月婷婷激情综合网| 五月婷婷 激情按摩| 色色欧美色色色| 97碰成超视频免费视频| www.五月天婷婷.com| 66精品成人免费网站在线观看| 国产色五月| 大香蕉九操| 五月开心播播网| 日本 欧美在线| 婷婷五月天亚洲色| 婷婷综合色| 欧美成人AAA片一区国产精品| 在线视频区| 亚洲不卡| 黄色AAAAA| 男女啪啪做爰高潮无遮挡| 99热99天堂| 夜夜天天久久婷婷| 99riAv1国产在线观看| 亚洲乱码日产精品BD| 性色av大香综合| 天天操天天操天天操| 99玖玖免费视频| 久久婷婷六月综合国际| 天天综合色丁香| 五月开心久久| 五月婷婷久久大片| 无码地址| 激情六月综合| 国产肥白大熟妇BBBB视频| 五月婷婷深深爱| 俺也高清无码高清视频| 色一情一乱一乱一区91Av| 欧日韩成人| 五月色影院| 97干干干丁香| 亚洲激情淫网| 激情色色| 久久久99婷婷久久久久久| 丁香五月激情鲁| 99网| 月月AV| 亚洲综合婷婷| 成人亚洲精品| 久久大香蕉同僚| 色婷大香蕉| www激情com| 极骚大香蕉伊人| 丁香婷婷浪潮AV久久综合| 婷婷区日本| 婷婷五月天开心网| 丁香色五月AV在线| 婷婷.com| 五月停停99| 婷婷另类开心| 91超级碰| 色激情综合狠狠婷婷| 综合激情视频| 日韩成人网址| 99热免费精品| 思思久ren热| 色情五月婷婷| 欧亚色色| 97福利视频| 激情五月深爱五月观看| 色色性爱视频| 五月天婷五月天综合网在线观| 五月婷婷五月| 国产伊人五月天| 婷婷五月天网| 五月天另类综合网| 欧美日本免费一道免费视频| 色色丁香婷婷| av人人干| 日韩成人中文字幕| 伊人五月天| 伊人国产婷婷五月天| 一区二区无码视频| 五月天伊人网| 狼人狠狠操| 超碰日日操| 99久久久免费| 激情综合色| 色婷綜合网| 91碰免费视频| 久久人妻精品| 五月天激情综合首页| 秋霞免费视频| 六月丁香VA| 五月丁香六月婷婷成人| 综合激情站| 五月天开心成人网| 亚洲xx在线| 开心婷婷五月| 草操网| 九九精品丁香花| 色色网站在线| 99在线热| 97在线精品| 99色最新在线视频网站| 色色色宗合网| 婷婷成人AV| 天天日日人| 99热最新国内| 婷婷五月电影院| 久久婷婷五月丁香| 久草a片| 一本大道熟女人妻中文字幕在线| 五月天俺去也| 久草A片| 日本乱子人伦在线视频| 日本爆乳片手机在线播放| 丁香五月天导航| 狠狠色噜噜色狠狠狠综合色 | 日韩人人操| 色婷婷欧美| 婷婷五月综合在线视频| 婷婷色色欧美| 精品一区二区三区四区五区六区| 天天草天天摸| 五月天天天开心激情网| 美国天天操无码| 免费无码毛片一区二区A片| 五月天亭亭俺也| 激情q青青草在线婷婷| 狠狠色婷| 婷婷色在线| 99色综合| 午夜丁香五月天综合| 丁香五月天导航| 九9九9无码| 国产毛片精品一区二区色欲黄A片| AVDV久久| 五月天久久成人| 男女99免费视频| 91怕怕网| 丁香8月手机综合| 久久99精品久久只有精品| 五月丁香综合网| 丁香婷停五月激情综合深爱| 久久久婷婷婷| 婷婷五月激情五月丁香五月| 欧美经典片免费观看大全| 六月婷婷综合| 色五月综合婷婷| 日日日,com| 啪啪激情网| 99热精品超碰| 婷婷中文字幕网站| 五月激情在线| 亚洲免费婷婷| 97碰久久| 日日夜夜狠狠| 91精品久久久久久综合五月天| 九九免费在线视频| 蜜臀A∨在线水帘洞| 日韩中文欧美| 日本美女上人| 天天综合久久| 欧美男女婷婷| 182tv992tv人之初午夜免费观看| 色婷婷丁香A片区毛片区女人区| 亚洲色碰| 成人在线综合| 丁香五月在线自慰| 91无码高清| 91丁香五月| 色丁香五月婷婷| 色综合色色| 五月亚洲| 九九99精品视频在线观看| 丁香五月 六月婷婷首页| 99 色色吧| 欧美色狠婷久| 日韩欧美四五区| 五月丁香好婷婷姑娘综合网| 先锋五月婷婷丁香草草| 91色在线/日韩| 超碰在线免费| 五月婷婷与六月丁香图片激情| 色玖玖玖| 久久久久婷| 中文字幕精品在线观看| 第五婷婷伊人丁香色| 五月婷网| 综合久久高清| 婷婷精品性视频| 思思re99视频在线观看| 五月天综合在线观看| 五月天播播中文字幕 | 久99视频在线观看| 欧美色色色色色色色| 午夜成人av在线| CAoub青青超碰| 色色色地址| 综合五月草| 99热这里只有精品69| 日本久久爱| 人人草人人舔| 天天干狠狠| 五月天丁香| 丁香五月天堂婷婷| 9 1大香蕉| 97人妻碰碰碰久久香蕉| av大香蕉| 五月婷网站| 五月天婷婷激情| 成人片在线播放| 人妻无码视频网| 9999热免费视频视频| 91|九色|动漫| 婷婷久久婷婷色五月| 蜜桃五月天| www99在线观看视频| 99成人| 亚洲av电影网站| 欧美性爱日韩性爱| 色色色色色热| 亚洲精品性色| 国产性爱一级| 日日爽夜夜爽| 久久久久久久久久久97| 色之综合网| 激情五月综合| 综合色播| 色黑鬼导航| 久久精品66| 在线成人网址| 99国产精品白浆在线观看免费| 天天婬色综合| 五月婷婷久久综合| 99热在线观看这里只有精品| 亚洲天天操| 国产成人+综合亚洲+天堂| 亚洲av综合在线| 9色在线视频| 夜夜爽日日躁| 99九九在线观看免费| 亚洲国产精品二二三三区 | 丁香婷婷激情网站| www.99久| 国语精品探花| 五月天婷婷在线播放| 色色五月天 亚洲| www.婷婷亚洲基地| 另类五月激情| 九九色婷婷| 99免费青青蜜臀| 五月亚洲激情| 九九热10| 久草 tingting| 偷偷狠狠久久婷婷五月天| 亚洲天码视频www蛋播视频| 欧美婷婷五月丁香| 日本欧美999久久久三级片| 天天综合网色欲香| 五月丁香伊人网| 狠狠综合| a在线免费v| 天天免费日日夜夜夜夜| 激情综合五月婷婷| 欧美性久| 欧美日韩AAAA| XX色综合| 五月深情久久| 天天操天天日天天爽| 在线婷婷| 六月丁香六月婷婷欧美| wwwwww.色| 内射爽无广熟女亚洲| 丁香五月综合婷婷| 天天影视天天爽天天草| www.婷婷| 六月婷婷天天操夜夜爽视频| 可以免费看AV网站| 激情影院免费视频婷婷五月天| 99九九在线| 中文字幕av在线播放| 99视频这里只有精品10| 久草婷| 激情网开心网| 色五月激情五月| 天天爽爽日日做做| 伊人久久婷婷| 五月丁香六月综合基地| 九九热这里只有精品一| 俺也去色| 色丁香五月婷婷婷| 久久九九热视频| 亚洲第一黄网| 激情伊人| 91久久综合亚洲鲁鲁五月天| 日本美女五月天| 色婷婷成人久久| 成年人丁香五月| 免费超碰在线| 干一干xxxx| 97超碰在线免费观看| 五月婷婷六月情| 激情婷婷五月丁香啪啪啪| ss99热| 亚洲啪| 欧美人妻一区二区| 色五月偷偷| 色婷| 五月综合视频在线| 极品少妇高潮啪啪AV无码| WWW夜夜| 免费视频WWW在线观看网站| 丁香 婷婷五月| 欧美性猛交99久久久久99按摩 | 九热视频| 99热青青草| 九九黄色网| WWW·天天操·视频?| 狠狠色婷婷7777久| 五月丁香婷婷综合激情基地| 成人日韩欧美| 深爱五月天 开心网| 五月丁香 狠狠爱| 婷婷综合激情| www.99视频| 久久久激情| 黄页大全十八禁| 国产精品A片在线| 激情综合网激情五月天| 丁香五月综合婷婷| 欧美在线97| 丁香五月天激情网址| 丁香五月欧美婷婷综合| 婷婷播5月| 99ri视频| 精品人妻午夜一区二区三区四区| 丁香五月婷综合网| 日本久久人| 亚洲五月婷| 久久这里只有国产视频| 亚洲第二AV| 五月香婷婷| 视色综合| 香蕉大综综综合久久| 五月天综合网| 久久婷婷激情视频| 亚洲五月婷婷| 久色精品| 欧美啪啪9| 婷婷丁香五月天综合网| 午夜激情四射影院| 91avse| 人人人操B超碰| 激情五月天啪啪| 在线看片h站| 欧美在线视频免费播放| 99热99日…..| 开心五月婷婷综合在线精品素人| 婷婷激情社区| 噜噜色com| 99色啊| 欧美啪啪网| 日韩一区二区A片免费观看| 色综合日日| 色天天综合天天综合频道。 | 插插插丁香五月婷婷| 丁香久久激情俄| 五月激情六月综合| 天天摸人人摸| 婷婷丁香五月天欧美| 欧美 日韩 成人| 超碰天堂网| 五月丁香激情综合啪啪| 色欲五月天| 亚洲熟女色| 亚洲正能量欧美| 五月天激情小说| 久久激情五月婷婷| 人妻自慰高清合集| 五月婷婷六月激情在线| 影视av久久久噜噜噜噜噜三级| 日本黄色一级| av中文在线| 99热只有| 五月色俺婷婷| 可以直接看的av网站| 久99视频| 激情六月婷婷| 色月丁| 五月婷A V在线| 九九色色| 五月天成人综合| 午夜丁香婷婷| 亚洲成人黄色网| 久久九九视频网站| 欧美日韩123| 日熟女| 天天综合网色欲香| 天天日P天天射P| A片试看120分钟做受图片| 久久五月婷| 久久久无码精品成人A片小说| 亭亭五月激情亚洲在线| 婷婷五月蜜桃成人桃色丁香| 五月丁香六月在线欧美| 婷婷操久久| 九洲一级A片| 国产免费一区二区三州老师F1F1……| 婷婷婷狠狠| 国产人妻777人伦精品HD| 人人操AV| 99久在线观看| 婷婷色丁香五月| 丁香五月激情网| www.婷婷六月天| 91大屁股精品| 99re这里只有| 情情五月天色| 久久综合伊人综合在线| 99热香港| 日本精品。999| 色色aⅤ網| xfplayav在线| 九九精品视频在线观看| 26uuu欧美日韩| 99视频超级精品| 婷婷久久五月天亚洲欧美国产日韩在线观看| 亚州色综合| 久久精品91视频| 97热精品| 97热视频| 五月丁香怕啪啪| 九九免费在线视频| 婷婷五月AV| 五月天 无码| 九九色欲网| 综合婷婷| 亚洲色无码A片一区二区麻豆| 欧洲MV日韩MV国产| 碰超亚洲| 一区二区三区四区牛| 在线观看免费狠狠色丁香香综合| 婷婷久久爱| 五月天综合久久丁香91| 久热九九| 思思99精品视频| 99热99热不卡| 五月婷婷五月色| 久久婷婷激情| 激情视频网址| 99精品久久久久久久久| www色婷婷com| 91人人爽狠狠狠| 丁香六月高清视频| 99热这里只有精品18| 任你爽精品免费视频6| 99亚州综合精品成人网| 日韩成人无码| 亚洲美女裸体被操在线观看| 日hao1区| 久久五月丁香婷婷| 婷婷成人综合五月| 婷婷五月天情色| 五月丁香久久| 99精品综合在线| 99热九九这里只有精品| 日本色99| 秋霞少妇AV网站| 色九月国产| 激情综合亚洲| 欧美va亚洲va| 99爱视频在线观看| 欧美日韩成人| 久久久九九视频精品18| 538午夜激情| 五月婷婷丁香在线视频| 97干综合网| 91久久精品国产91性色TV| 亚州婷婷五月激情综合| 97人人操人人干| 极品五月天| 夜夜骑夜夜操| 手机在线日韩视频中文字幕| 国产毛片精品一区二区色欲黄A片| 国产AV影片| 丁香五月婷婷偷拍| 99这里只有免费的精品| 99热日韩| 天天干天天干天天操| 五六月婷婷久久| 99久热| 亚洲热视频在线| 婷色五月| 超碰免费大香蕉| 日本色色色| 99视频内射三四| 久久婷婷色情7777网站| 五月六月丁香激情视频| 天天色综合色| 99久久极情精品一区| 激情五月婷婷色色| 激情小说五月天中文字幕| 9久热在线视频精品| 婷婷五月综合中文字幕| 亚洲丁香五月深爱五月| 99九九99九九九视频精彩| www.久操| 日本五月婷婷久久久六月丁香| 精品色色| 久婷视频| 久久婷婷五月综合色播| 99精彩视频| 亚洲视频在线观看区| 五月天婷婷丁香视频| 五月丁香婷婷色| 91碰碰视频| 91大屁股精品| 激情婷婷视频在线| 丁香五月天色| 综合色情网| 99久久久久久久| 深爱激情六月天| 懂色av粉嫩av蜜臀av| 成久综合视频| 色婷婷电影| 国精产品一区一区三区免费视频| 丁香五月综合婷婷| 亚洲第一成人无码A片| 五月天丁香啪啪啪啪| 一本综合丁香日日狠狠色| 99在线精品免费视频| 性爱先锋AV| 九九操操| www.91婷婷| 日本高清久| 久久久91| 亚洲AV人人操| 伊人超碰| 91丨九色丨大屁股| 色哟哟精品| 97色欧美| 久热欧美| 一起草性爱不卡视频| 无码九九九九| 五月天婷久精视频|