亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

OpenHarmony上Flutter相冊組件適配實(shí)戰(zhàn):從MethodChannel到鴻蒙插件

OpenHarmony上Flutter相冊組件適配實(shí)戰(zhàn):從MethodChannel到鴻蒙插件 在 OpenHarmony 上跑 Flutter 應(yīng)用最能拉開體驗(yàn)差距的就是相冊這種重原生交互的場景。multi_image_picker_view作為 Flutter 社區(qū)里很順手的多圖選擇組件本身提供了一套現(xiàn)成的網(wǎng)格展示、計(jì)數(shù)角標(biāo)、預(yù)覽彈層和刪除交互但底層依賴image_picker這類原生插件。鴻蒙生態(tài)里image_picker默認(rèn)是不工作的直接引入這個(gè)庫要么編譯不過要么點(diǎn)選圖片完全沒反應(yīng)。這次我把multi_image_picker_view從 Dart UI 到鴻蒙原生能力這一整條鏈路完整打通實(shí)現(xiàn)了相冊授權(quán)、多圖選擇、縮略圖列表、大圖預(yù)覽、選圖數(shù)量限制以及相冊增量變化監(jiān)聽整體交互做到了接近原生相冊的流暢程度。整個(gè)過程踩了不少坑這篇就是適配 OpenHarmony 的完整復(fù)盤寫給正在做 Flutter 鴻蒙化改造的同學(xué)做參考。這篇文章涉及的內(nèi)容從 Flutter 平臺通道機(jī)制、鴻蒙插件注冊方式到相冊權(quán)限申請、縮略圖緩存、大圖降采樣都有對應(yīng)的實(shí)現(xiàn)思路和可復(fù)現(xiàn)代碼。即使你對鴻蒙 API 還不熟只要跟著流程走一遍也能把multi_image_picker_view跑起來。當(dāng)然前提是你得先有一個(gè) OpenHarmony 開發(fā)板和對應(yīng)的 Flutter 運(yùn)行環(huán)境。1. 先搞清楚 multi_image_picker_view 到底依賴什么1.1 這個(gè)庫的真實(shí)結(jié)構(gòu)multi_image_picker_view從 pub.dev 拉下來看核心其實(shí)是個(gè) UI 組件。它幫你封裝了一排“已選圖 加號按鈕”的橫向流動布局點(diǎn)擊加號會觸發(fā)圖片選擇選中后回調(diào)一個(gè)ListXFile給你。它不自己去碰相冊所有跟系統(tǒng)相冊打交道的事情都委托給了image_picker。這意味著什么意味著如果你只把它當(dāng)黑盒用在鴻蒙上一定掛。因?yàn)閕mage_picker在 OpenHarmony 上并沒有原生實(shí)現(xiàn)MethodChannel 調(diào)過去之后原生側(cè)無人響應(yīng)Dart 層收不到結(jié)果組件就會卡在“選擇中”狀態(tài)或者直接拋MissingPluginException。我在適配前做的第一件事就是把multi_image_picker_view的源碼完整讀了一遍搞清楚它對外暴露的關(guān)鍵點(diǎn)MultiImagePickerView本身是 Widget初始圖片通過ListXFile? initialImages傳入點(diǎn)擊添加按鈕后內(nèi)部調(diào)用ImagePicker().pickMultiImage()拿結(jié)果每次圖片變化會回調(diào)onImagesChanged這個(gè)回調(diào)是 UI 層刷新和外部業(yè)務(wù)狀態(tài)同步的關(guān)鍵selectionLimit參數(shù)控制最多選多少張預(yù)覽彈層是自繪的純 Dart 實(shí)現(xiàn)不依賴原生。所以這次適配的工程量并沒有想象中那么大預(yù)覽彈層、角標(biāo)、刪除按鈕這些 UI 全部可以保留真正需要替換的只有“從相冊拿圖片”這一層底層實(shí)現(xiàn)。1.2 適配鴻蒙前必須畫清的三條鏈路動手之前我先把要處理的東西拆成了三條鏈路。這個(gè)動作非常有用推薦你也先做一遍觸發(fā)鏈路用戶點(diǎn)“” →MultiImagePickerView內(nèi)部調(diào)用ImagePicker→ MethodChannelpickMultiImage→ 鴻蒙原生拉起相冊選擇器 → 返回圖片 URI 列表 → Dart 層包裝成XFile→ 觸發(fā)onImagesChanged。預(yù)覽鏈路用戶點(diǎn)已選圖 → 彈層 PageView 加載大圖。這條鏈路本身在純 Dart UI 上但如果圖片 URI 是鴻蒙的file://或自定義 schemeImage.network可能加載不了需要統(tǒng)一轉(zhuǎn)換或者寫一個(gè)支持該 URI 協(xié)議的 ImageProvider。狀態(tài)同步鏈路選了幾張、哪幾張是新增、哪幾張被刪除、相冊里圖片變了要不要自動同步。這條鏈路在鴻蒙上最容易出問題因?yàn)?OpenHarmony 相冊不是簡單的“目錄輪詢”它有自己的媒體庫變更通知機(jī)制想做好實(shí)時(shí)刷新必須靠原生事件推送。畫完這三條鏈路你就明白真正的適配工作集中在第一條和第三條鏈路的原生側(cè)UI 層幾乎可以原封不動。2. 鴻蒙端插件架構(gòu)與通道設(shè)計(jì)2.1 為什么必須自己寫原生插件OpenHarmony 目前主流的 Flutter 運(yùn)行方式是把 Flutter 引擎嵌入到 ArkTS/ArkUI 應(yīng)用里的 hybrid 模式。Flutter 部分的 Dart 代碼跑在 Flutter Engine 上但相冊、相機(jī)、地理位置這些系統(tǒng)能力必須通過 ArkTS 側(cè)的系統(tǒng) API 來完成。所以鴻蒙適配的第一步就是擁有一個(gè)能響應(yīng) Dart 側(cè) MethodChannel 調(diào)用的原生插件模塊。OpenHarmony 社區(qū)早期的做法是直接改引擎產(chǎn)物但對應(yīng)用層開發(fā)者來說最穩(wěn)的路徑是用官方提供的 Flutter 插件開發(fā)模板以獨(dú)立模塊的方式維護(hù)一個(gè)插件工程。我從實(shí)際體驗(yàn)來說自己寫插件比在業(yè)務(wù)工程里直接寫window橋接要干凈得多。插件可以獨(dú)立發(fā)布、獨(dú)立測試業(yè)務(wù)側(cè)只通過 Dart 接口調(diào)用后續(xù)換機(jī)型、升 API Level 都只動插件內(nèi)部不會牽一發(fā)而動全身。2.2 MethodChannel、EventChannel 的職責(zé)怎么劃分我這次把通道拆成了三個(gè)各管一攤避免一把梭Channel 名稱類型職責(zé)flutter_mip/photo_pickerMethodChannel權(quán)限申請、讀取相冊列表、批量選擇圖片、獲取圖片詳情flutter_mip/photo_thumbMethodChannel按 size 請求縮略圖字節(jié)流走二進(jìn)制編碼flutter_mip/album_changeEventChannel監(jiān)聽相冊/圖片變化增量通知 Dart 側(cè)刷新為什么縮略圖要單獨(dú)拆一個(gè)通道因?yàn)橄鄡粤斜韯虞m幾百上千張一次性全部回傳必然導(dǎo)致 UI 卡死??s略圖請求是高頻、低延遲、帶大小參數(shù)的給它獨(dú)立通道可以單獨(dú)控制并發(fā)數(shù)、回收優(yōu)先級和編解碼策略。EventChannel 的作用更關(guān)鍵。當(dāng)用戶在系統(tǒng)相冊里刪了一張照片或者外部程序往相冊塞了新圖片Dart 側(cè)需要收到通知后重新拉取數(shù)據(jù)。這件事如果用輪詢性能完全無法接受必須靠原生事件推送到 Dart。2.3 原生側(cè) FlutterPlugin 注冊與生命周期管理鴻蒙插件的注冊方式我以標(biāo)準(zhǔn)的 Flutter 插件模板為例。你需要創(chuàng)建一個(gè)實(shí)現(xiàn)FlutterPlugin接口的類然后在onAttachedToEngine回調(diào)里注冊所有通道import { FlutterPlugin, MethodChannel, EventChannel, MethodCall } from ohos/flutter_plugin; export default class MipPhotoPlugin implements FlutterPlugin { private channel: MethodChannel | null null; private eventChannel: EventChannel | null null; onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding): void { this.channel new MethodChannel(binding.getBinaryMessenger(), flutter_mip/photo_picker); this.channel.setMethodCallHandler(this.handleMethodCall.bind(this)); this.eventChannel new EventChannel(binding.getBinaryMessenger(), flutter_mip/album_change); this.eventChannel.setStreamHandler({ onListen: (args, eventSink) { // 保存 eventSink相冊變化時(shí)回調(diào) }, onCancel: () { // 反注冊相冊監(jiān)聽 } }); } private async handleMethodCall(call: MethodCall): Promiseany { switch (call.method) { case requestPermission: { // 權(quán)限申請邏輯 } case pickMultiImage: { // 相冊選擇邏輯 } default: throw new Error(Unknown method: call.method); } } onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding): void { this.channel?.setMethodCallHandler(null); this.eventChannel?.setStreamHandler(null); this.channel null; this.eventChannel null; } }這里有個(gè)細(xì)節(jié)必須重點(diǎn)說onDetachedFromEngine里一定要把所有 handler 置空并把 channel 引用釋放掉。否則熱重載時(shí)會注冊兩個(gè)相同 channelDart 側(cè)調(diào)用總是命中最先注冊的那個(gè)就會出現(xiàn)“新代碼不生效”的詭異 bug。等應(yīng)用切到后臺再回前臺FlutterEngine 可能經(jīng)歷 detach 和 attach 的周期如果 handler 沒有正確清理還會出現(xiàn)重復(fù)回調(diào)。這塊我建議寫單元測試覆蓋至少保證 attach/detach 兩次后依然能正常收發(fā)。2.4 Federated Plugin 結(jié)構(gòu)把 Dart 與原生實(shí)現(xiàn)徹底解耦如果你只做鴻蒙適配直接在multi_image_picker_view的 fork 里改代碼也行。但如果你的項(xiàng)目還要同時(shí)維護(hù) Android、iOS、Web 端我強(qiáng)烈建議采用 federated plugin 結(jié)構(gòu)。所謂 federated plugin就是把“接口定義”“平臺實(shí)現(xiàn)”“數(shù)據(jù)模型”拆成多個(gè)包。以這次適配為例mip_picker_platform_interface純 Dart定義平臺接口MipPickerPlatformmip_picker_ohos鴻蒙實(shí)現(xiàn)包里面包含 ArkTS 插件和對應(yīng)的 Dart 調(diào)用封裝業(yè)務(wù)側(cè)依賴mip_picker它根據(jù)平臺自動選擇實(shí)現(xiàn)。這樣做的最大好處是multi_image_picker_view的 UI 層完全不用動業(yè)務(wù)側(cè)也不知道底層換了實(shí)現(xiàn)你只需要在mip_picker的工廠方法里通過defaultTargetPlatform判斷運(yùn)行時(shí)平臺返回不同的實(shí)例即可。我來回重構(gòu)了幾次最后這個(gè)結(jié)構(gòu)成了最穩(wěn)的形態(tài)。3. 核心實(shí)現(xiàn)細(xì)節(jié)權(quán)限、相冊讀取、縮略圖與預(yù)覽3.1 相冊權(quán)限申請的正確姿勢OpenHarmony 的相冊權(quán)限不像 Android 那樣統(tǒng)一運(yùn)行時(shí)彈窗它在module.json5里聲明ohos.permission.READ_IMAGEVIDEO后仍然需要運(yùn)行時(shí)請求。我用的是abilityAccessCtrl提供的權(quán)限申請接口import { abilityAccessCtrl, common } from kit.AbilityKit; async function requestAlbumPermission(context: common.UIAbilityContext): Promiseboolean { const atManager abilityAccessCtrl.createAtManager(); const permissions [ohos.permission.READ_IMAGEVIDEO]; const grantResult await atManager.requestPermissionsFromUser(context, permissions); return grantResult.authResults[0] 0; // 0 表示授權(quán)成功 }有個(gè)細(xì)節(jié)很容易踩坑如果應(yīng)用剛啟動就立刻彈權(quán)限框用戶還沒看明白很大概率會拒絕。我的做法是先引導(dǎo)到選圖入口等用戶主動點(diǎn)了“選擇圖片”再發(fā)起權(quán)限請求授權(quán)成功率明顯高很多。另外OpenHarmony 部分版本上READ_IMAGEVIDEO和READ_EXTERNAL_STORAGE是二選一授權(quán)關(guān)系如果同時(shí)申請會導(dǎo)致權(quán)限彈窗沖突。我實(shí)測下來只申請READ_IMAGEVIDEO就夠了系統(tǒng)會把相冊讀權(quán)限連帶處理。3.2 讀取相冊列表的關(guān)鍵參數(shù)讀取相冊數(shù)據(jù)用的是PhotoAccessHelper性能大頭在getAssets接口。它支持分頁式的 FetchOptions我強(qiáng)烈建議不要一上來就全量拉取import { photoAccessHelper } from kit.MediaLibraryKit; const helper photoAccessHelper.getPhotoAccessHelper(context); let fetchOptions new photoAccessHelper.FetchOptions(); fetchOptions.fetchColumns [uri, name, size, date_added, orientation]; fetchOptions.sortKeys [{ key: date_added, descending: true }]; fetchOptions.fetchResult new photoAccessHelper.FetchResult(); fetchOptions.fetchResult.successCount 60; // 先加載一頁滾動到底再分頁這里兩個(gè)參數(shù)要解釋一下fetchColumns字段一定要限定不限定會返回整條記錄相冊有幾千張時(shí)內(nèi)存和序列化開銷都會爆炸successCount是每次拉取的條數(shù)先拉 60 張比較合適后續(xù)滾動到底部再拉下一頁。如果一開始就拉 1000 張縮略圖任何設(shè)備都頂不住。拉取結(jié)果后把每一張的 uri、id、創(chuàng)建時(shí)間返回給 Dart 側(cè)Dart 用列表渲染第一屏。注意縮略圖不要等列表全部返回后再批量請求而應(yīng)該拿到前 60 條 URI 后立刻發(fā)請求邊滾動邊補(bǔ)。3.3 縮略圖內(nèi)存模型與緩存策略這是整個(gè)適配里最影響“絲滑度”的一環(huán)。我的方案是列表頁單張縮略圖尺寸固定為200x200根據(jù) cell 大小動態(tài)計(jì)算但視覺上夠用原生側(cè)getThumbnail(size)返回 PixelMap在原生側(cè)轉(zhuǎn)成 JPEG 字節(jié)流再通過縮略圖通道回傳 DartDart 側(cè)用內(nèi)存緩存管理已解碼的ui.ImageLRU 容量限制在 64MB超限自動回收同時(shí)設(shè)置 Flutter 全局imageCache的maximumSize和maximumSizeBytes防止圖片緩存無限膨脹。代碼示意Dart 側(cè)緩存封裝class ThumbnailCache { static const int maxCacheBytes 64 * 1024 * 1024; final LinkedHashMapString, ui.Image _cache LinkedHashMap( equals: (a, b) a b, hashCode: (o) o.hashCode, ); ui.Image? get(String key) { final image _cache.remove(key); if (image ! null) { _cache[key] image; // 刷新 LRU 位置 } return image; } void put(String key, ui.Image image) { _cache[key] image; int total _cache.values.fold(0, (sum, img) sum (img.width * img.height * 4)); while (total maxCacheBytes) { final firstKey _cache.keys.first; _cache.remove(firstKey)?.dispose(); total _cache.values.fold(0, (sum, img) sum (img.width * img.height * 4)); } } }我實(shí)測下來200 張以內(nèi)的相冊列表第一屏 20 張全部顯示完耗時(shí)大約 400ms后續(xù)滾動時(shí)每一屏的縮略圖都能在滾動結(jié)束后 150ms 內(nèi)補(bǔ)齊。如果低于這個(gè)標(biāo)準(zhǔn)多半是原生側(cè)轉(zhuǎn)字節(jié)流時(shí)用了大尺寸原圖或者 Dart 側(cè)緩存沒生效每次滾動都重新解碼。3.4 大圖預(yù)覽降采樣與分塊解碼大圖預(yù)覽的 OOM 是高頻問題。OpenHarmony 的 PixelMap 本身對超大圖有支持但如果直接加載一張 5000x4000 的照片并轉(zhuǎn)成ui.Image給預(yù)覽頁內(nèi)存直接多出近 100MB路由切換時(shí)大概率崩潰。我的做法是先在原生側(cè)做一次降采樣import { image } from kit.ImageKit; async function loadPreviewImage(fileUri: string): Promiseimage.PixelMap { const imageSrc image.createImageSource(fileUri); const info await imageSrc.getImageInfo(); const targetWidth Math.min(info.size.width, 1600); const targetHeight Math.min(info.size.height, 1600); const pixelMap await imageSrc.createImagePixelMap({ desiredWidth: targetWidth, desiredHeight: targetHeight, desiredPixelFormat: image.PixelMapFormat.RGBA_8888, }); return pixelMap; }降采樣到 1600x1600 以內(nèi)單張大圖的內(nèi)存占用從 90MB 降到 15MB 左右多開兩三張圖緩存也不會掛。如果需要更極致的體驗(yàn)還可以疊加一個(gè)原生側(cè) LRU 緩存把最近查看的 5 張大圖的 PixelMap 緩存住預(yù)覽翻頁時(shí)幾乎零延遲。3.5 UI 層兼容XFile、Image.network 與自定義 ImageProvider鴻蒙相冊返回的 URI 通常是file://media/...這種格式而multi_image_picker_view內(nèi)部預(yù)覽和控制圖片時(shí)用的是Image.network或Image.file。這兩類組件在鴻蒙 URI 上都會失效。我的處理方案是在 Dart 層做一個(gè) URI 適配層把file://media/格式統(tǒng)一映射成自定義的MediaUri協(xié)議比如mip://resolved/123。然后實(shí)現(xiàn)一個(gè)MediaImageProvider它從緩存查圖查不到就走縮略圖通道異步拉取class MediaImageProvider extends ImageProviderMediaImageProvider { final String uri; final int width; final int height; override FutureMediaImageProvider obtainKey(ImageConfiguration configuration) { return SynchronousFuture(this); } override FutureImageStreamCompleter loadImage(MediaImageProvider key, ImageDecoderCallback decode) async { final bytes await MipImageSource.fetchThumbnail(uri, width, height); final buffer await ui.ImmutableBuffer.fromUint8List(bytes); final codec await ui.instantiateImageCodec(buffer); final frame await codec.getNextFrame(); return OneFrameImageStreamCompleter(Future.value(frame)); } }這個(gè) Provider 替換完成之后UI 層所有Image.network的調(diào)用都指向mip://協(xié)議底層走自己實(shí)現(xiàn)的解碼頭。好處是可控性極強(qiáng)緩存、解碼配置、超時(shí)處理都在一個(gè)地方不會再被 Flutter 默認(rèn)的網(wǎng)絡(luò)圖片緩存策略坑到。4. 完整適配流程實(shí)操記錄4.1 環(huán)境準(zhǔn)備與依賴替換先把環(huán)境列出來方便你對照OpenHarmony SDK API 12Flutter 3.22 的 OpenHarmony 分支引擎DevEco Studio 5.x Flutter 插件開發(fā)模板依賴替換上我直接 fork 了multi_image_picker_view把內(nèi)部調(diào)用替換成自己的封裝。pubspec.yaml里這樣引用dependencies: multi_image_picker_view: git: url: https://your-gitlab.example/multi_image_picker_view.git ref: ohos-supportfork 的源碼里只需要改一個(gè)文件把_openPicker()方法中ImagePicker的調(diào)用替換成MipImageSource.pickMultiImage()并確保返回類型一致。這樣業(yè)務(wù)側(cè)不用改動任何代碼。4.2 Dart 端平臺接口設(shè)計(jì)我沒有在業(yè)務(wù)代碼里散落 MethodChannel而是單獨(dú)建了一個(gè)mip_image_source.dart把與原生交互的邏輯全部集中class MipImageSource { static const _pickerChannel MethodChannel(flutter_mip/photo_picker); static const _thumbChannel MethodChannel(flutter_mip/photo_thumb); static FutureListString pickMultiImage({int limit 9}) async { final uris await _pickerChannel.invokeListMethodString(pickMultiImage, {limit: limit}); return uris ?? []; } static FutureUint8List fetchThumbnail(String uri, int width, int height) async { return await _thumbChannel.invokeMethod(fetchThumbnail, { uri: uri, width: width, height: height }); } }Dart 側(cè)的數(shù)據(jù)模型用 URI 字符串作為主鍵比較穩(wěn)妥。注意不要試圖把 PixelMap 或者原生對象直接傳給 Dart跨語言橋接只走可序列化類型否則會觸發(fā)序列化錯(cuò)誤。4.3 鴻蒙端原生實(shí)現(xiàn)核心方法逐段解析原生的關(guān)鍵在pickMultiImage方法里。要做的動作是確認(rèn)權(quán)限拉起系統(tǒng)相冊選擇器返回選中的 URI 列表。這里用了 OpenHarmony 的photoViewHandler它會在應(yīng)用內(nèi)彈出系統(tǒng)級多選界面選完直接返回結(jié)果。這個(gè)方案比自繪網(wǎng)格多選框省事得多并且和系統(tǒng)相冊 UI 完全融合private async pickMultiImage(call: MethodCall): Promisestring[] { const context getContext(this) as common.UIAbilityContext; await this.ensurePermission(context); const photoSelectResult await photoViewHandler.select({ MIMETypes: [photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE], maxSelectNumber: call.arguments[limit] ?? 9, isPhotoTakeSupported: true, }); const uris: string[] []; photoSelectResult.photoSelectResult.forEach(item { uris.push(item.uri); }); return uris; }這里有個(gè)細(xì)節(jié)isPhotoTakeSupported我開了這樣用戶在系統(tǒng)選擇界面可以直接切相機(jī)拍照體驗(yàn)上比返回 Flutter 再調(diào)相機(jī)要連貫很多。如果你不希望用戶混選把它設(shè)為false即可。ensurePermission的實(shí)現(xiàn)需要緩存一個(gè) Promise避免用戶連續(xù)點(diǎn)擊時(shí)重復(fù)觸發(fā)權(quán)限彈窗。我在第一次請求未完成時(shí)后續(xù)請求直接復(fù)用同一個(gè) Promise等結(jié)果出來再統(tǒng)一交給兩個(gè)調(diào)用方。4.4 接入 multi_image_picker_view 并替換數(shù)據(jù)源fork 之后業(yè)務(wù)側(cè)的用法和原庫完全一致MultiImagePickerView( initialImages: _selectedImages, selectionLimit: 9, onImagesChanged: (images) { setState(() _selectedImages images); }, )initialImages里放的是XFile對象。我額外做了一步在進(jìn)入頁面時(shí)預(yù)先調(diào)MipImageSource.pickMultiImage(limit: 0)只讀列表不拉選擇器把相冊前 60 張的縮略圖信息預(yù)熱到緩存這樣用戶真正點(diǎn)開選擇器時(shí)系統(tǒng)相冊頁面的返回速度會快不少。4.5 性能驗(yàn)證與三輪調(diào)優(yōu)記錄適配完之后我做了三輪調(diào)優(yōu)每輪都有明確指標(biāo)第一輪是縮略圖并發(fā)。原生側(cè)默認(rèn) 12 個(gè)并發(fā)內(nèi)存抖動明顯滾動有掉幀。我降到 4 個(gè)并發(fā)并用隊(duì)列控制滾動體感穩(wěn)定了很多。第二輪是緩存優(yōu)化??s略圖加了一個(gè) 64MB 的 LRU滾動回看圖片不再重復(fù)加載也沒有白閃。第三輪是事件合并。EventChannel 推送相冊變化時(shí)Dart 側(cè)做 300ms 的 debounce把多次通知合并成一次刷新避免用戶連續(xù)刪兩張圖導(dǎo)致列表刷兩次。實(shí)測數(shù)據(jù)OpenHarmony 開發(fā)板 / 麒麟平臺選取 9 張圖全流程平均耗時(shí) 2.8s含權(quán)限彈窗與用戶選擇等待相冊列表首屏 1.2s縮略圖滾動無掉幀大圖預(yù)覽滑動幀率穩(wěn)定在 55fps 以上。注意以上數(shù)據(jù)是單次適配的實(shí)測記錄不同設(shè)備和系統(tǒng)版本會有差異。你適配時(shí)建議先固定一套基準(zhǔn)測試對比調(diào)優(yōu)前后數(shù)據(jù)再決定哪些優(yōu)化要做。5. 實(shí)戰(zhàn)中踩過的坑與排查技巧5.1 權(quán)限回調(diào)丟失第一次適配時(shí)發(fā)現(xiàn)用戶點(diǎn)了允許Dart 側(cè)卻沒有收到任何回調(diào)。查了半天原來是requestPermissionsFromUser的結(jié)果沒有通過普通 Promise 返回而是依賴回調(diào)事件。解決方式是封裝一個(gè)帶回調(diào)轉(zhuǎn) Promise 的請求函數(shù)function requestPermissionWithCallback(context: common.UIAbilityContext, permissions: string[]): Promisenumber { return new Promise((resolve) { context.on(requestPermissionsFromUserResult, (result) { resolve(result.authResults[0] ?? -1); context.off(requestPermissionsFromUserResult); }); abilityAccessCtrl.createAtManager() .requestPermissionsFromUser(context, permissions); }); }記得在回調(diào)之后立即off掉監(jiān)聽否則下一次請求會觸發(fā)兩個(gè)回調(diào)造成狀態(tài)混亂。5.2 相冊監(jiān)聽回調(diào)不觸發(fā)EventChannel 的相冊變化監(jiān)聽在 API 12 上要注意注冊時(shí)的上下文生命周期。如果你在onAttachedToEngine時(shí)拿到的 context 是宿主應(yīng)用的 context 而不是 UIAbility 的 contextphotoAccessHelper的on(photoChange)可能不會觸發(fā)。解決辦法從插件 binding 里先取 UIAbilityContext優(yōu)先用 UIAbilityContext 注冊監(jiān)聽。另外事件流建立之后要注意在onCancel里反注冊否則切后臺再回前臺會重復(fù)監(jiān)聽同一變化通知兩次Dart 側(cè) debounce 也擋不住重復(fù)刷新。5.3 大圖滑動返回時(shí)白屏這個(gè)坑很隱蔽。我用降采樣后的 PixelMap 生成字節(jié)流傳給 Dart但用戶如果滑動得很快多次請求的返回順序不一致就會導(dǎo)致圖片串位或者白屏。嚴(yán)格解決方案是每次請求帶一個(gè)requestIdDart 側(cè)收到結(jié)果后校驗(yàn) id 是否對應(yīng)當(dāng)前展示頁不是就丟棄final response await _thumbChannel.invokeMethodMap(fetchThumbnail, { requestId: currentPageIndex, uri: uri, width: width, height: height, }); if (response[requestId] currentPageIndex) { setState(() _currentImage response[bytes]); }這個(gè)方法同樣適用于相冊列表的滾動場景只不過列表場景的 requestId 是 cell 的位置。5.4 臨時(shí)文件殘留與緩存清理鴻蒙相冊返回的 URI 有些是臨時(shí)選擇路徑長時(shí)間使用會在系統(tǒng)相冊里留下空殼或緩存文件。我會在每次選擇完成后把返回的 URI 統(tǒng)一轉(zhuǎn)成持久可讀路徑并做一套文件生命周期管理應(yīng)用退出時(shí)清理預(yù)覽緩存目錄超過 7 天的臨時(shí)縮略圖文件自動清除每次選擇完成后主動刪除只在上一次會話中使用的臨時(shí)路徑。這塊雖然不影響功能但會影響應(yīng)用在系統(tǒng)存儲里的衛(wèi)生程度。很多審核和用戶體驗(yàn)問題都是這種細(xì)節(jié)累積出來的。5.5 常見問題速查表問題現(xiàn)象可能原因排查與解決點(diǎn)加號后無反應(yīng)原生插件未注冊或 MethodChannel 名稱不一致檢查onAttachedToEngine是否執(zhí)行通道名是否與 Dart 側(cè)一致MissingPluginException插件 detach 后未重新 attach檢查onDetachedFromEngine是否清理了 handler權(quán)限彈窗反復(fù)出現(xiàn)權(quán)限結(jié)果回調(diào)未處理或重復(fù)注冊監(jiān)聽用 Promise 封裝回調(diào)后off掉監(jiān)聽縮略圖滾動卡頓并發(fā)過高或緩存未生效并發(fā)降到 4檢查 Dart 側(cè) LRU 緩存大圖預(yù)覽白屏返回順序不一致增加 requestId 校驗(yàn)相冊新增圖片列表不刷新監(jiān)聽未注冊或用錯(cuò) context改用 UIAbilityContext確認(rèn)photoChange回調(diào)觸發(fā)選擇多張圖后返回耗時(shí)長全量拉取列表改用分頁預(yù)取前 60 條縮略圖6. 這個(gè)方案還能怎么擴(kuò)展multi_image_picker_view這套適配思路跑通之后我把它沉淀成了一個(gè)內(nèi)部通用的“相冊服務(wù)模塊”。后續(xù)如果要繼續(xù)擴(kuò)展可以直接在原生側(cè)加方法視頻選擇復(fù)用photoViewHandler.select把 MIMEType 改成VIDEO_TYPE返回 Duration 信息自定義裁剪在原生側(cè)拿到選中 URI 后用image.createImageSource再做一次裁剪和轉(zhuǎn)碼返回新的 URI文件路徑持久化將臨時(shí) URI 轉(zhuǎn)存到應(yīng)用沙箱目錄用photoAccessHelper的getPhotoAccessHelperAPI 拿可寫路徑相冊分組按albumName字段分組在 Dart 側(cè)實(shí)現(xiàn)二級折疊列表。這些擴(kuò)展都繞不開一個(gè)核心把原生能力做好接口抽象讓 Dart 側(cè)只依賴穩(wěn)定協(xié)議。只要這一點(diǎn)做扎實(shí)任何上層 UI 組件都能在鴻蒙上跑得很順暢。最后分享一個(gè)實(shí)際體會越早把“自帶 UI 組件 原生能力橋接”這個(gè)問題解耦后面的適配工作就越輕松。不要覺得加入一個(gè)大而全的框架一通兼容就行鴻蒙的相冊 API 有自己的生態(tài)特點(diǎn)老老實(shí)實(shí)按媒體庫模型去設(shè)計(jì)通道跑出來的效果才是最穩(wěn)的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产v亚洲v日韩v欧美v片另类| 日韩欧美女优电影| 欧美色图偷拍另类| 色逼综合| 水野优香在线观看| 日韩欧无码一区二区三区免费不卡| 亚洲熟女中文字幕在线| 中出91视频| 脫衣舞一区二区三区| 超碰在线974| 日韩兔费看黄片| 鲁鲁色综合网| 92一区二区| 五月丁香综合啪啪| 色吊丝 日日骚 清纯唯美| 亚洲福利中文字幕在线| 78m成人视线| www.超碰| 欧美少妇人妻| 禁止观看美女黄| 大象AV在线| 精彩视频日韩| 亚瑟国产精品久久无码| 欧美18 在线观看| 成人贴图日韩欧美| 青娱乐欧美激情一区二区| 九九九久千久久激情蜜桃在线看 | 久久夜夜| 五月天亚洲网| 巨爆乳肉感一区二区三区竹菊影视| 亚洲文学偷乱拍啪啪啪啪 | 强歼乱伦资源网| 天天操人人操骚逼网站| 太久视频| 亚洲天天自拍| 理论久久婷婷网 8| 人人人摸人人| 欧美性天天影院| 日本操逼二区| 欧美性第1页| 探花激情视频| 狠狠操夜夜| 91精品人妻啪啪间| 欧日韩不卡视.频| 国产精品熟女一区二区三区| 久草久热| 日本熟女中文字幕一区| 婷婷激情四射| 蜜屁Av| 国产激情在线| 欧美色狠| 中文字幕人乱码中文字的预防方法| 欧美日韩一区二区三区四区蜜桃| 综合97| 久久久久9999妇女| 九九色影院| 欧美色网| 淫穴高潮色图| 亚洲国产综合久久天堂| 思思热在线观看| 3PAV乱伦视频| 亚洲天堂一区二区| 欧美一级欧美三级在线观看| 91久久精品中文字幕| 精品夜夜澡人妻无码AV| 欧美精品 - 91爱爱| 欧洲一级性爱视频在线观看| 综合色好色| 日日夜夜青青草母狗| 亚洲中文字母在线播放| 成人自拍三级在线观看| 久久久精选| 抽查国产福利主播| 日韩欧美麻豆大片| 91网站在线播放| 狠狠操狠狠插| 欧亚乱色熟女一区二区| 黄片视频观看| 亚洲深夜福利| 少妇丝袜在线观看AV| 九九黄色网| 巨爆乳一区二区爆乳区| 超碰2017| 视频二区美腿制服人妻欧美| 久久久网一区| 欧美亚洲美少妇一区二区| 91超级碰碰碰| 家庭乱伦网站国产| 69av一区二区三区| 欧美色青| 久久久久久九| 少妇久久久| 呻吟 欧美 日本 中出| 国产精品对白内射| 九热视频| 亚洲国产麻豆一区二区三区| 蜜乳Av成人片网站| 色综合av综合久久| 欧美日韩精品久久久久久久久东北老熟妇| 97网址97| 亚洲和欧美裸体美女双飞视频| 五月天婷婷基地| 黄色在线网站| 脫衣舞一区二区三区| 日本人妻最新在线中| 久久大香蕉97| 久久久久久久久久久久97| 日日骚精品视频| AV老汉| 欧美性天天影视| 国产亚洲禁久一区二区| 国产麻豆福利av在线播放| 韩日色费| 家庭乱伦国产| 无码人妻丰满热妇又大又粗| 国产精品自在自拍视频| 中文字幕一区电影在线观看| 亚洲一级性爱视频免费看| 级做a爱无码性色永久免费| 精品视频在线观看| 亲子敌伦对白在线播放| 天美麻豆精品视频99| 久久精品色欧美aⅴ一区二区| 最新中文字幕精品在线| 欧美人妻久久精品二区三区| 大香网站| 99日精品欧美国产| 一区在线国产播放| 国产又爽又黄| 婷婷五月天社区| 色99在线| 中日无幕一二三四区| 玖玖人人爱| 美女露胸露奶头| 啊啊啊啊啊在线观看网址| 91女网站| 美女AV一区二区| 免费久久9999| 97中文字幕九区| 日韩大香蕉AV影片| 欧美亚洲情色| 日韩Va亚洲va欧美Ⅴa久久| 国产一在线观看| 中文字幕交换人妻| 色噜噜综合在线| 精品少妇一区二区三区免费观看| wwe 天天干.com| 精品人妻一区春色| 安微少妇操BBB| 日韩成人小视频| 特污精品女优骚货黄色视频在线免费观看| 国产97在线视频| 91AV入口| 人人摸人人干人人拍97| 操91| 亚洲欧洲无码97久久精品| 亚洲美女 晚间男人天堂 | 免费精品人妻一区二区三| av日韩国产一区二区| 黄色av一区二区在线| 五月激情天| 亚洲、日韩、综合、另类| 日本一天色道久久久精品视频| 97精品国产精品免费观看| 四虎在线免费视频| 色欧美色交综合| 超碰色综合| 日婷婷| 亚洲黄色网址视频| 3P丝袜熟女 色综合| 国产精品乱码久久久| 蜜臀久久久99久久久久 | 一区在线观看中文字幕| 亚洲AV乱码专区国产噜噜亚洲 | 香蕉免费一区二区三区不读| 欧美97av| 欧洲精品一级二级精品综合视频综合| 91精品无码久久久久久久| 操逼天美3区| 亚欧性爱在线无码| 中文字幕一区二区三区蜜臀| 亚洲在钱| 日韩三级伊人| 国模无码一区二区三区在线| 曰本精品久久久| 污污污8888| 天天综合~91| 欧洲特黄毛片免费看欧洲毛片| 1级黄色夫妻对换性交免费看| 亚洲制服欧美另类内射| 欧美少妇大量自拍视频在线观看| 免费成人在线熟妇网| 亚洲 欧美 日韩另类 麻豆| 极品综合| 日日夜夜天天| 欧洲精品久久| 麻豆精品一区二区三区四区免费观看| 91操人| 九九毛片这里只有精品| 五月天精品| 国产91av在线播放| 天天干天天操天天拍| 黄色十八禁| 久久二| 日韩午夜精品一区二区三区电影| 最新AVzaixian| 久久夜精品一区二区三区| 青娱乐国产剧情av一区| 人人爱操| 一区超碰一区| 激情抓乳插进去啪啪啪日韩 | 国产精品人人爽人人做可爱福利| 精品一区二区啪啪啪| 中文字幕文字幕无码一区二区三区电影99| 欧美亚洲天堂| 天天影视综合网欧美精品| 97精品国产精品免费观看| 亚洲图片欧美色| heyZO天然素人无码AⅤ专区| 超碰97精品在线| 超碰97综合网| 日韩性爱播放| 精品中文日韩字幕视频| 亚洲无码国产精品久久| 青娱乐亚洲热| 欧美欧美啪啪视频| 天天综合网~69| 婷婷人妻激情| 国产精品午夜高潮呻吟久久av| 天天操夜夜嗨| 91欧美偷拍| 啪啪自拍九九综合| 中文字幕成人| 992视频一区| 超碰人人超在线观看| 欧美白嫩在线放| 精品国产Av无码久久久伦古装| 久操婷婷| 九九热精品视频六| 91操人| 日本高清视频在线观看黄已三辽| 日本欧美一区二区三区免费| 99爱爱| 岛国网址国产 | 国产操逼视频在线观看| 欧美视频激情久久久久久| 国产高清成人免费视频| 不卡超碰护士AV在线免费播放| 在线天堂资源亚洲| 99精品在线观看| 日韩在线观看AV| 欧美三级中文字幕hd| 91超碰碰在线| 国产人妖视频一区在线观看| 欧美第二页午夜| 黄色高清无码无码破解免费暗网| 国产丝袜高跟美女av免费观看| 欧美成人A天堂片在线观看| 91国产美女丝袜足交精品视频| 国产精品免费1区2区视频| 欧美 青青草| 久久久久久综合久久伊人蜜月| 九九无码久久精品视频| 伊人热综合| 99蜜桃臀亚洲成人在线观看| 亚洲 欧美 偷拍 唯美| 欧美国产有色电影| 手机在线观看不卡无码av| 日韩国产九九精品一区二区三区毛片| 国产四虎在线| 天天操人人操狠狠插| 天天色怡春院| 97摸视频| 国产精品九九九| 国产精品久久久蜜臀| 美女熟妇色| 日韩操呦呦影院在线观看| 留下AⅤ黄色片| 九九九精品美女| 超碰在线974| 黄呦呦在线| 国内毛片婷婷六月色| 97超碰国产亚洲精品| 人人操人人狠狠操| 青娱乐黄色录像| 91在线丝袜视频| HEYZO高无码国产精品227| 久久老熟女| 中文字幕少妇色 | 日本蜜桃| 东北女人| 欧美精品成人亚洲| 亚洲色图第四色| 久久精品国产精品一区| 五月婷婷色| 精品无人区麻豆乱码久久久| 精品久久97| 日本人人操人人操| 久久久九九九九| 在线人成亚洲视频免费观看| 97超碰美国| 国产精品ww久久| 亚洲人在线| 久久啊啊| 日韩免费人妻色情网站| 男人精品区| 啊啊啊啊嗯嗯嗯用力好爽 | 久九九九九九九九热| 国产黄色av大片网站| 久久色AV线| 色官网色综合| 久久风骚城市| 天天摸,夜夜摸| 亚洲在线欧美| 伊蕉97蜜桃97狠狠综合干| 福利视频一区二区微拍| 国产精品夜夜| 久久久久久久久久久久久久久性生活视频 | 亚洲日韩黑丝| 麻豆久久久一区二区| 中文字幕精品一区欧美| 在线播放欧洲免费av| 香港成人一级视频在线青青草| 91麻豆天美| 欧美另类色图片| 欧美亚综合色图| 日韩性爱电影一区| 香蕉欧美| 青青草影视蜜久久| 日韩精品大香蕉伊人在线| 夜夜嗨一区二区| 国产多人在线观看视频| 99精品九九九九九九| 久久久一热在线播放| 熟女色综合久久| 热思思免费视频| 亚州色图欧美色图| 久草老司机| 大香蕉中文aV在线| Julia在线播放亚洲久久| 收看日本人日bb| 欧美中文综合| 国产日本久久免费精品| 级做a爱无码性色永久免费| 久久久久久久| 亚洲午夜蜜臀| 91久久伊人婷婷青青草| 一区二区偷拍拍视频| 国产小视频91| 伊欧美综合视频| 国产人妖视频一区在线观看| 亚洲成?V人片在线观看福利| 二男一女成人A片| 国产91影院| 亚洲激情视频| 日日爱99| 人人操 欧美| 人妻天天爽天天爽三区| 大学生口爆吞精| 成人国产视频在线观看| 超碰97中文| 色综91| 欧美97色| 99无码狠狠久久| 亚洲日本激情| 欧美黄色大香蕉一区二区| 美女操逼福利视频| 久久一级无码精品毛片6| 家庭乱伦性爱av| 男女激情黄色网址| 亚洲综合激情五月久久| 97蜜桃综合| 日本999精品| 老熟妇一区二区三区啪啪| 日韩美女,国产传媒,视频一区| 91丨九色丨国产丨人妻在线| 久艾草在线精品视频在线观看| 日本日逼高清| 久久女人一区二区三区| 国产精品天干天干综合网麻豆| 91美女視頻| 人妻 欧美亚洲| 精品一区二区三区麻豆| 亚洲国产婷婷在线播放| 日韩卡一卡二卡三在线| 亚洲综合激情五月久久| 熟女欧美日韩综合婷婷| juliaann丝袜| 国产高清MV操逼视频| 中文字幕 国产区| 超碰 另类 欧美 | 久久久久13| 97久久免费| 欧色网址| 秋霞蝌科网日本一区| 欧美精品在线观看| 欧美 色 亚洲| 开心五月婷婷激情| 亚洲天堂日本| 国产精品午夜AV完会免费| 欧美极度丰满熟妇hd| 啊啊啊啊啊操我视频| 麻豆成人AV| 亚欧国产无码精品在线| 亚洲色人妻综合| 智利AV在线网| 一起草日韩| 中美日韩毛片| 男女啪啪网站免费视频| 116美女午夜| 九九九不卡| 国产Aα| 精品人妻夜夜草| 亚洲人妻五月丁香婷婷| 91一起操| 殴美牲| 亚洲色宗合| 精品国产网站| 国产捆绑一区| 欧美一级A一级a爱片久久| 五月婷婷激情| 国产91影院| 香港成人一级视频在线青青草| 日韩性爱小视频| 中文字幕 av v| V A在线| 97干色天堂| 中文字幕在线观看永久| 天天天堂影视日韩亚洲91| 日本在线视频导航| 欧洲亚洲人妻无码久久三区四区| 日本免费亚洲欧美| 天天干18禁| 中文字幕在线观看第二页| 麻豆国产精品午夜视频| 日韩精品国模| 刺激性视频黄页| 无码外流操逼视频| 欧美在线大香999| 久9热| 久久性生大片免费观看性| 免费成人在线熟妇网| 国产高清MV操逼视频| 大屁股熟女一区二区三区| av片在线观看免费播放| 在线免费观看高清无码视频| 亚洲图片欧美另类综合免费视频大大香| 九九99久久| 无码最新| 收看日本人日bb| 超碰4A| 亚洲精品天天影视综合网 | 国产精品人妻免费精品| 97国产综合欧美| 一区二区日韩欧美久久| 影音先锋乱伦资源| 美女诱惑一区| 超碰97综合在线| 欧美日韩另类字幕中文| 丝袜美腿诱惑亚洲欧美视频在线观看| 久草国产在线视频| 亚州综合在线| 超碰色大香蕉| 亚洲 中文 欧美 日韩 在线| 久啪| 久久久久久久久久久999| 黄色av一区二区在线| 夜草网站| 丰满人妻-区二区三区| rivers-china.com| yazhouzaixian| 日韩精品影视| 亚洲综合九| 九九热精品在线| 色婷婷香蕉| 无码自拍SM| 2020国产精品| 日韩精品一二三四| 情色日播放AV| 操穴国产| 亚洲视频,小说| 欧美精品 - 91爱爱| 97超碰色屌| 成人在线午夜视频一区| 99国内熟女露脸视频| 日日夜夜草草草| 91欧美美女日韩国产婷婷| 中文字幕少妇色| 国产精品福利视频| 一级婬片120分钟试看| 成·人免费午夜在线观看| 亚洲另类春色| 国产精品一区av在线| 日韩黄色一区二区三区| 黑丝内射一区二区三区| 精品.99999| 97人人爱人人做人人乐| 人人爽人人精品乱人伦AV| 超碰久草| 亚洲av性爱电影| 老熟女乱子伦中文字幕一区二区| 九久9精品| 色老汉色| 久久色AV线| 欧美AB在线| 国产精品久久久久久久AV大片 | 黄片qw| 亚洲精品无码少妇久久| 国产极品999| 日韩淫色网| 欧美精品97| 亚洲激情综合另类男同| 婷婷五月天福利| 老司机午夜精品福利视频一区二区| 午夜毛片亚洲精品片国产久久久| 睡产熟女乱伦| 国产成自自拍在线观看| 久久久久99999| 久久久亚洲高清不打码| 超碰79人人乐| 婷婷九月丁香| 国产一级作爱毛片| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产精品免费日韩| 日韩伦理视频| 天天上日日上日韩精品| 不卡超碰护士AV在线免费播放| 欧美线天码中字| 亚欧免费| 美女毛片999| 国产在线综合网| 蜜臀久久一区二区| 色约约一区=区三区| 岛国片国产成人亚洲播放| 欧美熟女妇同| 免费?级毛片无码?∨蜜芽试看| 91欧美长吊| 91成人久久| 亚州熟妇精品| 乱伦av.com| 久久9精品网站| 天天综合网站| 在线日韩精品一区二区三区| 丰满少妇一区二区三区专区| 国产主播福利| 超碰97首页| 中文字幕在线免费观看视频| 好涩综合| 国产精品久久久久久久久久久久久久久久久久 | 亚洲第一页欧美| 精品中文字幕第一页| 久久机热| 9 9精品一区二区三区| 另类天堂| 日本中文字幕一区| 99热网站| 国产毛片在线| 亚洲在饯| 动漫区日韩区欧美区| 国产综合永久精品日韩鬼片| 人妻铁牛TV| AV色五月天| 天天色粽合合合合合合合| 久久精品黄色| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 大香樵伊人网| 欧美专区日本专区| 91天天| 国产精品电| 97操97色| 人妻激情偷乱视频一区二区三区| 国产人妖的免费的视频| 亚洲精品熟妇1区2区3区。| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 蜜臀国产AV中文字幕| 日韩无码操逼片| 色妺妺AⅤ| 呻吟 欧美 日本 中出| 欧美少妇性乱| 欧美成不卡网| 亚洲欧美国产日本一区二区三区| 免费人成在线观看网站品爱网| 亚洲九九九| 女人香蕉久久毛毛片精品| 金典av| 天天综合香 ld视频| 97超碰色五月| 东北黄色电影| 97电影院超碰| 亚洲综合另类| 男人的天堂亚洲| 激情综合五月| 五月丁香色综合| 欧美成人一级免费电影| 中国AV美女| 亚洲人天堂| 久久岛国| 久久久精品网站| 亚洲欧美不卡线| 亚洲色图一区二区三区| 国产精品久久| 亚洲黄色视频在线观看视频| 人人贴人人摸| 秋霞无码av鲁丝片一区| 黄色电影观看久久9| 欧美一区二区福利在线| 2019天天干天天操| 情侣操 逼视频99| 亚洲欧美精品福利在线| 亚洲aV性爱| 你懂得91| 天天日少妇逼AV| 91男女啊啊啊| 久久久中文版| 欧美人妖内射| 久久久久久亚洲Av无码| 人妻啪| 天堂种子在线www网资源| 久久久国产三级黄色片| 婷婷五月天久久精品视频一区二区三区| 日韩天堂av电影在线观看| 求求你操操我| 99999亚洲| 国产精品毛片?v一区二区三区| 色牛牛AV| 久九九九九九九热| 久艹99| 国产拍偷精品网站| 狠狠干综合| www.AV有限公司一区| 黄站在线免费观看| 亚洲 小说 欧美 激情 另类| 国内自拍 日韩激情 99| 亚州熟妇精品| 亚洲丝袜诱惑| 亚洲精品aa久久伊人| 青青草黑寡妇男人天堂| 丝袜视频网国产90| 国产强奸乱伦xd| 91久青| 97超碰欧美精品| 自偷自拍的亚洲视频| 麻豆传媒一区二区在线观看| 国产91影院| 丝袜 亚洲 偷拍| 草B在线| 人人操人人摸人| 亚洲欧美一区二区不卡视频播放| 啊啊啊啊啊在线| 国产丝袜视频| 欧美超碰97| 色婷婷丁香五月| 超碰视97中文| 国产操逼逼网| 亚洲男人的天堂网| 亚洲精品国产熟女| 操人妻逼91| 一道α片欧美| 嗯~啊~快点 死我视频| 91肉丝| 欧美美女啪啪视频| 妇女性内射冈站HDWWWCOM| 91在线|亚| 国产精品第一页国产大屁股视频免费区 | 婷婷色色五月天福利| 亚州情色j区| 3PAV乱伦视频| 日韩传媒在线| 93人人操人人| 99999国产| 国产精品交换一区二区| 欧美91精品国产自产| 亚洲日韩青青草色月| 亚洲色色探花| 97伊人超碰| 精品视频日日夜夜| 91丨九色丨国产丨人妻在线 | 夜夜嗨绯色| 激情婷婷| 99久久精品无码一区二区毛片免费 | 91欧美综合在线| 综合色色婷婷| 懂色Av| 伊人色综合欧美| 色性荡荡荡荡视频| 日本在线播放不卡一区| 欧美夜夜草视频| 亚洲系列欧美| 91欧美长吊| 丁香五月综合| 久久精品久久久久久久久| 久久精品人妻一区二区三区| 日本有码影片下载| 熟女色综合久久| 久久精品店| 国产久久日| 青青青操| 亚欧国产无码精品在线| 俄罗斯一区二区视频在线观看| 精品国产乱码久久久影院| 欧美色997| 婷婷综合视频| 人人操人人狠狠操| 无码人妻精品一区二区中文| 精品无码秘 人妻一区二区| 操淫穴亚洲五月丁香| 青娱乐 成人娱乐在线| 亚洲国产欧美一区二区潘金莲| 人妻熟女一区二区| 99热在线不卡| 欧美熟女少妇| 99成人| 97色在线| 很很干很很操| 精品九区| 国产嫩草精品A88AV| 男人天堂导航| 天天综合网~91| 极品少妇久久久久| 精品国产乱码久久久久久久| 99av| 操一操摸一摸| 久综合国内精品自在自线| 收看日本人日bb| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 8050无码八戒| 欧美日韩成人在线| 亚 欧 美 综合| 国产有码一区| 久久国产对白激情浪潮| 日本午夜福利视频| 美女AV一区二区| 搡老女人老91妇女熟女| 日本精品加勒比海一区| 久久久性爱| 欧美色图色综合| 久久综合亚洲色1080p| 色婷久久| 嗯阿好爽好紧| 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 加勒比大香蕉视频在线| 熟妇熟女一区二三区| 欧美色日| 啊啊啊啊啊在线| 日韩乱伦AⅤ| 狠狠爱综合网| 免费超碰97久久| 久久伊人影院| 思思热久久成人| 人妻啊啊人妻啊| 超碰在线成人电影| 国产激情视频一区区三区| 国产精品无码av| 国产少妇肉丝在线观看| 天天爽夜夜欢视| 超碰久草| 欧美 日韩 国产传媒| 色婷婷日韩精品一区二区三区| 校园春色综合网| 欧美日韩性爱精品| 九一性生活免费视频| 肏逼福利网站| 人妻少妇色综合| 成人一区二区三区四区| 久久亚州精品成人Av无| 丁香五月激情综合| 欧美在线干| 成年人黄色小视频网站| 欧洲一区二区三区免费| 久久在肏| 激情综合五| 天堂性色| 亚洲偷拍自拍在线视频| 91AV天堂| 无码黑人精品一区二区三区三| 麻豆精品A片免费观看| 大JI巴好深好爽又大又粗视频| 91超级碰碰| 亚洲性天堂| 狼人综合婷婷激情四射| 最新AV在线| 丁香五月天啪啪| 色妺妺AⅤ| 五月天偷拍| 青草成人免费视频一COm| 亚洲天堂中文字幕无码男同| 欧美—性—交—色| 色色婷| 欧美色图第一页| 熟啊v色欧美热| 三级特黄60分钟播放| 男人的天堂无码| 免费啪啪啪网站18岁| 亚洲综合在线91| 激情综合五月| 女性喷水高潮在线观看| 自拍亚洲综合| 99综合视频一体| 97在线视频网站| 蜜臀AV成人精品蜜臀| 亚洲av综合色区无码一| 男人的天堂一区| 人妻酒店出差被中出免费在线播放| 天天干天天操天天干天天操| 日韩精品人妻中文字幕不卡乱码| 青青草视频久久| 久久亚洲AV无码专区国产精品| 蜜臀va69| 超碰97网址| 4399成人黄A片| 成人av福利在线观看| 91精品久久久久| 亚洲综合夜色| 国产大片精久久久久久| 大香蕉一线视频| 国产无码精品成人| 青娱乐妇女性生活| 国产精品3| 78久久久| 欧美成人精品一区二区三区| 欧美在线观看综合国产| 情趣丝袜无码操逼视频| 我想要 啊 啊 啊| 国产精品乱码久久久久久| 午夜精品久久久久久久99热影院| 五月天激情小说| 韩国黄色片精品久久久 | 国产成人五月天丁香花| julia中文字幕在线观看| 骚货人妻偷情自拍在线视频| 久久99亚洲精品久久99果| 久久首页| 天天谢天天干| 被男人吃奶很爽的毛片| 成人性爱AV在线免费观看| 国产1024在线播放| 精品无码久久久久久久杏吧| 91国模| 一区二区三区麻豆| 成人小电影网站tex| 午夜一区| 日本一区二区三区四区五区六区七区八区九区| 久九9精品| 国产91丝袜 在线播放| 热G综合热G中文| 超碰欧美97资源| 欧美亚洲首页| 亚洲人妻日日日| 国产精品96| 日产欧美电影一区二区三区| 免费国产电影一区二区| 成人乱人伦一区二区| 色综合av男人天堂| 国产亲戚伦亲在线| 亚卅熟女乱色| 女色视频社区| 性老妇一区二区三区| 99re在线视频国产| 啊啊啊好大好深| 国产综合日韩伦理| 精品高清一区二区三区三州| 自拍偷拍2025在线观看| 99在线精品观看99| 免費人妻夜夜爽天天爽爽一区| 久久夜嗨| 夜色91| 欧美亚洲第一页| 亚洲操逼网| 色 亚洲 91| 天天综合网~91| 级做a爱无码性色永久免费| 成人网址在线观看| 久偷拍| 农村妇女精品一二区| 插入逼91| 日本久久天堂| 你草精品在线视频| 亚洲一区二区av| 黄色片,com| 久久女人视频| 丝袜视频网国产90| 综合av社区| 久久久蜜桃一区二区三区| 欧美日动态视频| 好吊色综合| 色狠狠色| 大香蕉色欲AV| 俄罗斯一区二区视频在线观看| 九九成人| 老鸭窝日丰县女人| 人人做天天爱| 欧美色图天堂网m| 久久久久久久九九九九| 97香蕉碰碰人妻国产欧美| 天天摸天天舔天天操| 综合网亚洲| 蜜臀久久99精品久久综合| 97操B| 日韩一级片在线看| 熟女露脸激情自拍视频| 亚洲五码一区二区三区| 国产1727欧美| 乱伦日本色图AⅤ| 偷拍视频青青草在线视频| 91在线无码精品秘 软件| 欧美成人一区二区| 中文字幕国产| 精产国品一区二三产品| 99久久久无码国产精品性啊聊| 亚洲综合五月天婷婷丁香| 久久久久婷婷精品av电影| 亚洲精品一二区| 欧美少妇高潮久久91| 青娱乐国产精品| 伊人久久亚洲色欲综合网站 | 日韩人妻资源网| 日韩精品资源专区二区| 日韩情色AV| 操操逼操操逼操操逼逼| 91观看 国产白丝| 欧美色棕合| 国产精品区在线12p| 亚洲日本天堂| 婷婷久热| 91被操| 久热久| 国产欧美日韩在线不卡第一页| 91精品在线播放| 色婷婷亚洲婷婷| 国产精品爆乳懂色蜜乳| 人妻五十路在线| 天天天天干| AAAA欧美日韩| 欧美日韩精品久久久久东北老熟妇| 成人在线视频二区| 久久精品久久九九精品| 五月天日日操夜夜操| 狠狠搞 亚洲91| 日韩午夜啪啪视频| 国产免a费看黄片在线| 欧美加勒比| 大香蕉伊然在亚洲91| 99自拍B亚洲 | 日韩欧洲操屄视频| 欧美色图欧美| 91在线丝袜| 动漫片子网站3黄| 99re久久| 99久久久无码国产精品性男| 91丨九色丨国产丨人妻在线 | 99超碰碰| 色偷偷综合91久久噜噜| 东京太热久久久| 99在线免费视频| 自拍偷拍 高清无码| 日本一道在线播放高清| 色与欲影视天天看综合网| 天操老女人| 伊人991| 黄色高清久久无码依人| 久久婷婷色综合一区二区三区| 小情侣高清国产在线视频| 亚洲日韩美国人妻| 欧美强奸一区二区诱惑| 再深点灬舒服灬太大了添视频| 欧美一级AAAAAAA| 国产av激情无码久久天堂| 中文字幕精品免费一区二区| 91九九| 91在线视频国产网站| 青青草中文字幕| 日韩精品在线放| 国产精品久久久久久久久久梁医生| 日本伦乱九九九综合| 中日韩免费看男女操逼大全| 国产午夜精品理论片一二三区区| 国产无马在线| 天堂俺去俺来也www久久婷婷| 91快色色色色色| 亚洲第一成人影院色播| 亚洲色啪| 后入美女国产| 欧美熟妇人体| 国产精品电| 色逼综合| 波多野42部无码喷潮在线观看| 把腿张开老子CAO烂你| 国产超碰人人操| 97天天爽| 中出后入| 国产农村妇女精品| 亚洲另类小说卡通动漫| 超碰在线成人| 四虎永久在线精品免费网址| 91久久久老司机| 欧美96在线|欧| 亚洲色系另类精品国产| 激情综合五月婷婷| 天天内射| 精品久久久久久久| 亚洲制服aⅴ中文字幕| 五月丁香啪| 亚洲色图 图片| 无码国产精品96久久久久孕妇| 天天天天天天天天天天干美女| 99超级碰免费视频| 欧美熟妇操操视频| 蜜臀久久久99久久久久 | 成人日本精品九区| 啪啪啪综合| 亚洲熟女中文字幕在线| 亚洲图片欧美制度| 大肥女高潮bbwbbwhd视频| 国产成人精品日本视频| 欧州激情视频在线一区二区| 欧美天天干| 婷婷97| 超碰综合97在线| 日韩综合无码色欲vv| 亚州综合电影| 日本一级特级毛片视频| 涩五月婷婷| 国产又长又大又粗的视频| 探花一区二区三| 国产精品91ai| 亚洲av无码成电影在线播放| 超碰在线人妻不卡| 成人97人人超碰人人| 色婷婷综合久久中文字幕雪峰| 91爱| 男人的天堂网免费| 国产成人五月天丁香花| 欧美亚洲中文字幕| 国产人妻久久精品一区二区三区| 久久 国产精品 一区| 亚洲资源吧| 91大学精品激情戏| 中文操逼字幕| 97超碰逼| 欧美日韩免费性爱| 色诱中文字幕| 欧美人人曰人人操人人射射| 亚洲欧美97√| 色色国产| 超碰97人妻免费在线| 97色涩| 开心婷婷五月| 成人免费视瓶| 精品无码一区二区三区| 婷婷五月天伊人| 成人乱人伦一区二区| 九九免费影片| 日韩熟女精品无码专区一区二区| 8x福利精品第一福利视频导航| 啊啊啊久久久视频| 91操人| 第四色奇米影视777| 高清孕妇孕交 交孕妇| 亚洲天天艹| 永久免费发布性爱网| 久操97| 99久在线精品99re8| 哈哈操电影AV| 久9视频| 伊人久久综合精品欧美| 亚洲综合嫩| 欧美色图人妻| 欧美老妇女内射网址| 天天爽天天爽| aⅴ日韩成人电影av在线免费看av大全| 久久精品黄色| 久久精品六区| 97久久天天综合色天天综合色电影| 亚洲夜色在线| www久久久| 成人性爱美曰韩| wwwxxx日本爽| 黑人娇小av在线播放| 啊啊啊啊啊好多水| 舔人妻中文免费视频| 天美传媒av一区二区| 9精品在线| 欧美另类自拍| 亚洲男人的天堂V| 91ise欧美| 熟妇人妻一区二区三区| 日日日日日| 91校园春色长篇| 免费精品99| 人妻精品综合中文字幕在线| 超碰97欧美在线| 夜夜一区二区| 激情综合五月丁香| 97碰在线视频| 亚洲日韩国产欧美综合v| 黄色无码高清黄色无码网站| 东北女人高潮视频| 国产精品久久久久婷婷二区次| 外国免费性情大片| 猛猛干| 亚洲 中文字幕 精品| 7777奇米影视久久| 中文字幕交换人妻| 五月天玖玖资源站| 毛片电影一区二区三区| 长长久久免费视频| 中文字幕55555| 丰满精品人妻少妇久久字幕| 97网址97| 人妻91少妇| 操逼逼一区视频| 久久久久成人亚洲国产| 一本道综合色图| 亚洲三级网址久久最新| 精品美女人人干| 中文久久久| 精品久久久久av影院| 国内三级自拍小视频在线观看 | 日本成人电影资源网| 深夜操逼网| 天堂涩涩| 婷婷五月天激情四射| 国产家庭乱伦表演| 熟女突然公开看18禁影片| 激情自拍 校园春色| 自拍亚洲综合| 蜜桃狠狠色伊人亚洲综合网站| 国产熟女完整版中字| av中文字幕在线熟女| 亚洲国产中文字幕| 国产三级在线现体验区| 久久99网站| 91美女視頻| 久久永久无码人妻视频| 欧美91久久久久| 夜夜爽夜夜高潮夜夜爽| 最新日产中文在线麻豆| 九九久久久久久爱| 免费一级视频特黄色大片| 97国产色图 | 亚洲日韩欧美一区二区| 亚洲老司机123专区| 玖玖久久久| 婷婷激情五月天小说网| 蜜臀精品1区2区| 亚洲性高潮| 国产精品自在线发布| 91久久久视| 久久春色| 色啪网| 日日骚 av| 97精品国产| 99九九久久| 欧洲亚洲综合| 亚洲精品毛片在线观看| heyZO天然素人无码AⅤ专区| 性色综合网| 首页中文字幕中文字幕免费| 久久超碰大香蕉| 人妻天天爽天天爽三区|