package com.qxcm.moduleutil.activity; import static android.view.View.GONE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ClipData; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.webkit.GeolocationPermissions; import android.webkit.JavascriptInterface; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.alibaba.android.arouter.facade.annotation.Autowired; import com.alibaba.android.arouter.launcher.ARouter; import com.blankj.utilcode.util.LogUtils; import com.qxcm.moduleutil.R; import com.qxcm.moduleutil.base.CommonAppContext; import com.qxcm.moduleutil.databinding.ActivityWebViewBinding; import com.qxcm.moduleutil.utils.ARouteConstants; import com.tencent.imsdk.v2.V2TIMConversation; import com.tencent.mm.opensdk.modelbiz.WXOpenCustomerServiceChat; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.WXAPIFactory; import com.tencent.qcloud.tuicore.TUIConstants; import com.tencent.qcloud.tuikit.tuichat.classicui.page.TUIC2CChatActivity; import com.tencent.qcloud.tuikit.tuichat.classicui.page.TUIGroupChatActivity; import java.util.Map; import java.util.Objects; /** * @author qx * @data 2025/6/3 * @description: webview公共方法 */ public class WebViewActivity extends BaseAppCompatActivity { public String title; public String url; private ValueCallback mUploadMessage; private ValueCallback mUploadCallbackAboveL; private final int REQUEST_FILE_PICKER = 1; @SuppressLint("SetJavaScriptEnabled") @Override protected void initData() { WebSettings webSettings = mBinding.webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setJavaScriptEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存 //增加JSBridge mBinding.webView.addJavascriptInterface(new WebAppInterface(this), "Android"); // mBinding.webView.addJavascriptInterface(new WebViewBridgeConfig(title), WebViewBridgeConfig.NAME); webSettings.setBuiltInZoomControls(false); webSettings.setSupportZoom(false); webSettings.setDomStorageEnabled(true); webSettings.setBlockNetworkImage(false);//解决图片不显示 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); mBinding.webView.setHorizontalScrollBarEnabled(false);//水平不显示 mBinding.webView.setVerticalScrollBarEnabled(false); //垂直不显示 mBinding.webView.requestFocus(); mBinding.webView.loadUrl(url); // mBinding.webView.evaluateJavascript("javascript:window.Android.closeWeb()", new ValueCallback() { // // @Override // public void onReceiveValue(String value) { // LogUtils.e("value: " + value); // } // }); mBinding.webView.setWebChromeClient(new WebChromeClient() { //配置权限(同样在WebChromeClient中实现) @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); super.onGeolocationPermissionsShowPrompt(origin, callback); } @Override public void onProgressChanged(WebView view, int newProgress) { } // For Android < 3.0 public void openFileChooser(ValueCallback uploadMsg) { mUploadMessage = uploadMsg; // showFileChooser(); } // For Android > 4.1.1 public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; // showFileChooser(); } // For Android > 5.0支持多张上传 @Override public boolean onShowFileChooser(WebView webView, ValueCallback uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) { mUploadCallbackAboveL = uploadMsg; showFileChooser(); return true; } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); // tvTitle.setText(title); } }); } private void showFileChooser() { // 这里可以扩展为显示对话框让用户选择“拍照”或“从相册选择” Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_FILE_PICKER); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_FILE_PICKER) { if (mUploadMessage != null) { Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); mUploadMessage.onReceiveValue(result); mUploadMessage = null; } else if (mUploadCallbackAboveL != null) { Uri[] results = null; if (resultCode == Activity.RESULT_OK && data != null) { String dataString = data.getDataString(); ClipData clipData = data.getClipData(); if (clipData != null) { results = new Uri[clipData.getItemCount()]; for (int i = 0; i < clipData.getItemCount(); i++) { ClipData.Item item = clipData.getItemAt(i); results[i] = item.getUri(); } } if (dataString != null) results = new Uri[]{Uri.parse(dataString)}; } mUploadCallbackAboveL.onReceiveValue(results); mUploadCallbackAboveL = null; } } } @Override protected void initView() { title = getIntent().getStringExtra("title"); url = getIntent().getStringExtra("url"); if (title.equals("举报") || title.equals("等级") || title.equals("公会") || title.equals("邀请") || title.equals("反馈")) { mBinding.topBar.setVisibility(GONE); // mBinding.webView.setPadding(0,20,0,0); } else { mBinding.topBar.setVisibility(VISIBLE); mBinding.topBar.setTitle(title); } } @Override protected int getLayoutId() { return R.layout.activity_web_view; } public class WebAppInterface { Context mContext; WebAppInterface(Context c) { mContext = c; } // 被 H5 调用的方法 @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } @JavascriptInterface public void closeWeb() { LogUtils.e("value: "); finish(); } @JavascriptInterface public void customerService() { String appId = CommonAppContext.getInstance().getCurrentEnvironment().getWxAppId(); // 填移动应用(App)的 AppId IWXAPI api = WXAPIFactory.createWXAPI(mContext, appId); // 判断当前版本是否支持拉起客服会话 WXOpenCustomerServiceChat.Req req = new WXOpenCustomerServiceChat.Req(); req.corpId = "ww1de4300858c0b461"; // 企业ID req.url = "https://work.weixin.qq.com/kfid/kfcb3d23a59c188a0e7"; // 客服URL api.sendReq(req); } @JavascriptInterface public void jumpRoomPage(String room_id) { ARouter.getInstance().build(ARouteConstants.ROOM_DETAILS).withString("form", "首页").withString("roomId", room_id).navigation(); } @JavascriptInterface public void jumpWebPage(String objects) { // ARouter.getInstance().build(ARouteConstants.USER_HOME_PAGE).navigation(); ARouter.getInstance().build(ARouteConstants.USER_HOME_PAGE).withString("userId", objects).navigation(); } @JavascriptInterface public void enterGroupChat(String group_id,String cover,String guild_name) { Intent intent = new Intent(mContext, TUIGroupChatActivity.class); intent.putExtra(TUIConstants.TUIChat.CHAT_ID, group_id); intent.putExtra(TUIConstants.TUIChat.CHAT_TYPE, V2TIMConversation.V2TIM_GROUP); mContext.startActivity(intent); } @JavascriptInterface public void chatWithUser(String user_id,String nickname) { Intent intent = new Intent(mContext, TUIC2CChatActivity.class); intent.putExtra(TUIConstants.TUIChat.CHAT_ID, user_id); intent.putExtra(TUIConstants.TUIChat.CHAT_TYPE, V2TIMConversation.V2TIM_C2C); mContext.startActivity(intent); } @JavascriptInterface public void exchange(){ ARouter.getInstance().build(ARouteConstants.CURRENCY).navigation(); } } @JavascriptInterface public void closeWeb() { //做原生操作 // Intent intent = new Intent(mContext, ListActivity.class); // intent.putExtra("menuName", msg); // startActivity(intent); LogUtils.e("closeWeb"); } }