日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 集成Chrome 浏览器内核 Crosswalk

發布時間:2023/12/20 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 集成Chrome 浏览器内核 Crosswalk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Crosswalk 內核的興起與消亡

Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView

但實際上,由于 Android 的碎片化問題(大量存在不同的 Android 系統版本,并且各個廠商對內置應用進行定制化,有可能用的不是最新的瀏覽器內核)。這就導致 WebView 在真實環境中對 API 的支持根本無跡可尋,越發混亂。

Android 碎片化問題集中表現在下面幾個方面:

  • 設備繁多,硬件配置參差不棄,設備性能各異,差距很大
  • 品牌眾多,廠商標準不一致,定制化系統體驗不同
  • 版本各異,國內外系統環境差異巨大
  • 分辨率不統一,各種類型尺寸眾多

隨著混合開發的興起,前端對 API 的支持程度和網頁的表現效果都有了更嚴格的要求,原生WebView 由于碎片化嚴重,API支持程度未知,容易引發很多意料之外的BUG。

這時候,就誕生了一些第三方瀏覽器內核

  • Intel 開源的基于 Chrome 的 Crosswalk 內核 和 XWalkView 瀏覽器(2017年5月停止維護)
    https://github.com/crosswalk-project/crosswalk
    https://github.com/tenta-browser/crosswalk

  • 騰訊出品的 X5 瀏覽器內核
    https://x5.tencent.com/tbs/sdk.html

從 Android 5.0 開始,Google 把 Chromium blink內核 webview 作為 apk 單獨從系統抽離出去,可以在應用市場(Google Play)上面接收安裝更新。應用可以直接使用該webview內核,Google也可以及時發布更新,不用再通過更新系統才能更新瀏覽器內核,也避免部分了 Android 系統碎片化問題。

因此 Intel 的 Crosswalk 就停止維護了。然而由于國內被墻,并沒有接入谷歌服務,因此 騰訊X5 內核 還流傳至今,并且被廣泛的應用

集成原因

現在代的手機上,原生的 webkit 內嵌的谷歌內核版本并不是很統一,這就導致了有些手機支持的API到另一個手機,又不支持了。為了達到體驗一致,也方便測試,我建議在國內,盡量使用騰訊X5進行替換,X5的API和原生的基本一致,僅需要改動較小的部分。

那么corsswalk,一個包40M,是不是就毫無用處了呢?答案是否定的,crosswalk現在多用于集成到
智能設備中。智能設備的網絡不一定好用,更別說安裝QQ微信了,而且即使安裝了,也不一定支持騰訊X5,因為現在還是有部分手機無法兼容X5轉而降級為原生瀏覽器內核的。

集成方式

添加依賴

可以在項目根路徑下的 build.gradle 中添加,針對所有module

