项目场景:
在项目开发过程中,需要对图标进行网页跳转,尝试用WebView实现
第一个坑!
问题描述:
我首先上网查询WebView入门demo,类似于跳转百度等这样的小demo,然后写出一个activity用来绑定WebView布局
package com.sprocomm.tablelamp.ui.market;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.sprocomm.tablelamp.base.BaseActivity;
import com.sprocomm.tablelamp.databinding.ActivityStudyCloudBinding;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* created by XuMaoxin
* 2021/09/18
* 中小学云平台WebView的父布局
*/
public class StudyCloudActivity extends BaseActivity {
private ActivityStudyCloudBinding binding;
private final String originalUrl = "https://ykt.eduyun.cn/ykt/sjykt/index.html";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityStudyCloudBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
//访问网页
binding.wvStudyCloud.loadUrl(originalUrl);
//系统会默认通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置
binding.wvStudyCloud.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/wv_study_cloud"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>
如此一来,按照我们的预想,只要加载这个activity,就应该用webview显示咱们的目标url了,然鹅。。。
当我们通过其他地方的点击事件想要启动这个activity时,出现了这样的问题
解决方案:
通过面向百度、CSDN、简书等编程,我找到了这么一篇博客webViwe 报错 For security reasons, WebView is not allowed in privileged processes,根据文中描述,在Android8.0以后的版本中,如果你的app为系统app,则使用WebView会报错,这里我使用了博客中的方法二,在代码中加入了一个hookWebView()
方法
private static String TAG = "hookWebView";
public static void hookWebView(){
int sdkInt = Build.VERSION.SDK_INT;
try {
Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
Field field = factoryClass.getDeclaredField("sProviderInstance");
field.setAccessible(true);
Object sProviderInstance