package com.demo.app.ui.common; import android.Manifest; import android.app.Notification; import android.app.NotificationManager; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.PixelFormat; import android.net.Uri; import android.net.http.SslError; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.webkit.DownloadListener; import android.webkit.SslErrorHandler; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import android.widget.TextView; import com.demo.R; import com.demo.app.utils.AppConfigUtil; import com.demo.app.utils.FileUtils; import com.demo.app.utils.browser.MyJavaInterface; import com.demo.lib.common.activity.BaseActivity; import com.demo.lib.common.util.common.StringUtils; import java.io.File; import java.util.Set; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.core.content.ContextCompat; public class BrowserActivity extends BaseActivity implements OnClickListener { private final static int FILECHOOSER_RESULTCODE = 10002; private static final String TAG = BrowserActivity.class.getSimpleName(); private TextView tv_top_bar_left; private TextView tv_top_bar_left2; private TextView tv_top_bar_middle; private WebView webview; ProgressBar progressBar; private ValueCallback mUploadMessage; private void initX5WebView() { webview = findViewById(R.id.webview); webview.setDownloadListener(new MyWebViewDownLoadListener()); webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.i(TAG, "url:" + url); if (url == null) { return super.shouldOverrideUrlLoading(view, url); } if (url.startsWith("weixin://") || url.startsWith("alipay://")) { } else if (!url.startsWith("http")) { if (jumpOutProtocolSet != null) { for (String prefix : jumpOutProtocolSet) { if (url.startsWith(prefix)) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } } } return true; } return super.shouldOverrideUrlLoading(view, url); } @Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) { String url = webResourceRequest.getUrl().toString(); Log.i(TAG, "url:" + url); return super.shouldOverrideUrlLoading(webView, webResourceRequest); } @Override public void onPageFinished(WebView webView, String s) { super.onPageFinished(webView, s); } @Override public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) { } }); webview.setWebChromeClient(new WebChromeClient() { @Override public void onReceivedTitle(WebView view, String title) { if (!StringUtils.isEmpty(wholeTitle)) return; tv_top_bar_middle.setText(title); } @Override public void onProgressChanged(WebView webView, int i) { if (i == 100) { progressBar.setVisibility(View.GONE); } else { if (View.INVISIBLE == progressBar.getVisibility()) { progressBar.setVisibility(View.VISIBLE); } progressBar.setProgress(i); } super.onProgressChanged(webView, i); } // 判断权限集合 是否授权 false授权 true未授权 public boolean lacksPermissions(String... permissions) { for (String permission : permissions) { if (lacksPermission(permission)) { return true; } } return false; } // 判断是否缺少权限 private boolean lacksPermission(String permission) { //权限未授权 return ContextCompat.checkSelfPermission(getApplicationContext(), permission) == PackageManager.PERMISSION_DENIED; } @Override public boolean onShowFileChooser(WebView webView, ValueCallback valueCallback, FileChooserParams fileChooserParams) { if (mUploadMessage != null) { mUploadMessage.onReceiveValue(null); } if (lacksPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)) { //存储权限未开启 valueCallback.onReceiveValue(null); ActivityCompat.requestPermissions(BrowserActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 10023); return true; } mUploadMessage = valueCallback; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); if (fileChooserParams != null && fileChooserParams.getAcceptTypes() != null && fileChooserParams.getAcceptTypes().length > 0) { i.setType(fileChooserParams.getAcceptTypes()[0]); } else { i.setType("*/*"); } startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE); return true; } }); WebSettings webSetting = webview.getSettings(); webSetting.setJavaScriptEnabled(true); webSetting.setTextZoom(100); webSetting.setDomStorageEnabled(true); webview.addJavascriptInterface(new MyJavaInterface(this, webview), getString(R.string.webview_java_interface_name)); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); if (result == null) { mUploadMessage.onReceiveValue(null); mUploadMessage = null; return; } String path = FileUtils.getFilePathByUri(this, result); if (TextUtils.isEmpty(path)) { mUploadMessage.onReceiveValue(null); mUploadMessage = null; return; } Uri uri = Uri.fromFile(new File(path)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mUploadMessage.onReceiveValue(new Uri[]{uri}); } else { mUploadMessage.onReceiveValue(uri); } mUploadMessage = null; } } private String wholeTitle; private Set jumpOutProtocolSet; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.activity_browser); tv_top_bar_left = findViewById(R.id.tv_top_bar_left); tv_top_bar_left2 = findViewById(R.id.tv_top_bar_left2); tv_top_bar_left2.setVisibility(View.VISIBLE); tv_top_bar_middle = findViewById(R.id.tv_top_bar_middle); tv_top_bar_left2.setText("关闭"); tv_top_bar_left.setOnClickListener(this); tv_top_bar_left2.setOnClickListener(this); progressBar = findViewById(R.id.myProgressBar); progressBar.setMax(100); progressBar.setProgressDrawable(this.getResources() .getDrawable(R.drawable.color_progressbar)); initX5WebView(); jumpOutProtocolSet = AppConfigUtil.getBrowserJumpOutProtocolPrefix(getApplicationContext()); webview.loadUrl(getIntent().getStringExtra("url")); wholeTitle = getIntent().getStringExtra("title"); if (!StringUtils.isEmpty(wholeTitle)) { tv_top_bar_middle.setText(wholeTitle); } } // 文件下载监听 private class MyWebViewDownLoadListener implements DownloadListener { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { // startDownLoadFile(url); } } private NotificationManager manager; private Notification notif; private Notification.Builder oBuilder; private NotificationCompat.Builder builder; int j = -1; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { oBuilder.setContentText(msg.arg1 + "%"); notif = oBuilder.build(); } else { builder.setContentText(msg.arg1 + "%"); notif = builder.build(); } manager.notify(0, notif); break; case 1: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { oBuilder.setContentText("下载完成"); notif = oBuilder.build(); } else { builder.setContentText("下载完成"); notif = builder.build(); } manager.notify(0, notif); j = 100; manager.cancelAll(); break; default: break; } } }; @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override protected void onDestroy() { if (webview != null) { webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); webview.clearHistory(); ((ViewGroup) webview.getParent()).removeView(webview); webview.destroy(); webview = null; } super.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_top_bar_left: { if (!webview.canGoBack()) finish(); else { webview.goBack(); } } break; case R.id.tv_top_bar_left2: { finish(); } break; default: break; } } // 设置回退 // 覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { webview.goBack(); // goBack()表示返回WebView的上一页面 return true; } return super.onKeyDown(keyCode, event); } }