buildscript {repositorities {……} } allprojects {repositories {……maven { url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'}} }

兩個位置的 repositories 的區別

  • buildscript 里是 gradle 腳本執行所需依賴,分別是對應的 maven 庫和插件
  • allprojects 里是項目本身需要的依賴
  • 也可以僅在對應 module 的 build.gradle 中添加 respositories,然后再添加對應依賴

    android { } repositories {maven { url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'} } dependencies {implementation 'org.xwalk:xwalk_core_library:23.53.589.4' }

    注意:添加依賴后不可能一次就同步成功,需要多同步好幾次

    申請權限

    在 AndroidManifest.xml 中添加如下權限聲明

    <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    開啟硬件加速

    從Android3.0(API Level 11)開始,Android 2D渲染管道k開始支持硬件加速(默認是關閉的)。

    可以在 AndroidManifest.xml 中,為 Application 添加屬性,開啟全局硬件加速

    <Application……android:hardwareAccelerated="true" >…… </Application>

    硬件加速執行的所有的繪圖操作,都是使用GPU在 View 對象的畫布上來進行的。因為啟用硬件加速會增加資源的需求,因此這樣的應用會占用更多的內存。

    為了讓應用能申請使用更多的內存,還需要添加一個 largeHeap 屬性。機器的內存限制,在/system/build.prop文件中配置的,例如

    dalvik.vm.heapsize=128m dalvik.vm.heapgrowthlimit=64m

    heapgrowthlimit 是一個普通應用的內存限制,用ActivityManager.getLargeMemoryClass() 獲得的值就是這個。而 heapsize 是在 manifest 中設置了 largeHeap=true 之后,可以使用最大內存值。

    習慣性的為應用多申請一點內存,可以使用如下代碼

    <Application……android:hardwareAccelerated="true"android:largeHeap="true" >…… </Application>

    布局文件

    <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><org.xwalk.core.XWalkViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

    測試代碼

    XWResourceClient.java

    public class XWResourceClient extends XWalkResourceClient {private static final String TAG = "XWalkResourceClient";public XWResourceClient(XWalkView view) {super(view);}@Overridepublic void onLoadStarted(XWalkView view, String url) {Log.i(TAG, "onLoadStarted " + url);super.onLoadStarted(view, url);}@Overridepublic void onLoadFinished(XWalkView view, String url) {Log.i(TAG, "onLoadFinished " + url);super.onLoadFinished(view, url);}@Overridepublic void onProgressChanged(XWalkView view, int progressInPercent) {Log.i(TAG, "onProgressChanged " + progressInPercent);super.onProgressChanged(view, progressInPercent);}@Overridepublic boolean shouldOverrideUrlLoading(XWalkView view, String url) {Log.i(TAG, "shouldOverrideUrlLoading " + url);return super.shouldOverrideUrlLoading(view, url);}@Overridepublic WebResourceResponse shouldInterceptLoadRequest(XWalkView view, String url) {Log.i(TAG, "shouldInterceptLoadRequest " + url);return super.shouldInterceptLoadRequest(view, url);}@Overridepublic XWalkWebResourceResponse shouldInterceptLoadRequest(XWalkView view, XWalkWebResourceRequest request) {Log.i(TAG, "shouldInterceptLoadRequest " + request.isForMainFrame() + ", " + request.getUrl() + ", " + new JSONObject(request.getRequestHeaders()).toString());return super.shouldInterceptLoadRequest(view, request);}@Overridepublic void onReceivedSslError(XWalkView view, ValueCallback<Boolean> callback, SslError error) {Log.i(TAG, "onReceivedSslError " + error.toString());super.onReceivedSslError(view, callback, error);}@Overridepublic void onReceivedLoadError(XWalkView view, int errorCode, String description, String failingUrl) {Log.i(TAG, "onReceivedLoadError " + errorCode + ", " + description + ", " + failingUrl);super.onReceivedLoadError(view, errorCode, description, failingUrl);}@Overridepublic void onDocumentLoadedInFrame(XWalkView view, long frameId) {Log.i(TAG, "onDocumentLoadedInFrame " + frameId);super.onDocumentLoadedInFrame(view, frameId);}@Overridepublic void onReceivedClientCertRequest(XWalkView view, ClientCertRequest handler) {Log.i(TAG, "onReceivedClientCertRequest " + handler.getHost() + ", " + handler.getPort() + ", " + Arrays.toString(handler.getKeyTypes()));super.onReceivedClientCertRequest(view, handler);}@Overridepublic void onReceivedHttpAuthRequest(XWalkView view, XWalkHttpAuthHandler handler, String host, String realm) {Log.i(TAG, "onReceivedHttpAuthRequest " + host + ", " + realm);super.onReceivedHttpAuthRequest(view, handler, host, realm);}@Overridepublic void onReceivedResponseHeaders(XWalkView view, XWalkWebResourceRequest request, XWalkWebResourceResponse response) {Log.i(TAG, "onReceivedResponseHeaders " + request.isForMainFrame() + ", " + request.getUrl() + ", " + new JSONObject(request.getRequestHeaders()).toString());super.onReceivedResponseHeaders(view, request, response);}@Overridepublic XWalkWebResourceResponse createXWalkWebResourceResponse(String mimeType, String encoding, InputStream data) {Log.i(TAG, "createXWalkWebResourceResponse " + mimeType + ", " + encoding);return super.createXWalkWebResourceResponse(mimeType, encoding, data);}@Overridepublic XWalkWebResourceResponse createXWalkWebResourceResponse(String mimeType, String encoding, InputStream data, int statusCode, String reasonPhrase, Map<String, String> responseHeaders) {Log.i(TAG, "createXWalkWebResourceResponse " + mimeType + ", " + encoding + ", " + statusCode + ", " + reasonPhrase + ", " + new JSONObject(responseHeaders));return super.createXWalkWebResourceResponse(mimeType, encoding, data, statusCode, reasonPhrase, responseHeaders);}@Overridepublic void doUpdateVisitedHistory(XWalkView view, String url, boolean isReload) {Log.i(TAG, "doUpdateVisitedHistory " + url + ", " + isReload);super.doUpdateVisitedHistory(view, url, isReload);}@Overrideprotected Object getBridge() {Object obj = super.getBridge();if(obj != null) {Log.i(TAG, "getBridge " + obj.getClass().getSimpleName());} else {Log.i(TAG, "getBridge()");}return obj;} }

    XWUIClient.java

    public class XWUIClient extends XWalkUIClient {private static final String TAG = "XWalkUIClient";public XWUIClient(XWalkView view) {super(view);}@Overridepublic void onPageLoadStarted(XWalkView view, String url) {Log.i(TAG, "onPageLoadStarted " + url);super.onPageLoadStarted(view, url);}@Overridepublic void onPageLoadStopped(XWalkView view, String url, LoadStatus status) {Log.i(TAG, "onPageLoadStopped " + url + ", " + status.toString());super.onPageLoadStopped(view, url, status);}@Overridepublic boolean onJsAlert(XWalkView view, String url, String message, XWalkJavascriptResult result) {Log.i(TAG, "onJsAlert " + url + ", " + message);return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsConfirm(XWalkView view, String url, String message, XWalkJavascriptResult result) {Log.i(TAG, "onJsConfirm " + url + ", " + message);return super.onJsConfirm(view, url, message, result);}@Overridepublic boolean onJsPrompt(XWalkView view, String url, String message, String defaultValue, XWalkJavascriptResult result) {Log.i(TAG, "onJsPrompt " + url + ", " + message);return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic boolean onConsoleMessage(XWalkView view, String message, int lineNumber, String sourceId, ConsoleMessageType messageType) {Log.i(TAG, "onConsoleMessage " + message + ", " + lineNumber + ", " + sourceId + ", " + messageType.toString());return super.onConsoleMessage(view, message, lineNumber, sourceId, messageType);}@Overridepublic void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {Log.i(TAG, "onShowCustomView " + requestedOrientation);super.onShowCustomView(view, requestedOrientation, callback);}@Overridepublic void onShowCustomView(View view, CustomViewCallback callback) {Log.i(TAG, "onShowCustomView");super.onShowCustomView(view, callback);}@Overridepublic boolean onCreateWindowRequested(XWalkView view, InitiateBy initiator, ValueCallback<XWalkView> callback) {Log.i(TAG, "onCreateWindowRequested");return super.onCreateWindowRequested(view, initiator, callback);}@Overridepublic boolean onJavascriptModalDialog(XWalkView view, JavascriptMessageType type, String url, String message, String defaultValue, XWalkJavascriptResult result) {Log.i(TAG, "onJavascriptModalDialog " + type.toString() + ", " + url + ", " + message + ", " + defaultValue);return super.onJavascriptModalDialog(view, type, url, message, defaultValue, result);}@Overridepublic void onFullscreenToggled(XWalkView view, boolean enterFullscreen) {Log.i(TAG, "onFullscreenToggled " + enterFullscreen);super.onFullscreenToggled(view, enterFullscreen);}@Overridepublic void onHideCustomView() {Log.i(TAG, "onHideCustomView");super.onHideCustomView();}@Overridepublic void onIconAvailable(XWalkView view, String url, Message startDownload) {Log.i(TAG, "onIconAvailable " + url + ", " + startDownload.toString());super.onIconAvailable(view, url, startDownload);}@Overridepublic void onJavascriptCloseWindow(XWalkView view) {Log.i(TAG, "onJavascriptCloseWindow");super.onJavascriptCloseWindow(view);}@Overridepublic void onReceivedIcon(XWalkView view, String url, Bitmap icon) {Log.i(TAG, "onReceivedIcon " + url);super.onReceivedIcon(view, url, icon);}@Overridepublic void onReceivedTitle(XWalkView view, String title) {Log.i(TAG, "onReceivedTitle " + title);super.onReceivedTitle(view, title);}@Overridepublic void onRequestFocus(XWalkView view) {Log.i(TAG, "onRequestFocus");super.onRequestFocus(view);}@Overridepublic void onScaleChanged(XWalkView view, float oldScale, float newScale) {Log.i(TAG, "onScaleChanged " + oldScale + ", " + newScale);super.onScaleChanged(view, oldScale, newScale);}@Overridepublic void onUnhandledKeyEvent(XWalkView view, KeyEvent event) {Log.i(TAG, "onUnhandledKeyEvent " + event.getAction() + ", " + event.getKeyCode());super.onUnhandledKeyEvent(view, event);}@Overridepublic void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile, String acceptType, String capture) {Log.i(TAG, "openFileChooser " + acceptType + ", " + capture);super.openFileChooser(view, uploadFile, acceptType, capture);}@Overridepublic boolean shouldOverrideKeyEvent(XWalkView view, KeyEvent event) {Log.i(TAG, "shouldOverrideKeyEvent " + event.getAction() + ", " + event.getKeyCode());return super.shouldOverrideKeyEvent(view, event);}@Overrideprotected Object getBridge() {Object obj = super.getBridge();if(obj != null) {Log.i(TAG, "getBridge " + obj.getClass().getSimpleName());} else {Log.i(TAG, "getBridge()");}return obj;} }

    MainActivity.java

    public class MainActivity extends XWalkActivity {private XWalkView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);webView = findViewById(R.id.webview);// Crosswalk's APIs are not ready yet}@Overrideprotected void onXWalkReady() {initSettings();webView.setUIClient(new XWUIClient(webView));webView.setResourceClient(new XWResourceClient(webView));webView.addJavascriptInterface(new AppShell(this), AppShell.TAG);webView.loadUrl("http://www.baidu.com");}@Overridepublic void onPointerCaptureChanged(boolean hasCapture) {}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);if(isXWalkReady()) webView.onNewIntent(intent);}@Overrideprotected void onPause() {super.onPause();if(isXWalkReady()) {webView.pauseTimers();webView.onHide();}}@Overrideprotected void onResume() {super.onResume();if(isXWalkReady()) {webView.resumeTimers();webView.onShow();}}@Overrideprotected void onDestroy() {super.onDestroy();if(isXWalkReady()) {webView.onDestroy();}}@Overridepublic void onBackPressed() {if(isXWalkReady()) {XWalkNavigationHistory history = webView.getNavigationHistory();if (history.canGoBack()) {history.navigate(XWalkNavigationHistory.Direction.BACKWARD, 1);} else {super.onBackPressed();}} else {super.onBackPressed();}}/*** 沒有允許定位的設置*/public void initSettings() {XWalkSettings webSettings = webView.getSettings();//啟用JavaScriptwebSettings.setJavaScriptEnabled(true);//允許js彈窗alert等,window.open方法打開新的網頁,默認不允許webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//localStorage和sessionStoragewebSettings.setDomStorageEnabled(true);//Web SQL DatabaseswebSettings.setDatabaseEnabled(true);//是否可訪問Content Provider的資源,默認值 truewebSettings.setAllowContentAccess(true);/*是否允許訪問文件系統,默認值 truefile:///androMSG_asset和file:///androMSG_res始終可以訪問,不受其影響*/webSettings.setAllowFileAccess(true);//是否允許通過file url加載的Javascript讀取本地文件,默認值 falsewebSettings.setAllowFileAccessFromFileURLs(true);//是否允許通過file url加載的Javascript讀取全部資源(包括文件,http,https),默認值 falsewebSettings.setAllowUniversalAccessFromFileURLs(true);//設置是否支持縮放webSettings.setSupportZoom(false);//設置內置的縮放控件webSettings.setBuiltInZoomControls(false);/*當該屬性被設置為false時,加載頁面的寬度總是適應WebView控件寬度;當被設置為true,當前頁面包含viewport屬性標簽,在標簽中指定寬度值生效,如果頁面不包含viewport標簽,無法提供一個寬度值,這個時候該方法將被使用。*/webSettings.setUseWideViewPort(false);//縮放至屏幕大小webSettings.setLoadWithOverviewMode(true);//支持多窗口webSettings.setSupportMultipleWindows(true);/*緩存模式LOAD_CACHE_ONLY 不使用網絡,只讀取本地緩存LOAD_DEFAULT 根據cache-control決定是否從網絡上獲取數據LOAD_NO_CACHE 不使用緩存,只從網絡獲取數據LOAD_CACHE_ELSE_NETWORK 只要本地有,無論是否過期,或者no-cache,都使用緩存中的數據*/webSettings.setCacheMode(XWalkSettings.LOAD_DEFAULT);//設置是否加載圖片webSettings.setLoadsImagesAutomatically(true);//允許遠程調試XWalkPreferences.setValue("enable-javascript", true);XWalkPreferences.setValue(XWalkPreferences.REMOTE_DEBUGGING, true);} }

    生命周期

    XWalk 內核加載的生命周期

  • 預加載 xwalk 內核
  • 將共享的XWalk內核與當前Activity綁定
  • public static void reserveReflectObject(Object object) {String tag = (String)sReservedActivities.getLast();Log.d("XWalkLib", "Reserve object " + object.getClass() + " to " + tag);((LinkedList)sReservedActions.get(tag)).add(new XWalkCoreWrapper.ReservedAction(object)); }
  • 在Activity中初始化XWalk內核

  • 解壓、激活、將內核附著在Activity上

  • 下載模式禁用
    下載模式和共享模式差不多,只是共享模式是把APK下載下來當成一個應用安裝到手機上,而下載模式干脆把APK下載到自己的私有目錄下,把所有的so文件、資源解壓出來保存到自己的內部私有目錄下只供自己使用。

  • 通過反射,api版本是否等于lib版本(mApiVersion == minLibVersion)

  • private boolean checkCoreVersion() {Log.d("XWalkLib", "[Environment] SDK:" + VERSION.SDK_INT);Log.d("XWalkLib", "[App Version] build:23.53.589.4, api:" + this.mApiVersion + ", min_api:" + this.mMinApiVersion);try {Class<?> clazz = this.getBridgeClass("XWalkCoreVersion");String buildVersion = "";try {buildVersion = (String)(new ReflectField(clazz, "XWALK_BUILD_VERSION")).get();} catch (RuntimeException var5) {}int libVersion = (Integer)(new ReflectField(clazz, "API_VERSION")).get();int minLibVersion = (Integer)(new ReflectField(clazz, "MIN_API_VERSION")).get();Log.d("XWalkLib", "[Lib Version] build:" + buildVersion + ", api:" + libVersion + ", min_api:" + minLibVersion);if (XWalkEnvironment.isDownloadMode() && XWalkEnvironment.isDownloadModeUpdate() && !buildVersion.isEmpty() && !buildVersion.equals("23.53.589.4")) {this.mCoreStatus = 8;return false;}if (this.mMinApiVersion > libVersion) {this.mCoreStatus = 3;return false;}if (this.mApiVersion < minLibVersion) {this.mCoreStatus = 4;return false;}} catch (RuntimeException var6) {Log.d("XWalkLib", "XWalk core not found");this.mCoreStatus = 2;return false;}Log.d("XWalkLib", "XWalk core version matched");return true;}
  • 打印出,當前庫是基于ARM架構編譯的。當前設備是arm64-v8a,使用嵌入模式運行
  • 搭建環境、初始化內核、初始化視圖,激活任務執行完畢,開始在 SurfaceView 上進行繪制。
  • 函數用途
    getBridgeXWalkUIClient 和 XWalkResourceClient 獲取反射的對象
    shouldInterceptLoadRequest攔截請求,在這里可以使用緩存
    onPageLoadStarted、onPageLoadStopped頁面加載開始、結束,可以用來做自定義定時器
    onLoadStarted、onLoadStopped頁面中的元素加載開始和結束
    onReceivedResponseHeaders處理接收的頭部
    shouldOverrideUrlLoading用來處理意圖
    doUpdateVisitedHistory更新訪問歷史記錄
    onReceivedTitle收到標題

    遇到的問題

    1. Crosswalk‘s APIs are not ready yet


    首先, org.xwalk.core.XWalkView 控件,只能在 XWalkActivity 里,也就是當前 Activity 必須繼承自 XWalkActivity。

    對 XWalkView 的設置,只能 onXWalkReady 里。

    在 Activity 的生命周期函數中調用 XWalkView 的方法需要先判斷是否初始化完畢。

    2. Mismatch of CPU Architecture


    so分32位和64位!

    理論上官方應該提供2種包含不同so的aar包。一種是32位的另一種是64位,32位的aar中只包含x86和armeabi-v7a兩種so文件,同理64位的包中只包含x86_64和arm64-v8a兩種so文件。

    由于arm64-v8a平臺能兼容32位的so文件、x86_64也能兼容32位的x86 so文件,在不考慮性能(暫時未知性能問題)的情況下就可以直接集成32位的aar包,可以大大減少安裝包的大小。

    騰訊X5的話,是僅支持32位的。我猜測 crosswalk 應該也是這個問題,因此僅集成32位即可。

    因此可以在 module 的 build.gradle 中添加如下內容

    android {defaultConfig {ndk {abiFilters 'armeabi', 'armeabi-v7a'}} }

    然后,再跟騰訊 X5 的做法一樣,在 src/mian/jniLibs/armeabi-v7a 目錄下,創建一個空的 so

    3. 文件選擇的問題

    在 HTML5 中共有 4 種選擇文件的方式,代碼如下

    <label>下面是選擇文件</label> <input type="file" name="filename" /><label>下面是通過攝像頭獲取文件</label> <input capture="camera" id="cameraFile" name="imgFile" type="file"><label>下面是打開攝像頭拍照</label> <input accept="image/*" capture="camera" id="imgFile" name="imgFile" type="file"><label>下面是打開攝像頭錄像</label> <input accept="video/*" capture="camera" id="videoFile" name="imgFile" type="file">

    在 CrossWalk 中對應的函數是 XWalkUIClient.java 中的 openFileChooser。如果主動不觸發回調函數,即為未選擇,那么內部會一直處于等待的過程中,即使下一次點擊選擇文件,也不會有響應。

    public void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile, String acceptType, String capture) {…… }

    獲取文件(文件、拍照、相冊、錄像)

    序號acceptTypecapture含義
    1false獲取文件
    2true打開攝像頭獲取文件
    3image/*true打開攝像頭拍照
    4video/*true打開攝像頭錄像

    實現大致邏輯(再細的代碼就不貼了,講個思路)

    @Override public void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile, String acceptType, String capture) {Log.i(TAG, "openFileChooser " + acceptType + ", " + capture);super.openFileChooser(view, uploadFile, acceptType, capture);if ("true".equals(capture)) {//判斷是拍視頻,還是拍照boolean isVideo = "video/*".equals(acceptType);String path;DataCallback1<Uri> callback = uri -> {LogUtil.i(TAG, "uri: " + (uri == null ? null : uri.toString()));uploadFile.onReceiveValue(uri);};if (isVideo) {//拍視頻path = genMoviesPath(activity);LogUtil.i(TAG, path);if(path == null) return;FileUtil.mkParentDirs(path);LogUtil.d(TAG, "videoCapture: " + path);IntentUtil.videoCapture(activity, path, callback);} else {//拍照片path = genPicturePath(activity);LogUtil.i(TAG, path);if(path == null) return;FileUtil.mkParentDirs(path);LogUtil.d(TAG, "videoCapture: " + path);IntentUtil.imageCaptureToUri(activity, path, callback);}} else {if(TextUtils.isEmpty(acceptType)) acceptType = "*/*";IntentUtil.selectFile(activity, acceptType, (uri, path, mimeType) -> uploadFile.onReceiveValue(uri));} }

    4. 注解 @JavascriptInterface

    注意一個細節,原生 webkit 乃至騰訊X5,用的都是 android.webkit.JavascriptInterface ,然而 crosswalk 不同,它用的是 org.xwalk.core.JavascriptInterface。如果注解用錯了,抱歉 Uncaught TypeError: <JavaScriptInterfaceName.Method> is not a function

    5. 截圖

    普通的 View 控件,直接用下面函數即可截圖。但 Crosswalk 用下面方法,只能得到一張白紙

    public static Bitmap getView(View view) {view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap cache = view.getDrawingCache();Bitmap bitmap = BitmapUtil.clone(cache);view.setDrawingCacheEnabled(false);view.destroyDrawingCache();return bitmap; }

    網上有人說是 “硬件加速” 的問題,如下兩種方法關閉硬件加速

    • 在 AndroidManifest.xml 的 application 或 activity 里添加 android:hardwareAccelerated="false"
    • 在代碼中設置 webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

    經過測試發現行不通,最后發現 XWalkView 自帶異步的截圖方法,源碼如下

    public void captureBitmapAsync(XWalkGetBitmapCallback callback) {try {this.captureBitmapAsyncXWalkGetBitmapCallbackInternalMethod.invoke(new Object[]{callback.getBridge()});} catch (UnsupportedOperationException var3) {if (this.coreWrapper == null) {throw new RuntimeException("Crosswalk's APIs are not ready yet");}XWalkCoreWrapper.handleRuntimeError(var3);} }

    6. 攔截請求

    public class XWResourceClient {@Overridepublic XWalkWebResourceResponse shouldInterceptLoadRequest(XWalkView view, XWalkWebResourceRequest request) {String url = request.getUrl().toString(); if(!TextUtils.isEmpty(url)&&url.endsWith(".png")) {Log.i(TAG, String.format("攔截網址:%s", url));return createXWalkWebResourceResponse("text/html","UTF-8",null);//不向過濾的地址發出請求}return super.shouldInterceptLoadRequest(view, request);} }

    7. CrossWalk 支持 websocket

    注意,if (typeof WebSocket != 'undefined') 并不能判斷 websocket 是否被支持。因為 Android 中,即使瀏覽器不支持 WebSocket ,但是它還是存在這個屬性。

    正確的驗證方法如下

    function isSupportWebsocket() {if (!!window.WebSocket && window.WebSocket.prototype.send) {return true;} else {return false;} }

    部分方法不支持

  • Object #<HTMLElement> has no method 'remove'
  • 總結

    以上是生活随笔為你收集整理的Android 集成Chrome 浏览器内核 Crosswalk的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久精品5 | 午夜 久久 tv | 中文字幕一区二区三区精华液 | 久久不卡免费视频 | 中文字幕在线观看1 | 亚洲九九九在线观看 | 欧美小视频在线观看 | 中文字幕久久精品亚洲乱码 | 久草在线视频精品 | 国产中文字幕久久 | 免费一级片在线观看 | 精品一区 在线 | 人人干人人模 | 亚洲三级在线播放 | 色999五月色 | 久久精品a | 亚洲精品女人久久久 | 国产综合小视频 | 久久精品牌麻豆国产大山 | 久久99热这里只有精品 | 日韩免费观看一区二区三区 | 精品视频| 国产剧情一区二区 | 婷婷成人亚洲综合国产xv88 | 激情丁香在线 | 欧美韩日在线 | 国产午夜精品一区二区三区嫩草 | 国产在线观看国语版免费 | 欧美日韩在线观看一区二区三区 | 在线观看av黄色 | 国产免费叼嘿网站免费 | 五月天网站在线 | 久久视频一区 | 99国产情侣在线播放 | 亚洲天堂精品视频在线观看 | 亚洲一区在线看 | 99久久日韩精品视频免费在线观看 | 丁香激情综合 | 成人av免费网站 | 欧美黑人巨大xxxxx | 亚洲精品小视频在线观看 | 久久96国产精品久久99软件 | 啪啪av在线| 国产香蕉97碰碰久久人人 | 91在线看片| 欧美男男tv网站 | 国产精品1区 | 亚洲国产成人久久 | 欧美老人xxxx18 | 日日爱夜夜爱 | 中文 一区二区 | 国产精品69av | 91精品国产一区二区在线观看 | 超碰在线日本 | 九九九热精品免费视频观看网站 | 亚洲精品一区二区在线观看 | 欧美午夜精品久久久久 | 日本中出在线观看 | 狠狠狠色丁香婷婷综合久久五月 | 色网站中文字幕 | 草久在线观看 | 天天干,天天射,天天操,天天摸 | 99精品视频99 | 日日操操 | 久久电影国产免费久久电影 | 在线91精品 | 日韩精品中文字幕av | 亚洲精品视频偷拍 | 99亚洲国产 | 国产亚洲va综合人人澡精品 | 久久综合狠狠综合久久综合88 | 久久综合久久综合九色 | a电影在线观看 | 成年人电影免费看 | 国产资源免费 | 91久久久国产精品 | 国产精品一区二区三区久久久 | av福利在线 | 日本久久91| 看片网站黄 | 91亚洲视频在线观看 | 日本女人逼 | 亚洲国产精品一区二区尤物区 | 欧美日韩国产一区二区三区 | 成人久久久电影 | 亚洲黄色在线免费观看 | 国产精品视频永久免费播放 | 成人欧美日韩国产 | 午夜久久影院 | 久久久久麻豆v国产 | 一级特黄aaa大片在线观看 | 国产精品美女免费 | 四虎小视频 | 中文字幕精品三区 | 欧美aaa级片 | 99热最新网址 | 中文字幕在线观看免费高清电影 | 国产韩国日本高清视频 | 久久a v视频 | 69精品人人人人 | 中文字幕一区二区三区四区 | 色婷婷综合视频在线观看 | 深夜免费小视频 | 精品视频9999 | 狠狠操狠狠 | www.xxx.性狂虐| 久久99久久久久久 | 91九色性视频 | 久久系列 | 亚洲电影久久久 | 国产国语在线 | 久久a免费视频 | 成人午夜电影在线 | 国产永久免费 | 激情av资源 | 日韩精品一二三 | 91精品久| 国产 日韩 在线 亚洲 字幕 中文 | 久久久久久蜜av免费网站 | 久青草影院| 香蕉久草 | japanesexxxhd奶水| 色综久久| 久久久男人的天堂 | 国产亚洲久久 | 色吊丝在线永久观看最新版本 | 亚洲精品成人在线 | 国产日韩精品一区二区在线观看播放 | 欧美在线a视频 | 久久免费av电影 | 韩国一区二区三区在线观看 | 91精品国自产在线观看 | 亚洲一区二区三区四区在线视频 | av黄色亚洲 | 亚洲少妇久久 | 日批在线观看 | 四虎国产精品成人免费影视 | av久久在线 | 色精品视频 | av成人在线网站 | 欧美一区二区三区在线观看 | 久久免费在线 | 中文字幕在线视频第一页 | 欧美另类xxx | 91麻豆精品国产自产 | 97操操操| 香蕉视频网站在线观看 | 精品久久一区二区 | 爱色婷婷| 在线观看 国产 | 成人av电影在线播放 | av一级一片 | 色五月成人 | 日韩欧美在线国产 | 久久一区二区三区日韩 | 人人玩人人添人人澡超碰 | 伊人婷婷综合 | 夜夜操天天干 | 99免在线观看免费视频高清 | 蜜臀av性久久久久蜜臀av | 中文永久字幕 | 国内精品视频一区二区三区八戒 | 成人天堂网 | 免费日韩 精品中文字幕视频在线 | 少妇bbw搡bbbb搡bbb | 精品视频免费久久久看 | 欧美黑人巨大xxxxx | 久久美女免费视频 | 91视频 - 114av | 亚洲综合色婷婷 | 久久成年人 | av在线中文| 一区 二区电影免费在线观看 | 国产精品无av码在线观看 | 国产日本在线 | 久久人91精品久久久久久不卡 | 亚洲精品黄网站 | 欧美色图亚洲图片 | 伊人伊成久久人综合网小说 | 国产在线观看免费 | 99精品系列 | 日韩欧美精品一区二区三区经典 | 欧美日韩精品在线视频 | 国产精品一区二区久久精品爱微奶 | 天天综合日日夜夜 | 中文字幕免费不卡视频 | 91在线精品播放 | 精品一区二区视频 | 香蕉一区| 麻豆国产在线视频 | 久久国内免费视频 | 最近中文国产在线视频 | 91女子私密保健养生少妇 | 亚洲国产免费看 | 黄色av一区二区三区 | 国产免费三级在线观看 | 婷婷丁香色 | 亚洲综合在线观看视频 | 国产精品亚洲视频 | 狠狠干.com| 最近中文字幕免费视频 | 片网站| 五月天综合在线 | 国产精品成人免费一区久久羞羞 | 国产一区二区在线播放 | 久久精品aaa | 国产福利小视频在线 | 激情综合网天天干 | 亚洲精品久久久久中文字幕m男 | 麻豆传媒视频在线免费观看 | 国产一区二区网址 | 免费a现在观看 | 婷婷在线网站 | 国产高清一级 | 久久成年人 | 国产美女精品久久久 | 国产资源免费在线观看 | 国产精品久久久久久久久毛片 | 亚洲精品午夜视频 | 中文字幕av一区二区三区四区 | 亚洲日本中文字幕在线观看 | 精品在线视频一区二区三区 | 91视频在线网址 | 亚洲在线成人精品 | 久久精品视频国产 | 免费成人在线观看视频 | 亚洲一区日韩精品 | 中文字幕亚洲不卡 | 日本电影久久 | 久久精品一二三 | 国产精品久久精品国产 | 精品日韩中文字幕 | 天天插一插 | 少妇搡bbbb搡bbb搡69 | 91精品国产欧美一区二区成人 | 精品v亚洲v欧美v高清v | 国产精品久久久久久69 | 九九国产视频 | 99久久国产免费免费 | 亚洲精品永久免费视频 | 国产一级黄色免费看 | www.天天射.com | 500部大龄熟乱视频使用方法 | 亚洲另类久久 | 一区二区视频在线播放 | 91av国产视频| 探花视频免费在线观看 | 五月激情天 | 久久久久久国产精品 | ww视频在线观看 | 国产高清在线免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 99久久99久久精品 | 一级黄色在线免费观看 | 蜜桃久久久 | 99精品视频在线观看 | 久久久久久久99 | 欧美在线free | 91色影院 | 国产精品嫩草影院99网站 | 日韩成人在线免费观看 | 蜜臀av性久久久久av蜜臀妖精 | 在线免费观看的av | 二区三区中文字幕 | 亚洲v欧美v国产v在线观看 | 国产一级久久 | 韩日三级在线 | 97超碰中文字幕 | 欧美性超爽 | 日韩三级视频在线观看 | 91精品在线视频 | 国产精品资源在线观看 | 日韩国产欧美视频 | 日韩精品久久久久久久电影99爱 | 久草免费在线视频 | 在线视频欧美亚洲 | 日韩精品不卡在线观看 | 国产视频在线观看一区 | 国产69精品久久app免费版 | 狠狠躁日日躁狂躁夜夜躁av | 欧美成人基地 | 久草在线免费播放 | 中文字幕人成人 | 成人一级片视频 | 91九色最新 | 免费观看一区二区 | 天天操夜夜操夜夜操 | 亚洲,播放 | 99精品在线直播 | 99久久精品午夜一区二区小说 | 播五月婷婷 | 精品一区二区在线观看 | 91精品国产九九九久久久亚洲 | 在线黄频 | 免费看一级特黄a大片 | www日韩视频 | av一级片在线观看 | 国产 中文 日韩 欧美 | 黄色日本片 | 日韩精品免费一区二区 | 免费在线观看一区二区三区 | 国产视频资源在线观看 | 久久精品欧美视频 | 色www精品视频在线观看 | a久久免费视频 | a黄在线观看 | 日韩综合一区二区 | 天天操天天干天天摸 | 天天操天天舔天天爽 | 天天操,夜夜操 | 亚洲精品视频在线播放 | 国产精品一级视频 | av五月婷婷 | 黄色午夜网站 | 精品免费视频123区 午夜久久成人 | 日韩欧美网址 | 国产精品都在这里 | 欧美午夜寂寞影院 | 韩国av不卡 | 色视频网页 | 国产日韩精品在线 | 99视频精品全部免费 在线 | 99在线精品观看 | 在线日韩三级 | 99精品视频在线观看播放 | 久久99婷婷 | 欧美一区在线看 | 视频福利在线观看 | 超碰官网| 91超碰在线播放 | 天天操夜夜操天天射 | 又爽又黄又无遮挡网站动态图 | 亚洲婷婷综合色高清在线 | 97精品久久人人爽人人爽 | 亚州精品天堂中文字幕 | 久久久 精品 | 精品久久久久久综合日本 | 天天做日日做天天爽视频免费 | 日韩免费成人 | 成人羞羞免费 | 亚洲精品日韩一区二区电影 | 91一区啪爱嗯打偷拍欧美 | 99热国产精品 | 精品在线小视频 | 在线播放日韩av | 婷婷四房综合激情五月 | 最近中文字幕视频网 | 成人一级片免费看 | 天天天在线综合网 | 久久久私人影院 | 色婷婷电影网 | 国产高清视频在线播放一区 | 中文字幕免费一区 | 亚洲高清免费在线 | 日韩欧美高清一区二区 | 中文有码在线 | 国产色资源 | 最近中文字幕免费观看 | 亚洲人成在线观看 | 香蕉在线视频观看 | 日本久久视频 | 亚洲 欧洲av | 国产一区免费在线观看 | 色狠狠综合 | 国产永久免费 | 久久久国产精品人人片99精片欧美一 | 久久激情网站 | 久色小说 | 日韩成人欧美 | 日韩一片| 中文字幕中文字幕在线中文字幕三区 | 干狠狠| 国产精品国产三级国产aⅴ9色 | 中文字幕在线观看国产 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 麻豆 91 在线 | 青青久视频 | 国偷自产中文字幕亚洲手机在线 | 天天爱天天色 | 国产精品69av | 日本黄色免费大片 | 丰满少妇高潮在线观看 | 国产精品久久电影网 | 日韩电影在线观看一区 | a视频免费看 | 92av视频| 91天堂在线观看 | 男女日麻批 | 国产一级淫片免费看 | 久久综合免费 | 成年人视频免费在线 | 青青网视频 | 黄色片免费看 | 免费看精品久久片 | a级免费观看| 久久久久久久久久久久av | 亚洲第五色综合网 | 99r精品视频在线观看 | 九九视频在线观看视频6 | 91精品国产入口 | 欧美先锋影音 | 国产专区第一页 | 色婷婷色| 国产黄a三级三级三级三级三级 | 久草免费在线视频 | 中文字幕在线视频一区 | 国产黄色在线看 | 日韩精品一区二区三区三炮视频 | 免费在线成人av电影 | av手机版 | 精品字幕 | 久久午夜电影院 | 亚洲精品国产精品国自 | 亚洲国产精品激情在线观看 | 黄色小说免费在线观看 | 亚洲经典视频 | 香蕉久久久久久久 | 婷婷色在线播放 | 亚洲一区二区精品3399 | 亚洲免费av观看 | 美国人与动物xxxx | 久久久久久国产精品免费 | 亚洲欧美婷婷六月色综合 | 亚洲最大av在线播放 | 黄色片亚洲 | 欧美激情第28页 | 久久中文字幕在线视频 | 九九热免费在线观看 | 91日韩精品一区 | 一区二区三区高清在线 | 五月婷婷伊人网 | 九七视频在线 | 久草热久草视频 | www.黄色 | 亚洲免费公开视频 | 久久免费毛片视频 | 色婷婷色 | 91黄色在线视频 | 欧美伦理电影一区二区 | 国产一级在线观看视频 | 欧美久草视频 | 另类老妇性bbwbbw高清 | 丁香五婷 | 日本电影久久 | 亚洲一级电影视频 | 看片网站黄 | 欧美精品在线观看免费 | 国产精品视频久久久 | 中文区中文字幕免费看 | 亚洲国产精品视频 | 国产精品久久久久久99 | 日本韩国中文字幕 | 国产老太婆免费交性大片 | 人人草在线观看 | 日韩精品亚洲专区在线观看 | 欧美久久精品 | 国产一级淫片免费看 | 一区二区三区在线看 | 一个色综合网站 | 狠狠亚洲 | 久久久久久久久久福利 | 亚洲黄色大片 | 国产精品国产三级国产aⅴ无密码 | 天天干天天做 | 亚洲激情婷婷 | 日韩字幕在线观看 | 国产精品入口麻豆www | 国产精品美女久久久久久久 | 这里只有精品视频在线观看 | 色婷婷免费 | av免费高清观看 | 国产视频中文字幕 | 超碰午夜 | 久久精品在线免费观看 | 久久久久区 | 国产视频第二页 | 亚洲精品免费在线 | 在线观看视频99 | 国产精品高清一区二区三区 | 超碰在线观看97 | 欧美色888 | 国产精品久久久久国产精品日日 | 亚洲国产三级在线观看 | 1024手机基地在线观看 | 一本到视频在线观看 | 黄色av电影在线 | 国产精品99久久久精品免费观看 | 国产精品99精品 | 天天视频色版 | 香蕉视频国产在线 | 97久久精品午夜一区二区 | 国产日韩欧美在线影视 | 四虎影视成人精品国库在线观看 | 三上悠亚一区二区在线观看 | 美女性爽视频国产免费app | 婷色| 在线黄网站| 国产精品视频免费在线观看 | 视频成人 | 亚洲精品一区二区三区在线观看 | 99婷婷狠狠成为人免费视频 | 亚洲电影在线看 | 亚洲在线精品 | 午夜精品电影 | 成人午夜电影在线 | 色婷婷免费| 日日日爽爽爽 | 91精品视频免费看 | 久久www免费人成看片高清 | 黄色大片中国 | 亚洲女欲精品久久久久久久18 | 日韩在线免费播放 | 亚洲影院一区 | 国产精品视频全国免费观看 | 在线日韩精品视频 | www久草 | 99精品久久只有精品 | 亚洲欧洲av在线 | 国产剧情一区二区在线观看 | adn—256中文在线观看 | 美女露久久 | 久久国产精品视频观看 | 久久久www成人免费毛片麻豆 | 久久精品美女视频网站 | 久在线 | 国产精品欧美久久久久无广告 | 精品一区二区在线免费观看 | 成人观看| 麻豆久久久久久久 | 日韩精品无码一区二区三区 | 91精品一区二区三区久久久久久 | 色片网站在线观看 | 日韩有码网站 | 亚洲视频2 | 日韩成人免费电影 | 天天天干天天射天天天操 | 精品久久一二三区 | 国产在线高清 | 久久久久亚洲精品国产 | 综合激情网... | 蜜臀av.com| 欧美日韩国产伦理 | 在线免费视频你懂的 | 精品国产一区二区三区久久久蜜月 | 69精品人人人人 | 特级毛片aaa | 欧美乱码精品一区 | 久久在线| 成x99人av在线www | 精品毛片一区二区免费看 | 综合成人在线 | 亚洲精品中文字幕视频 | 日韩一级电影在线 | 美女精品国产 | 四虎精品成人免费网站 | 免费在线观看中文字幕 | 日韩91精品| 国产蜜臀av | 一级片黄色片网站 | 国产在线一区观看 | 视频在线日韩 | 夜夜婷婷 | 伊人久久国产精品 | 九九热免费在线视频 | 狠狠狠狠狠狠狠干 | 午夜视频播放 | 超碰电影在线观看 | 免费观看福利视频 | 中文字幕大全 | 日韩欧美一区二区三区在线 | www.夜夜操.com | 91精彩视频在线观看 | 成年人国产视频 | 国产成人一区二区三区免费看 | 国产人在线成免费视频 | 色综合久久久久久久久五月 | 婷婷伊人网 | 久久 亚洲视频 | 欧美色888 | 天天艹天天 | 免费欧美高清视频 | 欧美午夜激情网 | 在线v片免费观看视频 | 亚洲aⅴ乱码精品成人区 | 97国产小视频 | 久久人人添人人爽添人人88v | 亚洲91中文字幕无线码三区 | 国产精品精 | 在线观看免费色 | 色国产视频 | 能在线观看的日韩av | 久久免费a | 久久久久国产精品免费免费搜索 | 久久亚洲私人国产精品 | 91在线看黄 | 免费视频一二三 | 97精品久久 | 特及黄色片 | 在线观看不卡视频 | 久草在线手机视频 | 婷婷九月激情 | 国产精品日韩精品 | 精品国产欧美一区二区三区不卡 | 亚洲免费av在线 | 欧美亚洲精品在线观看 | 久久66热这里只有精品 | 麻豆av电影 | 免费色视频在线 | 波多野结衣精品视频 | 黄色官网在线观看 | 狠狠躁日日躁夜夜躁av | 免费福利视频网站 | 91在线91 | 免费午夜av| 亚洲精品中文在线 | 中文字幕无吗 | 又紧又大又爽精品一区二区 | 欧美热久久 | 最新国产精品拍自在线播放 | 久久综合九色欧美综合狠狠 | 亚洲黄色一级大片 | 日韩爱爱片 | 97综合网 | 色91在线| 久章草在线观看 | 日本久久久久久久久久久 | 国产在线精品区 | 亚洲午夜在线视频 | 国产在线日本 | 国产91精品看黄网站在线观看动漫 | 欧美污污网站 | 999国内精品永久免费视频 | 久久久久在线视频 | 91av在线视频播放 | 免费在线观看av电影 | 久久精品老司机 | 亚洲欧美国产日韩在线观看 | 国产福利中文字幕 | 一区二区三区免费看 | 东方av免费在线观看 | 成人在线免费视频观看 | 亚洲美女视频在线观看 | 一级黄色片网站 | 亚洲综合狠狠干 | 99人成在线观看视频 | 91精品国产91p65 | 国产精品一区二区精品视频免费看 | 中文字幕一区二区三区四区视频 | 黄色福利视频网站 | 超碰人人国产 | 免费一级片在线 | 国产精品成久久久久 | 99久久精品国产亚洲 | 久久久毛片| 在线观看视频一区二区三区 | 韩国av在线播放 | 超级碰视频 | 天天天天天干 | 成人av中文字幕在线观看 | 又黄又刺激的视频 | 免费日韩| 久久精品视频网站 | 91网免费观看 | 日本在线观看中文字幕无线观看 | 五月情婷婷 | 三上悠亚一区二区在线观看 | 国产私拍在线 | 中文字幕日韩电影 | 99热最新在线 | 网站在线观看你们懂的 | 00av视频 | 九九免费在线观看视频 | 欧美xxxx性xxxxx高清 | 免费a级毛片在线看 | 国模精品在线 | 精品久久久一区二区 | 日本视频网 | 欧美韩日精品 | 91欧美在线 | 91色吧| 久久这里只有精品首页 | 天天操天天操天天干 | 天天综合婷婷 | 天天操天天干天天爽 | 亚洲综合网站在线观看 | 日本精品视频一区 | 日韩最新中文字幕 | 日本黄色免费播放 | 亚洲精品影视在线观看 | 国内小视频在线观看 | 精品成人国产 | 亚洲最快最全在线视频 | www.91av在线 | 超薄丝袜一二三区 | 人人爽人人爽人人爽人人爽 | 色婷婷综合久久久久中文字幕1 | 日韩在线观看视频中文字幕 | 五月天婷婷在线视频 | 亚洲精品中文在线观看 | 久久理论片| 特级毛片在线免费观看 | 免费网站看v片在线a | 日韩另类在线 | 成人在线免费看视频 | 欧美日韩伦理在线 | 色99在线 | 国产精品久久久久一区二区 | 黄色不卡av| 日韩在线免费视频 | 国产精品综合av一区二区国产馆 | 色片网站在线观看 | 日韩日韩日韩日韩 | 日韩av在线免费看 | 婷婷六月丁香激情 | 色婷婷电影 | 久久狠狠婷婷 | 精品视频中文字幕 | 欧美精品一区二区蜜臀亚洲 | 国产麻豆精品久久 | 五月天婷亚洲天综合网鲁鲁鲁 | 日韩欧美在线观看 | 欧美性免费 | 国产一区二区在线播放视频 | 久久久久久久久久久精 | 探花视频免费观看 | 99国内精品| 久久老司机精品视频 | 欧美日韩不卡一区 | 久久人人爽av | 国产精品一区二区精品视频免费看 | 国产精品九九久久久久久久 | 日日碰狠狠添天天爽超碰97久久 | 亚洲视频2 | av一区二区三区在线观看 | 国产一级黄| 99久久99久久精品 | av经典在线 | 国产日韩精品欧美 | 91精品免费看 | 丁香六月中文字幕 | 91精品国产91久久久久福利 | 婷婷激情小说网 | 日本精品久久久久中文字幕 | 日韩免费观看av | 国产精品理论片 | 亚洲国产wwwccc36天堂 | 四虎www.| 免费黄色网址大全 | 国产黄色网 | 69精品久久 | 日韩大片在线播放 | 久久视频在线 | 玖玖在线播放 | 四虎在线免费视频 | 国产成人一区二区精品非洲 | 亚洲国产精品推荐 | 麻豆视频免费观看 | 久久久久夜色 | 麻豆视频免费播放 | 日日干网址| 国产高清视频在线 | 日韩精品1区2区 | 99久久精品免费视频 | 午夜精品久久久久久久99水蜜桃 | 日韩有码中文字幕在线 | 日本三级香港三级人妇99 | 日韩在线观看视频在线 | 在线你懂的视频 | 国产在线视频一区 | 国产精品久久99综合免费观看尤物 | 亚洲精品在线免费播放 | 日韩精品久久久久久中文字幕8 | 亚洲日本va中文字幕 | 午夜精品一区二区三区视频免费看 | 99中文视频在线 | 国产精品乱码一区二区视频 | 天操夜夜操 | 精品国产免费一区二区三区五区 | 激情欧美一区二区三区免费看 | 精品久久久久久一区二区里番 | 99r在线观看 | 国产69久久 | 99久久久成人国产精品 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 黄色字幕网 | 91在线视频 | 亚洲精品影视 | 欧美性成人 | 亚洲激情 在线 | 91一区啪爱嗯打偷拍欧美 | 精品在线视频一区二区三区 | 亚洲第一伊人 | 91综合色 | 国产欧美三级 | 国内精品在线看 | 久草在线免费播放 | 69国产盗摄一区二区三区五区 | 91福利试看| 欧美精品网站 | 国产成人久久精品77777综合 | av动态图片 | 日韩免费中文 | 欧美另类一二三四区 | 97在线观看免费观看高清 | 狠狠色狠狠色合久久伊人 | 国产精品一区二区美女视频免费看 | 97人人视频 | 日韩欧美视频一区二区 | 麻豆一区在线观看 | 丁香婷婷色综合亚洲电影 | 亚洲欧洲精品在线 | 亚洲国产成人精品在线观看 | 久久久久一区二区三区四区 | 久久区二区 | 四川bbb搡bbb爽爽视频 | 天天操夜夜做 | 九九免费观看全部免费视频 | 久久精品99国产精品日本 | 欧美精品一二 | 在线观看91视频 | 中文字幕av在线播放 | 国产高清精品在线 | 一区二区三区四区在线免费观看 | 99国产成+人+综合+亚洲 欧美 | 色狠狠婷婷 | 国产男女无遮挡猛进猛出在线观看 | 豆豆色资源网xfplay | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久精品www人人爽人人 | 久久国产精品久久精品国产演员表 | 久久99久久99精品中文字幕 | 久久久久久久久久网站 | 五月综合久久 | 久久久久久高潮国产精品视 | 成人在线超碰 | 九九九九热精品免费视频点播观看 | 成人免费视频网站在线观看 | 亚洲国产精品电影 | 久久国产影视 | 日韩免费福利 | 亚洲精品国产精品乱码不99热 | 国产在线国偷精品产拍 | 手机在线小视频 | 在线观看完整版免费 | 97碰在线视频 | 五月婷婷中文字幕 | 日本成人免费在线观看 | 网站在线观看日韩 | 日本精品一区二区三区在线播放视频 | www五月天com | 成年人免费观看国产 | 国产在线视频导航 | 免费三级黄色 | 99视频| 五月婷婷电影网 | 国产精品福利午夜在线观看 | 在线播放 日韩专区 | 国产999精品久久久久久绿帽 | 91大神电影 | 性色视频在线 | 中文字幕亚洲精品日韩 | 九九久久国产精品 | 一级欧美日韩 | 中文字幕日韩高清 | 美女久久久久久久久久久 | 91久久丝袜国产露脸动漫 | 成人黄色免费在线观看 | 欧美另类美少妇69xxxx | 久久久精品 | 国产伦理精品一区二区 | 国产精品青青 | 欧美最新大片在线看 | 91av在线免费视频 | 国产日韩精品在线观看 | 色综合色综合色综合 | 91日韩在线视频 | 91精品国产91久久久久 | 成人资源在线播放 | www.天天成人国产电影 | 天天翘av| 国产精品成人免费一区久久羞羞 | 成人国产亚洲 | 热re99久久精品国产66热 | 高清视频一区二区三区 | 草久在线观看视频 | 日韩久久久久久久久 | 91麻豆精品国产91久久久久久 | 美女网站黄在线观看 | 亚洲精品乱码久久久久久高潮 | 久草在线一免费新视频 | 久久免视频 | 2020天天干夜夜爽 | 婷婷色5月 | 亚洲黄在线观看 | 天天搞天天干 | 国产又粗又猛又色又黄视频 | 成人毛片100免费观看 | 国产综合香蕉五月婷在线 | 久艹在线播放 | 久久久受www免费人成 | 在线观看一级视频 | 亚洲成av人片在线观看无 | 久久久久久久久久影视 | 五月婷婷.com | 天天躁天天狠天天透 | 在线亚洲小视频 | 成人污视频在线观看 | 在线中文字母电影观看 | 婷婷5月激情5月 | 国产午夜精品一区二区三区嫩草 | 欧亚日韩精品一区二区在线 | 国产精品福利av | www黄com | 国产精品爽爽爽 | 91在线亚洲 | 久久精品91久久久久久再现 | 韩国av免费在线 | 麻豆手机在线 | av片中文| 久久免费a | 久久五月婷婷丁香社区 | 亚洲最新av网站 | 久久不射电影网 | 欧美在线视频一区二区三区 | 午夜在线观看一区 | 天天天干天天射天天天操 | 日韩va亚洲va欧美va久久 | 久久男人中文字幕资源站 | 午夜久久成人 | 亚洲天堂精品视频在线观看 | 亚洲国内精品 | 色欧美视频 | 狠狠gao| 波多野结衣在线视频一区 | 伊人久久一区 | www.夜夜干.com| 免费观看的av网站 | 天天色天 | 免费手机黄色网址 | 五月婷婷毛片 | 国产婷婷一区二区 | 亚洲不卡av一区二区三区 | 亚洲国产高清视频 | av在线免费在线观看 | 91亚洲永久精品 | 国产又粗又猛又黄又爽的视频 | 99热精品国产 | 午夜三级在线 | 国产精品午夜av | 国产精品永久免费在线 | 成人精品电影 | 亚洲在线视频免费 | 97视频在线免费播放 | 国产精品毛片一区二区三区 | av久久在线 | 亚洲精品乱码白浆高清久久久久久 | 麻豆视频在线播放 | 激情影音先锋 | 激情综合网五月激情 | 色综合五月天 | 欧美亚洲国产精品久久高清浪潮 | 日韩视频在线观看免费 | 免费在线 | 在线观看国产亚洲 | 国产91在| 爱色av.com| 在线观看日本韩国电影 | 在线观看91视频 | 九九免费观看全部免费视频 | 免费能看的黄色片 | 久久国产麻豆 | 亚洲五月 | 人人爽久久久噜噜噜电影 | 91精品国产自产在线观看永久 | 中文免费 | 成人a在线观看 | 中文字幕日韩国产 | 狠狠网| a级片久久久 | 在线www色 | 日韩精品一卡 | av7777777| 六月天综合网 | 在线亚洲日本 | 91麻豆精品国产91久久久久久久久 | 国产高清中文字幕 | 中文字幕在线观看日本 | 免费黄色一区 | 中文视频一区二区 | 日本黄色免费在线 | 久久99九九99精品 | 国产一级黄色片免费看 | 日韩大片免费观看 | 欧美性生活小视频 | 欧美另类xxxx| 久热只有精品 | 人人射人人 | 成人午夜网址 |