diff --git a/app.apk b/app.apk deleted file mode 100644 index 0a17b40..0000000 Binary files a/app.apk and /dev/null differ diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml index 86b92a2..9540359 100644 --- a/main/AndroidManifest.xml +++ b/main/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="4.26"> -


海天鹰浏览器 V4.24

+


海天鹰浏览器 V4.26

内置扩展的浏览器。

扩展:链接关键字过滤,链接关键字高亮,图片自定义过滤,视频独立播放。

作者:海天鹰

-

源码:https://gitee.com/sonichy/HTYBrowser_Android/

+

源码:https://www.gitlink.org.cn/sonichy/HTYBrowser

E-mail:sonichy@163.com

参考:

多窗口管理

@@ -23,8 +23,10 @@ p { text-indent:2em; }

获取网页图标

字符串转Bitmap

更新日志:

+

V4.26 (2022-07-13)

  1. 增加页面信息。
  2. 增加资源探查。
+

V4.25 (2022-05-24)

  1. 修复点击开始浏览按钮,编辑栏不消失问题。
  2. 收藏页删除记住位置。
  3. 再次点击App,如果已经有页面,不打开新页面。

V4.24 (2022-04-27)

  1. 修复网页未加载,地址栏没有更新的问题。
  2. 优化错误信息页面。
  3. 链接增加分享菜单。
  4. 增加接收分享。
  5. 如果不是最后一页,点击返回关闭当前页。
  6. 加入QQ、微信、阿里云盘文件打开列表。
-

V4.23 (2021-12-14)

  1. 增加保存网页,但是存在严重问题,< 全变成 \u003C。
+

V4.23 (2021-12-14)

  1. 增加保存网页,但是存在严重问题,< 全变成 \u003C。待选解决方案:StringEscapeUtils.unescapeEcmaScript(html),依赖库commons-text。

V4.22 (2021-12-02)

  1. 解决高亮扩展链接内部含有 <font color="*">,文字颜色设置失效问题。

V4.21 (2021-11-21)

  1. 收藏夹增加在新窗口打开。
  2. 简化视频截图代码。

V4.20 (2021-08-10)

  1. 双击返回键退出
