安卓嵌入h5页面方法笔记

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.TestApplication"
        android:usesCleartextTraffic="true"
        tools:targetApi="31">
        <activity
            android:name=".Order"
            android:exported="false" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NotiyFactionActivity" />
        <activity android:name=".TestActiv" />
    </application>

</manifest>
java 复制代码
package com.example.testapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.Toast;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {
    private NotificationManager manager;
    private Notification notification;
    private WebView webview;

    Context ctx = this;
    @SuppressLint({"MissingInflatedId", "JavascriptInterface"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);




        //安卓嵌入h5

//        webview = (WebView) findViewById(R.id.id_wv);
        webview=new WebView(this);
        webview.getSettings().setAllowUniversalAccessFromFileURLs(true);
        webview.getSettings().setDomStorageEnabled(true);
        webview.getSettings().setAllowFileAccessFromFileURLs(true);
        webview.getSettings().setJavaScriptEnabled(true);
        // 设置允许JS弹窗
        webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webview.getSettings().setLoadsImagesAutomatically(true);
        //不调用外部浏览器,一直在APP内运行网页
        webview.setWebViewClient(new WebViewClient() );
        //响应webview 加载H5页面中的alert函数,否则alert显示不出来
        webview.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                AlertDialog.Builder b = new AlertDialog.Builder(ctx);
                b.setTitle("title");
                b.setMessage(message);
                b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        result.confirm();
                    }
                });
                b.create().show();
                return true;
            }
        });
        //添加JavaScript接口,js调用Java要用
        webview.addJavascriptInterface(new JavaAndJsInterface(),"AndroidDemo");
        webview.loadUrl("http://qc.5gxt.top/admin/login/index.html");
        setContentView(webview);

    }
    //监听系统返回键,如果有上个html则返回,否则退出这个页面
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack()) {
            webview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    public class JavaAndJsInterface{
        //js调用Java方法
        @JavascriptInterface
        public void javaFn(String arg){
            Toast.makeText(MainActivity.this, "java被js调用了,"+arg, Toast.LENGTH_SHORT).show();
            this.javaDjs();
        }
        //java调用js方法

        //js调用安卓,打电话
        @JavascriptInterface
        public void callPhone(String num){
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"+num)));
        }
        public void javaDjs(){
            //java调用浏览器的js函数
            // 通过Handler发送消息
            webview.post(new Runnable() {
                @Override
                public void run() {

                        // 注意调用的JS方法名要对应上
                        // 调用javascript的callJS()方法
                        final int version = Build.VERSION.SDK_INT;//获取系统版本
                        //我们需要判断当前系统版本。为了尽可能减少错误我们使用了两种方式来实现调用JS方法。
                        if (version < 18) {
                            //无法获取js函数的返回值
                            webview.loadUrl("javascript:alertFn('Java调用了js,我是参数1')");
                        } else {

                            webview.evaluateJavascript("javascript:alertFn('Java调用了js,我是参数2')", new ValueCallback<String>() {
                                @Override
                                public void onReceiveValue(String value) {
                                    //此处为 js 返回的结果
                                    Log.e("leo", value);
                                }
                            });
                        }
                    }
                });

        }
    }

}
相关推荐
SRC_BLUE_171 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
2401_858286113 小时前
L7.【LeetCode笔记】相交链表
笔记·leetcode·链表
无尽的大道5 小时前
Android打包流程图
android
龙中舞王5 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity
青椒大仙KI116 小时前
24/11/7 算法笔记 PCA主成分分析
笔记·算法·信息可视化
镭封6 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰4876 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛6 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
光明中黑暗6 小时前
机器学习 笔记
人工智能·笔记·机器学习
IAM四十二6 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer