harmonyos webview范例 原创
鸿蒙系统 WebView app 范例
项目代码:https://gitee.com/hljdrl/harmonyos-app-example-webview
- WebView加载在线地址
- WebView加载本地网址
- WebView加载app内置资源(一)
- WebView加载app内置资源(二)
WebAbility
package org.ohos.sample.webview.home;
import com.utalk.kernel.logger.L;
import com.utalk.kernel.util.StringCompat;
import ohos.aafwk.content.Operation;
import ohos.multimodalinput.event.KeyEvent;
import org.ohos.sample.webview.home.slice.WebAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
public class WebAbility extends Ability {
public static final String KEY_URL="_webview_url";
public static final void start(Ability ability,String url){
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder().withDeviceId("")
.withBundleName(ability.getBundleName())
.withAbilityName(WebAbility.class)
.build();
intent.setOperation(operation);
intent.setParam(KEY_URL,url);
ability.startAbility(intent);
}
private String TAG="WebAbility";
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
L.i(TAG, StringCompat.string("onKeyDown->keyCode=",keyCode));
return super.onKeyDown(keyCode, keyEvent);
}
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(WebAbilitySlice.class.getName());
}
}
WebAbilitySlice
package org.ohos.sample.webview.home.slice;
import com.utalk.kernel.logger.L;
import com.utalk.kernel.util.StringCompat;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.ProgressBar;
import ohos.agp.components.webengine.WebView;
import ohos.agp.utils.Point;
import ohos.agp.window.service.Display;
import ohos.agp.window.service.DisplayManager;
import ohos.agp.window.service.WindowManager;
import ohos.multimodalinput.event.KeyEvent;
import org.ohos.sample.cordova.SystemWebViewEngine;
import org.ohos.sample.cordova.WebViewEngine;
import org.ohos.sample.cordova.WebViewInterface;
import org.ohos.sample.webview.ResourceTable;
import org.ohos.sample.webview.home.WebAbility;
import java.util.Optional;
/**
*
- 加载资源文件 dataability://org.ohos.sample.data.DataAbility
- final String URL_LOCAL = “dataability://org.ohos.sample.data.DataAbility/resources/rawfile/web/index.html”;
- webViewEngine.load(URL_LOCAL);
- 加载资源文件 resources/rawfile/example.html
- webViewEngine.load(loadUrl);
- 加载本地文件 /data/data/com.example.dataability/files/example.html
- webViewEngine.load(“https://example.com/local/example.html”);
- 加载网址
- webViewEngine.load(“http://elemefe.github.io/mint-ui/#/”);
*/
public class WebAbilitySlice extends AbilitySlice implements WebViewInterface {
private WebViewEngine webViewEngine;
private String loadUrl;
private WebViewInterface webViewInterface;
// private Component viewLoad;
private Component progressBarLayout;
private ProgressBar mProgressBar;
private String TAG=“WebAbilitySlice”;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
WindowManager.getInstance().getTopWindow().get().setTransparent(true);
super.setUIContent(ResourceTable.Layout_ability_webview);
Optional<Display>
display = DisplayManager.getInstance().getDefaultDisplay(this.getContext());
Point pt = new Point();
display.get().getSize(pt);
WebView mWebView = (WebView) findComponentById(ResourceTable.Id_webview);
progressBarLayout = findComponentById(ResourceTable.Id_webview_load_progress);
mProgressBar = (ProgressBar) findComponentById(ResourceTable.Id_webview_view_progressbar);
L.i(TAG,StringCompat.string(“x=”,pt.getPointXToInt()," y=",pt.getPointYToInt()));
if(intent.hasParameter(WebAbility.KEY_URL)){
loadUrl = intent.getStringParam(WebAbility.KEY_URL);
}else{
loadUrl="https://example.com/rawfile/web/index.html";
}
webViewInterface = this;
if(webViewEngine==null){
webViewEngine = new SystemWebViewEngine(getApplicationContext(),webViewInterface);
}
webViewEngine.init(mWebView);
mWebView.load(loadUrl);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent keyEvent) {
L.i(TAG,StringCompat.string("onKeyUp->keyCode=",keyCode));
return super.onKeyUp(keyCode, keyEvent);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
L.i(TAG,StringCompat.string("onKeyDown->keyCode=",keyCode));
if(keyCode==KeyEvent.KEY_BACK){
boolean canGoBack = webViewEngine.canGoBack();
L.i(TAG,StringCompat.string("onKeyDown->WebViewEngine canGoBack=",canGoBack));
if(canGoBack){
webViewEngine.goBack();
return true;
}
}
return super.onKeyDown(keyCode, keyEvent);
}
@Override
protected void onStop() {
super.onStop();
if(webViewEngine!=null){
webViewEngine.destroy();
}
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
@Override
public void showWebViewLoading() {
L.i(TAG,"showWebViewLoading");
if(progressBarLayout!=null){
progressBarLayout.setVisibility(Component.VISIBLE);
}
}
@Override
public void hideWebViewLoading() {
L.i(TAG,"hideWebViewLoading");
if(progressBarLayout!=null){
progressBarLayout.setVisibility(Component.HIDE);
}
}
@Override
public void onWebViewPageFinished() {
L.i(TAG,"onWebViewPageFinished");
}
@Override
public void onWebViewProgressUpdated(int newProgress) {
L.i(TAG, StringCompat.string("onWebViewProgressUpdated=",newProgress));
if(mProgressBar!=null){
mProgressBar.setProgressValue(newProgress);
}
}
}
WebViewInterface
package org.ohos.sample.cordova;
import ohos.app.Context;
public interface WebViewInterface {
Context getContext();
void showWebViewLoading();
void hideWebViewLoading();
void onWebViewPageFinished();
void onWebViewProgressUpdated(int newProgress);
}
WebViewEngine
package org.ohos.sample.cordova;
import ohos.agp.components.webengine.WebView;
import ohos.app.Context;
public abstract class WebViewEngine {
private Context mContext;
protected WebViewInterface webViewInterface;
public WebViewEngine(Context context,WebViewInterface webViewInterface){
mContext = context.getApplicationContext();
this.webViewInterface = webViewInterface;
}
public final Context getContext(){
return mContext;
}
public abstract void init(WebView webView);
public abstract void load(String url);
public abstract boolean canGoBack();
public abstract void goBack();
public abstract void goForward();
public abstract boolean canGoForward();
public abstract void destroy();
}
SystemWebViewEngine
package org.ohos.sample.cordova;
import ohos.agp.components.webengine.Navigator;
import ohos.agp.components.webengine.WebConfig;
import ohos.agp.components.webengine.WebView;
import ohos.app.Context;
public class SystemWebViewEngine extends WebViewEngine {
private WebView mWebView;
public SystemWebViewEngine(Context context, WebViewInterface webViewInterface) {
super(context, webViewInterface);
}
public void init(WebView webView){
mWebView = webView;
settingsWebView();
}
private void settingsWebView(){
WebConfig webConfig = mWebView.getWebConfig();
webConfig.setJavaScriptPermit(true);
webConfig.setDataAbilityPermit(true);
webConfig.setWebStoragePermit(true);
webConfig.setViewPortFitScreen(true);
// webConfig.setLocationPermit(true);
mWebView.setWebAgent(new SystemWebAgent(webViewInterface));
mWebView.setBrowserAgent(new SystemBrowserAgent(getContext(),webViewInterface));
} @Override
public void load(String url) {
mWebView.load(url);
}
@Override
public boolean canGoBack() {
Navigator navigator = mWebView.getNavigator();
return navigator.canGoBack();
}
@Override
public void goBack() {
Navigator navigator = mWebView.getNavigator();
if (navigator.canGoBack()) {
navigator.goBack();
}
}
@Override
public void goForward() {
Navigator navigator = mWebView.getNavigator();
if (navigator.canGoForward()) {
navigator.goForward();
}
}
@Override
public boolean canGoForward() {
Navigator navigator = mWebView.getNavigator();
if (navigator.canGoForward()) {
return true;
}
return false;
}
@Override
public void destroy() {
if(mWebView!=null){
mWebView.load("about:blank");
}
}
}
SystemWebAgent
package org.ohos.sample.cordova;
import com.utalk.kernel.logger.L;
import com.utalk.kernel.util.StringCompat;
import ohos.agp.components.webengine.*;
import ohos.agp.utils.TextTool;
import ohos.app.Context;
import ohos.global.resource.Resource;
import ohos.media.image.PixelMap;
import ohos.utils.net.Uri;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLConnection;
public class SystemWebAgent extends WebAgent {
String TAG = “SystemWebAgent”;
protected WebViewInterface webViewInterface;
public SystemWebAgent(WebViewInterface webViewInterface) {
super();
this.webViewInterface = webViewInterface;
}
@Override
public void onLoadingPage(WebView webView, String url, PixelMap icon) {
super.onLoadingPage(webView, url, icon);
L.i(TAG,"onLoadingPage");
// 页面开始加载时自定义处理
if(webViewInterface!=null){
webViewInterface.showWebViewLoading();
}
}
@Override
public void onPageLoaded(WebView webView, String url) {
super.onPageLoaded(webView, url);
L.i(TAG,"onPageLoaded");
// 页面加载结束后自定义处理
if(webViewInterface!=null){
webViewInterface.hideWebViewLoading();
webViewInterface.onWebViewPageFinished();
}
}
@Override
public void onError(WebView webView, ResourceRequest request, ResourceError error) {
super.onError(webView, request, error);
// 发生错误时自定义处理
String url = request.getRequestUrl().toString();
String err = error.toString();
L.i(TAG,StringCompat.string("onError->url",url," err=",err));
}
@Override
public void onLoadingContent(WebView webView, String url) {
super.onLoadingContent(webView, url);
// 加载资源时自定义处理
}
@Override
public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
if (request == null || request.getRequestUrl() == null) {
L.i(TAG,"WebAgent isNeedLoadUrl:request is null.");
return false;
}
String url = request.getRequestUrl().toString();
if (url.startsWith("http:") || url.startsWith("https:")) {
webView.load(url);
return false;
} else {
return super.isNeedLoadUrl(webView, request);
}
}
@Override
public ResourceResponse processResourceRequest(WebView webView, ResourceRequest request) {
final String authority = "example.com";
final String rawFile = "/rawfile/";
final String local = "/local/";
Uri requestUri = request.getRequestUrl();
String url = requestUri.toString();
L.i(TAG, StringCompat.string("processResourceRequest->Uri=",url));
if (authority.equals(requestUri.getDecodedAuthority())) {
String path = requestUri.getDecodedPath();
if (TextTool.isNullOrEmpty(path)) {
return super.processResourceRequest(webView, request);
}
if (path.startsWith(rawFile)) {
// 根据自定义规则访问资源文件
String rawFilePath = "entry/resources/rawfile/" + path.replace(rawFile, "");
String mimeType = URLConnection.guessContentTypeFromName(rawFilePath);
L.i(TAG,StringCompat.string("processResourceRequest->rawFilePath=",rawFilePath));
try {
final Context context = webView.getContext();
Resource resource = context.getResourceManager().getRawFileEntry(rawFilePath).openRawFile();
ResourceResponse response = new ResourceResponse(mimeType, resource, null);
return response;
} catch (IOException e) {
L.i(TAG, "open raw file failed");
}
}
if (path.startsWith(local)) {
// 根据自定义规则访问本地文件
final Context context = webView.getContext();
String localFile = context.getFilesDir() + path.replace(local, "/");
L.i(TAG, "open local file " + localFile);
File file = new File(localFile);
if (!file.exists()) {
L.i(TAG, "file not exists");
return super.processResourceRequest(webView, request);
}
String mimeType = URLConnection.guessContentTypeFromName(localFile);
try {
InputStream inputStream = new FileInputStream(file);
ResourceResponse response = new ResourceResponse(mimeType, inputStream, null);
return response;
} catch (IOException e) {
L.i(TAG, "open local file failed");
}
}
}
return super.processResourceRequest(webView, request);
}
}