diff --git a/main/java/com/hty/browser/FavoriteActivity.java b/main/java/com/hty/browser/FavoriteActivity.java index 836557d..fe54f9d 100644 --- a/main/java/com/hty/browser/FavoriteActivity.java +++ b/main/java/com/hty/browser/FavoriteActivity.java @@ -243,6 +243,7 @@ public class FavoriteActivity extends Activity { builder.create().show(); break; case 4: + position = listView.getFirstVisiblePosition(); int id = Integer.parseInt(((TextView) menuInfo.targetView.findViewById(R.id.id)).getText().toString()); DBHelper helper = new DBHelper(getApplicationContext()); helper.del(id); @@ -292,7 +293,7 @@ public class FavoriteActivity extends Activity { }); listView.setAdapter(adapter); Log.e(Thread.currentThread().getStackTrace()[2] + "", position + ""); - //listView.setSelection(position); + listView.setSelection(position); } class EditChangedListener implements TextWatcher { diff --git a/main/java/com/hty/browser/MainActivity.java b/main/java/com/hty/browser/MainActivity.java index fb102c2..09971ec 100644 --- a/main/java/com/hty/browser/MainActivity.java +++ b/main/java/com/hty/browser/MainActivity.java @@ -1,6 +1,5 @@ package com.hty.browser; -import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; @@ -17,7 +16,6 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -30,7 +28,6 @@ import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.DownloadManager; -import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ClipData; import android.content.ClipboardManager; @@ -100,7 +97,6 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; -//import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -126,10 +122,10 @@ public class MainActivity extends Activity { int currentPage; int FILECHOOSER_DOWNLOAD_PATH = 3; DownloadCompleteReceiver receiver; - private static String[] PERMISSIONS = { + final String[] PERMISSIONS = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; - private static int REQUEST_PERMISSION_CODE = 1; + final int REQUEST_PERMISSION_CODE = 1; Boolean isExit = false; ClipboardManager clipboardManager; @@ -343,6 +339,9 @@ public class MainActivity extends Activity { case R.id.button_go: //loadPage(editText1.getText().toString()); list_webView.get(currentPage).loadUrl(editText_url.getText().toString()); + IMM.hideSoftInputFromWindow(editText_url.getWindowToken(), 0); + button_title.setVisibility(View.VISIBLE); + editText_url.setVisibility(View.GONE); break; case R.id.button_back: if (list_webView.get(currentPage).canGoBack()) { @@ -673,7 +672,7 @@ public class MainActivity extends Activity { } private void MenuDialog() { - String[] items = { "新建窗口", "关闭当前窗口", "收藏当前页", "收藏夹", "查找", "分享", "视频独立播放", "视频截图", "视频在播放器中打开", "查看源码", "保存", "全屏", "广告过滤规则", "设置", "检查更新", "关于", "退出", "清除缓存" }; + String[] items = { "新建窗口", "关闭当前窗口", "收藏当前页", "收藏夹", "查找", "分享", "网页信息", "视频独立播放", "视频截图", "视频在播放器中打开", "资源探查", "查看源码", "保存", "全屏", "广告过滤规则", "清除当前页面缓存", "设置", "检查更新", "关于", "退出" }; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("菜单"); //builder.setIcon(android.R.drawable.ic_menu_preferences); @@ -808,10 +807,18 @@ public class MainActivity extends Activity { startActivity(Intent.createChooser(intent, "分享")); break; case 6: + AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this); + builder1.setIcon(android.R.drawable.ic_dialog_info); + builder1.setTitle("网页信息"); + builder1.setMessage("标题:\n" + ptitle + "\n\n网址:\n" + urln); + builder1.setPositiveButton("确定", null); + builder1.create().show(); + break; + case 7: String js = "javascript:var videos=document.getElementsByTagName('video'); if(videos.length!=0){ var url=videos[0].src;window.location.href=url; } else { var iframes=document.getElementsByTagName('iframe'); if(iframes.length!=0) window.location.href=iframes[0].src; }"; list_webView.get(currentPage).loadUrl(js); break; - case 7: + case 8: js = "javascript:function capture(){var videos=document.getElementsByTagName('video');if(videos.length==0){var iframe=document.getElementsByTagName('iframe');videos=iframe[0].contentWindow.document.getElementsByTagName('video');}var canvas=document.createElement('canvas');videos[0].crossOrigin='*';canvas.width=videos[0].videoWidth;canvas.height=videos[0].videoHeight;canvas.getContext('2d').drawImage(videos[0],0,0,canvas.width,canvas.height);var s = canvas.toDataURL('image/jpeg',1.0); return s;}"; list_webView.get(currentPage).loadUrl(js); list_webView.get(currentPage).evaluateJavascript("javascript:capture()", new ValueCallback() { @@ -851,7 +858,7 @@ public class MainActivity extends Activity { } }); break; - case 8: + case 9: //网址正确,运行崩溃,本地播放器没有注册网络视频类型? js = "javascript:function getVideoUrl(){var video_url='';var videos=document.getElementsByTagName('video');if(videos.length==0){var iframe=document.getElementsByTagName('iframe');videos=iframe[0].contentWindow.document.getElementsByTagName('video');}else{video_url=videos[0].src;}return video_url;}"; list_webView.get(currentPage).loadUrl(js); @@ -874,47 +881,64 @@ public class MainActivity extends Activity { } }); break; - case 9://查看源码改多标签后失效 + case 10: + js = "javascript:function inspect(){var videos=document.getElementsByTagName('video');var array_video=new Array();for(var i=0;i() { + @Override + public void onReceiveValue(String value) { + //Log.e(Thread.currentThread().getStackTrace()[2] + "", value); + newWindow(""); + String html = "资源探查

视频

框架

图片

