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