Android 第一次使用WebView遇到的坑

本文记录了在Android项目中使用WebView遇到的两个主要问题及其解决方案。第一个问题是在Android8.0及以上版本,系统应用使用WebView报错,解决办法是在代码中添加权限设置。第二个问题是WebView的返回键处理不当,通过判断当前URL与初始URL是否一致来正确实现网页的返回操作。
摘要由CSDN通过智能技术生成

项目场景:

在项目开发过程中,需要对图标进行网页跳转,尝试用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 
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值