腾讯X5WebView

作者: 颤抖的闪电 | 来源:发表于2019-05-23 20:24 被阅读12次

    最近在做一个所谓的游戏壳,用到腾讯X5WebView。
    直接甩地址https://x5.tencent.com/tbs/sdk.htmlSDK下载
    这是它的接入文档说明https://x5.tencent.com/tbs/guide/sdkInit.html
    我的工程目录大概如下,基本上所有的相关文件都在这里了,
    libs、jniLibs这个直接复制进去就不多说了,资源就在上面的链接里下就好了。

    image.png

    1,核心类X5WebView

    import android.annotation.SuppressLint;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.util.AttributeSet;
    import android.webkit.JavascriptInterface;
    import android.widget.Toast;
    
    import com.jiyou.jyh5.javascriptInterface.WebViewJavaScriptFunction;
    import com.tencent.smtt.export.external.interfaces.JsResult;
    import com.tencent.smtt.sdk.DownloadListener;
    import com.tencent.smtt.sdk.WebChromeClient;
    import com.tencent.smtt.sdk.WebSettings;
    import com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm;
    import com.tencent.smtt.sdk.WebView;
    import com.tencent.smtt.sdk.WebViewClient;
    import com.tencent.smtt.utils.TbsLog;
    
    public class X5WebView extends WebView {
        Context context;
        private static final String TAG = "X5WebView";
    
        @SuppressLint("SetJavaScriptEnabled")
        public X5WebView(Context arg0, AttributeSet arg1) {
            super(arg0, arg1);
            context = arg0;
    //        this.setWebViewClient(webViewClient);
    //        this.setWebChromeClient(webChromeClient);
            // WebStorage webStorage = WebStorage.getInstance();
            initWebViewClient();
            initWebChromeClient();
            initDownloadListener();
            initWebViewSettings();
            initJavascriptInterface();
            this.getView().setClickable(true);
        }
    
        private void initWebViewClient() {
            this.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    return false;
    //                view.loadUrl(url);
    //                return true;
                }
    
                @Override
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);
                    /* mWebView.showLog("test Log"); */
                }
            });
        }
    
        private void initWebChromeClient() {
            this.setWebChromeClient(new WebChromeClient() {
    
                @Override
                public boolean onJsConfirm(WebView arg0, String arg1, String arg2,
                                           JsResult arg3) {
                    return super.onJsConfirm(arg0, arg1, arg2, arg3);
                }
    
                @Override
                public boolean onJsAlert(WebView arg0, String arg1, String arg2,
                                         JsResult arg3) {
                    /**
                     * 这里写入你自定义的window alert
                     */
                    return super.onJsAlert(null, arg1, arg2, arg3);
                }
            });
        }
    
        private void initDownloadListener() {
            this.setDownloadListener(new DownloadListener() {
    
                @Override
                public void onDownloadStart(String arg0, String arg1, String arg2,
                                            String arg3, long arg4) {
                    TbsLog.d(TAG, "url: " + arg0);
                    new AlertDialog.Builder(context)
                            .setTitle("allow to download?")
                            .setPositiveButton("yes",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog,
                                                            int which) {
                                            Toast.makeText(
                                                    context,
                                                    "fake message: i'll download...",
                                                    Toast.LENGTH_LONG).show();
                                        }
                                    })
                            .setNegativeButton("no",
                                    new DialogInterface.OnClickListener() {
    
                                        @Override
                                        public void onClick(DialogInterface dialog,
                                                            int which) {
                                            // TODO Auto-generated method stub
                                            Toast.makeText(
                                                    context,
                                                    "fake message: refuse download...",
                                                    Toast.LENGTH_SHORT).show();
                                        }
                                    })
                            .setOnCancelListener(
                                    new DialogInterface.OnCancelListener() {
    
                                        @Override
                                        public void onCancel(DialogInterface dialog) {
                                            // TODO Auto-generated method stub
                                            Toast.makeText(
                                                    context,
                                                    "fake message: refuse download...",
                                                    Toast.LENGTH_SHORT).show();
                                        }
                                    }).show();
                }
            });
        }
    
        private void initWebViewSettings() {
            WebSettings webSetting = this.getSettings();
            webSetting.setJavaScriptEnabled(true);
            webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
            webSetting.setAllowFileAccess(true);
            webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
            webSetting.setSupportZoom(true);
            webSetting.setBuiltInZoomControls(true);
            webSetting.setUseWideViewPort(true);
            webSetting.setSupportMultipleWindows(true);
            // webSetting.setLoadWithOverviewMode(true);
            webSetting.setAppCacheEnabled(true);
            // webSetting.setDatabaseEnabled(true);
            webSetting.setDomStorageEnabled(true);
            webSetting.setGeolocationEnabled(true);
            webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
            // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
            webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
            // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
            webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
    
            // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
            // settings 的设计
            webSetting.setAppCachePath(context.getDir("appcache", 0).getPath());
            webSetting.setDatabasePath(context.getDir("databases", 0).getPath());
            webSetting.setGeolocationDatabasePath(context.getDir("geolocation", 0)
                    .getPath());
        }
    
        private void initJavascriptInterface() {
            this.addJavascriptInterface(new WebViewJavaScriptFunction() {
    
                @Override
                public void onJsFunctionCalled(String tag) {
                    // TODO Auto-generated method stub
                }
    
                @JavascriptInterface
                public void onLoginSuccesed(String str) {
                }
                @JavascriptInterface
                public void onLogoutSuccesed() {
                }
                @JavascriptInterface
                public void onCreateRole(String str) {
                }
    
                @JavascriptInterface
                public void onEnterGame(String str) {
                }
    
                @JavascriptInterface
                public void onRoleUpLevel(String str) {
                }
            }, "JYNative");
        }
    
        public X5WebView(Context arg0) {
            super(arg0);
            setBackgroundColor(85621);
        }
    
    }
    

    2,核心类BrowserActivity

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.PixelFormat;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.ViewGroup;
    import android.widget.FrameLayout;
    import android.widget.ProgressBar;
    
    import com.jiyou.jyh5.views.X5WebView;
    import com.tencent.smtt.sdk.CookieSyncManager;
    import com.tencent.smtt.utils.TbsLog;
    
    public class BrowserActivity extends Activity {
        private X5WebView mWebView;
        private ViewGroup mViewParent;
    
        private static final String mHomeUrl = "https://www.baidu.com/";
        private static final String TAG = "BrowserActivity";
    
        private ProgressBar mPageLoadingProgressBar = null;
    
        public static void startActivity(Activity context) {
            if (context != null) {
                Intent intent = new Intent(context, BrowserActivity.class);
                context.startActivity(intent);
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setFormat(PixelFormat.TRANSLUCENT);
            try {
                if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 11) {
                    getWindow()
                            .setFlags(
                                    android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                                    android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
                }
            } catch (Exception e) {
            }
    
            setContentView(R.layout.activity_browser);
            mViewParent = findViewById(R.id.webView1);
            mWebView = new X5WebView(this, null);
            mViewParent.addView(mWebView, new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.FILL_PARENT,
                    FrameLayout.LayoutParams.FILL_PARENT));
            init();
        }
    
        private void initProgressBar() {
            mPageLoadingProgressBar = (ProgressBar) findViewById(R.id.progressBar1);// new
            mPageLoadingProgressBar.setMax(100);
            mPageLoadingProgressBar.setProgressDrawable(this.getResources()
                    .getDrawable(R.drawable.color_progressbar));
        }
    
        private void init() {
    //        initProgressBar();
            long time = System.currentTimeMillis();
            mWebView.loadUrl(mHomeUrl);
            TbsLog.d("time-cost", "cost time: "
                    + (System.currentTimeMillis() - time));
            CookieSyncManager.createInstance(this);
            CookieSyncManager.getInstance().sync();
        }
    
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
    
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (mWebView != null && mWebView.canGoBack()) {
                    mWebView.goBack();
                    return true;
                } else
                    return super.onKeyDown(keyCode, event);
            }
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            if (intent == null || mWebView == null || intent.getData() == null)
                return;
            mWebView.loadUrl(intent.getData().toString());
        }
    
        @Override
        protected void onDestroy() {
            if (mWebView != null)
                mWebView.destroy();
            super.onDestroy();
        }
    
    }
    

    3,核心类JYH5Aplication

    import android.app.Application;
    import android.util.Log;
    
    import com.tencent.smtt.sdk.QbSdk;
    
    public class JYH5Aplication extends Application {
    
        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();
            //非wifi情况下,主动下载x5内核
            QbSdk.setDownloadWithoutWifi(true);
            //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
            QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
                
                @Override
                public void onViewInitFinished(boolean arg0) {
                    // TODO Auto-generated method stub
                    //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
                    Log.d("app", " onViewInitFinished is " + arg0);
                }
                
                @Override
                public void onCoreInitFinished() {
                    // TODO Auto-generated method stub
                }
            };
            //x5内核初始化接口
            QbSdk.initX5Environment(getApplicationContext(),  cb);
        }
    
    }
    

    4,提供给页面js调用的接口WebViewJavaScriptFunction

    public interface WebViewJavaScriptFunction {
    
        void onJsFunctionCalled(String tag);
    }
    

    5,好吧,无关紧要的主页也搞上来吧

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        Button btn_browser;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_browser = findViewById(R.id.btn_browser);
            btn_browser.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    BrowserActivity.startActivity(MainActivity.this);
                }
            });
        }
    }
    

    6,两个layout页面也上吧
    activity_browser.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    
        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="3dp" />
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical">
    
            <FrameLayout
                android:id="@+id/webView1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></FrameLayout>
    
        </RelativeLayout>
    
    </LinearLayout>
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.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">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/btn_browser"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:text="browser"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>
    

    7,怎么能少得了AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.jiyou.jyh5">
    
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_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.READ_SETTINGS" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
        <!-- 硬件加速对X5视频播放非常重要,建议开启 -->
        <uses-permission android:name="android.permission.GET_TASKS" />
    
        <application
            android:name=".JYH5Aplication"
            android:allowBackup="true"
            android:supportsRtl="true"
            android:hardwareAccelerated="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".BrowserActivity"
                android:configChanges="orientation|screenSize|keyboardHidden"
                android:label="@string/app_name" >
            </activity>
        </application>
    
    </manifest>
    

    8,都写到这里了,gradle不给也说不过去了吧
    重点: targetSdkVersion 22,不能太高,反正我 28,就好像加载不了链接。demo里多少,我们就用多少就好了。

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.jiyou.jyh5"
            minSdkVersion 15
            targetSdkVersion 22
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            ndk {
                abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
            }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    //    testImplementation 'junit:junit:4.12'
    //    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    //    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }
    

    应该没有了,所需的jar包、so文件等,直接去我开头给的那个下载链接下,demo里面就有

    相关文章

      网友评论

        本文标题:腾讯X5WebView

        本文链接:https://www.haomeiwen.com/subject/lmqbzqtx.html