"; + list_webView.get(currentPage).loadData(html, "text/html; charset=UTF-8", null); + } + }); + break; + case 11://查看源码改多标签后失效 js = "javascript:var s=''+document.getElementsByTagName('html')[0].innerHTML+''; document.body.innerHTML=''; var pre=document.createElement('pre'); document.body.appendChild(pre); pre.textContent=s;"; list_webView.get(currentPage).loadUrl(js); break; - case 10: + case 12: js = "javascript:function save(){var s=''+document.getElementsByTagName('html')[0].innerHTML+''; return s;}"; list_webView.get(currentPage).loadUrl(js); list_webView.get(currentPage).evaluateJavascript("javascript:save()", new ValueCallback() { @Override public void onReceiveValue(String value) { - Log.e(Thread.currentThread().getStackTrace()[2] + "", "" + value); + // < 变成 \u003C + //https://blog.csdn.net/x2L5gX/article/details/118122921 + //import org.apache.commons.text.StringEscapeUtils; + //value = StringEscapeUtils.unescapeJava(value); + //Log.e(Thread.currentThread().getStackTrace()[2] + "", "" + value); writeFile(button_title.getText().toString() + ".htm", value); } }); break; - case 11: + case 13: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); LinearLayout2.setVisibility(View.GONE); pgb1.setVisibility(View.GONE); isFullScreen = true; break; - case 12: + case 14: DialogBlockList(); break; - case 13: + case 15: + list_webView.get(currentPage).clearCache(true); + break; + case 16: startActivity(new Intent(MainActivity.this, SettingsActivity.class)); break; - case 14: + case 17: isManualCheckUpdate = true; new Thread(CU).start(); break; - case 15: + case 18: newWindow("file:///android_asset/about.htm"); break; - case 16: + case 19: unregisterReceiver(receiver); MainActivity.this.finish(); break; - case 17: - list_webView.get(currentPage).clearCache(true); - break; } } }); @@ -1204,7 +1228,8 @@ public class MainActivity extends Activity { void newWindow(String surl) { WebView webView = new WebView(MainActivity.this); settingWebView(webView); - webView.loadUrl(surl); + if (!surl.equals("")) + webView.loadUrl(surl); webViewLayout.removeAllViews(); webViewLayout.addView(webView); list_webView.add(webView); @@ -1286,7 +1311,7 @@ public class MainActivity extends Activity { super.onReceivedError(view, errorCode, description, failingUrl); //Toast.makeText(getApplicationContext(), "ReceivedError:" + errorCode, Toast.LENGTH_SHORT).show(); //if (isNetworkConnected()) { - switch (errorCode) { + switch (errorCode) { // case WebViewClient.ERROR_HOST_LOOKUP: // 找不到主机,跳转百度搜索 // Log.e(Thread.currentThread().getStackTrace()[2] + "", failingUrl); // String url = "http://m.baidu.com/s?word=" + urlo; @@ -1294,12 +1319,12 @@ public class MainActivity extends Activity { // view.loadUrl(url); // urln = url; // break; - default: - Log.e(Thread.currentThread().getStackTrace()[2] + "", failingUrl); - view.loadDataWithBaseURL(failingUrl, "" + failingUrl + "

无法访问此网站

" + failingUrl + " 无法访问,因为:
" + description + "

", "text/html", "utf-8", ""); - } + default: + Log.e(Thread.currentThread().getStackTrace()[2] + "", failingUrl); + view.loadDataWithBaseURL(failingUrl, "" + failingUrl + "

无法访问此网站

" + failingUrl + " 无法访问,因为:
" + description + "

", "text/html", "utf-8", ""); + } //} else { - // view.loadDataWithBaseURL("", "网络未连接

网络未连接

", "text/html", "utf-8", ""); + // view.loadDataWithBaseURL("", "网络未连接

网络未连接

", "text/html", "utf-8", ""); //} } }); @@ -1336,7 +1361,7 @@ public class MainActivity extends Activity { // JS的alert('')提示信息转换成安卓控件提示信息 @Override - public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { + public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); result.confirm(); return true; @@ -1427,7 +1452,7 @@ public class MainActivity extends Activity { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { - Log.d("onConsoleMessage", consoleMessage.message() + " at " + consoleMessage.sourceId() + ":" + consoleMessage.lineNumber()); + Log.e("onConsoleMessage: " + consoleMessage.lineNumber(), consoleMessage.message()); return super.onConsoleMessage(consoleMessage); } @@ -1438,9 +1463,10 @@ public class MainActivity extends Activity { super.onGeolocationPermissionsShowPrompt(origin, callback); } - // target="_blank" 处理,Android 11 崩溃无Log + // target="_blank" 处理,Android >11 崩溃无Log @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { + Log.e("_blank", view + ", " + isDialog + "," + isUserGesture + ", " + resultMsg); if (isUserGesture) { WebView webView = new WebView(MainActivity.this); settingWebView(webView); @@ -1462,6 +1488,7 @@ public class MainActivity extends Activity { void getDataFromIntent(Intent intent) { //Log.e(Thread.currentThread().getStackTrace()[2] + "", "intent(" + intent + ")"); + if (list_webView.size() != 0 && intent.hasCategory(Intent.CATEGORY_LAUNCHER)) return; if (intent.getAction().equals(Intent.ACTION_VIEW)) { urln = intent.getDataString(); newWindow(urln); diff --git a/version b/version index db4f2b5..f9e8a8c 100644 --- a/version +++ b/version @@ -1 +1 @@ -4.24 \ No newline at end of file +4.26 \ No newline at end of file