├── README.md
├── app.apk
├── main
├── AndroidManifest.xml
├── assets
│ ├── about.htm
│ └── logo.png
├── java
│ └── com
│ │ └── hty
│ │ └── browser
│ │ ├── DBHelper.java
│ │ ├── FavoriteActivity.java
│ │ ├── MainActivity.java
│ │ └── SettingsActivity.java
└── res
│ ├── drawable-hdpi
│ ├── exitfullscreen.jpg
│ ├── ic_launcher.png
│ ├── network.png
│ └── play.png
│ ├── drawable-mdpi
│ ├── folder_download.png
│ └── ic_launcher.png
│ ├── drawable-xhdpi
│ └── ic_launcher.png
│ ├── drawable-xxhdpi
│ ├── arrow.png
│ ├── ic_launcher.png
│ └── link.png
│ ├── drawable
│ ├── border.xml
│ └── progressbar_color.xml
│ ├── layout
│ ├── activity_favorite.xml
│ ├── activity_main.xml
│ ├── dialog_download.xml
│ └── favorite_row.xml
│ ├── values
│ └── strings.xml
│ └── xml
│ └── preference.xml
├── preview.png
└── version
/README.md:
--------------------------------------------------------------------------------
1 | # Android:海天鹰浏览器
2 | 基于 Android WebView 的多窗口浏览器,支持收藏夹、图片广告过滤、视频独立播放。
3 | ### 主界面
4 | 
--------------------------------------------------------------------------------
/app.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sonichy/HTYBrowser_Android/df3f62afed2f9826268eb0dc52736099c428568a/app.apk
--------------------------------------------------------------------------------
/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
40 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/main/assets/about.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 海天鹰浏览器
6 |
10 |
11 |
12 | 
海天鹰浏览器 V4.18
13 | 内置扩展的浏览器。
14 | 扩展:链接关键字过滤,链接关键字高亮,图片自定义过滤,视频独立播放。
15 | 作者:海天鹰
16 | 源码:https://github.com/sonichy/Android_HTYBrowser
17 | E-mail:sonichy@163.com
18 | 参考:
19 | 多窗口管理
20 | 链接的 target=_blank 在新窗口中打开 一 二
21 | Android WebView 三种文件下载方式
22 | 自动安装apk包
23 | 获取网页图标
24 | 字符串转Bitmap
25 | 更新日志:
26 | V4.19 (2021-06-27)
- 增加请求电脑版网页。
27 | V4.18 (2021-06-01)
- 增加动态权限请求。
28 | V4.17 (2021-03-02)
- 允许HTTPS、HTTP混合内容,解决微信网页视频无法播放的问题。
29 | V4.16 (2020-10-14)
- 取消引起崩溃的复制图片。
30 | V4.15 (2020-10-01)
- 优化猜测下载文件名。
31 | V4.14 (2020-09-20)
- 优化下载对话框百度网页图片文件名填充,支持修改下载文件名。
32 | V4.13 (2020-08-30)
- 图片查看改为在新窗口中打开。
- 修复修改、删除收藏不能记忆位置问题。
33 | V4.12 (2020-07-17)
- 适配全面屏导航栏背景色。
- 收藏夹无标题栏自定义菜单改成标题栏菜单。
34 | V4.11 (2020-03-03)
- 收藏夹增加数目统计。
- 收藏夹增加菜单,导出HTML、CSV。
35 | V4.10 (2019-12-17)
- 优化视频独立播放。
36 | V4.9 (2019-11-06)
- 收藏夹网址增加分享功能。
37 | V4.8 (2019-10-25)
- 协议过滤:去除淘宝跳转,增加ftp。
- 修复:退出前未反注册广播。
38 | V4.7 (2019-08-14)
- 增加:清除缓存菜单。
- target="_blank"是用户触发才在新窗口中打开。
39 | V4.6 (2019-07-16)
- 修复:移动数据连接不能下载。
40 | V4.5 (2019-06-19)
- 增加:视频截图。
- 简化:视频独立播放。
41 | V4.4 (2019-05-02)
- 增加扩展和设置开关:图片宽度超过父容器宽度,图片缩小到父容器宽度。
42 | V4.3 (2019-04-11)
- 收藏夹删除收藏时记住位置。
43 | V4.2 (2019-03-29)
- 下载弹出确认窗口,避免自动下载。
44 | V4.1 (2019-03-05)
- 链接的 target=_blank 在新窗口中打开。
- 淘宝协议自动跳转淘宝APP。
45 | V4.0 (2019-03-02)
- 实现多窗口。
46 | V3.12 (2019-02-27)
- 支持跨域。
- 获取网页图标。
- 屏蔽百度首页视频百度好看跳转下载。
- Android API 19 以上开启调试,运行 adb devices 连接手机,Chrome 浏览器 chrome://inspect 查看。
- 增加标题按钮,点击标题按钮显示地址栏,点击网页隐藏地址栏。
47 | V3.11 (2019-02-13)
- 链接中的关键字屏蔽、高亮可设置。
48 | V3.10 (2019-02-10)
- 增加:收藏前修改,收藏后修改,修改校验。
49 | V3.9 (2018-12-20)
- 视频独立播放JS读不到iframe里的video,使用跳转iframe代替。
50 | V3.8 (2018-07-14)
- 增加定位权限。
51 | V3.7 (2018-06-13)
- 增加自动更新。
52 | V3.6 (2018-05-30)
- 修复从收藏夹返回输入法不能自动隐藏的问题。
53 | V3.5 (2018-04-25)
- 收藏夹支持搜索。
54 | V3.4 (2018-03-13)
- 增加视频独立播放。
- 使用系统下载取代浏览器跳转下载、图片下载,并增加链接下载
55 | V3.3 (2018-01)
- 增加分享菜单。
- 增加:视频全屏禁用屏幕休眠。
- 解决网页跳转APP协议问题。
56 | V3.2 (2017-12-17)
- 修复:关闭查找框,高亮不消失的问题。
- 增加过滤iframe。
- 修复:EditTextPreference没有设置defaultValue,引起第一次运行点击主页菜单崩溃。
57 | V3.1 (2017-09-16)
- 修复:增加设置主页后,从打开方式打开仍然打开主页而不是打开文件的问题。
- 增加全屏菜单。
58 | V3.0 (2017-08-31)
- 增加广告图片自定义过滤。
59 | V2.15 (2017-08-27)
- 增加设置页面,增加主页设置。
60 | V2.14 (2017-03-05)
- 按钮设置空背景去除边框,使按钮更小,从而使导航栏高度更小,下面的网页更大;更换主菜单图标。
61 | V2.13 (2016-10-07)
- 下载图片后自动添加到图库中。
62 | V2.12 (2016-08-17)
- 优化移动端关于页面。
63 | V2.11 (2016-05-08)
- 增加显示网页源码。
- 增加查找功能。
- 自定义搜索栏,代替搜索对话框,支持搜索上一个、下一个。
- 适配无虚拟键盘的 Android X86。
- 网址收藏数据库存储到扩展存储上,以免重装应用时数据库被删除。
64 | V2.10 (2016-04-28)
- 设置前进、后退按钮可用、禁用逻辑。
- 点击返回键无历史网页可退时,无动作而不是退到后台。
65 | V2.9 (2016-04-13)
- 浏览器添加到HTML文件打开方式选择列表。
66 | V2.8 (2016-03-11)
- 文字按钮改为图片按钮。
- 适配平板,取消沉浸模式,增加前进、后退、菜单按钮,点击菜单按钮弹出菜单,适配无物理按键。
- 修复图片无扩展名无法保存的问题。
67 | V2.7 (2016-02-25)
- 网址收藏排除[about:blank]。
- 取消恢复前台自动播放视频,因为会引起解锁时新浪微博视频自动播放。
- 全屏暂停时显示播放按钮。
68 | V2.6 (2016-02-21)
- 浏览器退到后台暂停视频播放。
69 | V2.5 (2016-02-14)
- 增加onConsoleMessage。
- 测试视频全屏,MIUI显示控件,LEUI不显示控件,是手机系统问题,因为回退键已做好退出退出全屏功能,取消显示退出全屏按钮。
70 | V2.4 (2016-02-12)
- 视频全屏适用iqiyi.com。
- 点击返回键优先退出全屏,返回上一页次之,最后moveTaskToback。
71 | V2.3 (2016-02-09)
- 修复网络未连接,反复请求百度搜索的问题。
72 | V2.2 (2016-02-03)
- 触摸WebView隐藏地址栏输入法。
- 自定义进度条。
73 | V2.1 (2016-02-01)
- 增加保存图片功能。
74 | V2.0 (2016-01-31)
- 改用SQLite数据库收藏网址。
- 完善收藏夹的显示、添加、删除、点击跳转菜单。
75 | V1.5 (2016-01-28)
- 增加使用localStorage技术的收藏夹。
76 | V1.4 (2016-01-26)
- 修复中文网址打不开时,跳转百度搜索乱码。
- 增加图片长按菜单。
77 | V1.3 (2016-01-25)
- 菜单键增加前进菜单项。
- 增加输入法回车打开网址。
- 改用Holo主题。
- 增加网址补齐[http://]。
- 找不到网站时到百度网搜索。
- 增加进度条。
78 | V1.2 (2016-01-23)
- 支持自适应屏幕,支持缩放。
79 | V1.1 (2016-01-22)
- 增加支持网页input.file转安卓文件选择器。
- 点击加载按钮隐藏输入法。
- 增加支持使用内部浏览器下载文件。
80 | V1.0 (2016-01-21)
- 实现基本的浏览器界面。
- 实现第一个扩展[链接转图片]。
- 网页JS.alert转安卓Toast。
81 |
82 |
--------------------------------------------------------------------------------
/main/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sonichy/HTYBrowser_Android/df3f62afed2f9826268eb0dc52736099c428568a/main/assets/logo.png
--------------------------------------------------------------------------------
/main/java/com/hty/browser/DBHelper.java:
--------------------------------------------------------------------------------
1 | package com.hty.browser;
2 |
3 | import java.io.File;
4 |
5 | import android.content.ContentValues;
6 | import android.content.Context;
7 | import android.database.Cursor;
8 | import android.database.sqlite.SQLiteDatabase;
9 | import android.database.sqlite.SQLiteOpenHelper;
10 |
11 | public class DBHelper extends SQLiteOpenHelper {
12 |
13 | public static final String DATABASE_NAME = MainActivity.dir + File.separator + "webfav.db";
14 | private final static int VERSION = 1;
15 | static String TableName = "webfav";
16 | private SQLiteDatabase db;
17 | private static DBHelper mInstance = null;
18 |
19 | public DBHelper(Context context) {
20 | super(context, DATABASE_NAME, null, VERSION);
21 | }
22 |
23 | public static synchronized DBHelper getInstance(Context context) {
24 | if (mInstance == null) {
25 | mInstance = new DBHelper(context);
26 | }
27 | return mInstance;
28 | }
29 |
30 | @Override
31 | public void onCreate(SQLiteDatabase db) {
32 | this.db = db;
33 | db.execSQL("CREATE TABLE webfav (_id INTEGER PRIMARY KEY , website TEXT, title TEXT)");
34 | }
35 |
36 | @Override
37 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
38 | // db.execSQL("DROP TABLE IF EXISTS battery");
39 | // onCreate(db);
40 | switch (newVersion) {
41 | case 6:
42 | break;
43 | }
44 | }
45 |
46 | public void insert(ContentValues values) {
47 | db = getWritableDatabase();
48 | db.insert(TableName, null, values);
49 | db.close();
50 | }
51 |
52 | public Cursor query(String s) {
53 | db = getWritableDatabase();
54 | Cursor c = null;
55 | if (s.equals("")) {
56 | c = db.query(TableName, null, null, null, null, null, "_id desc");
57 | } else {
58 | c = db.query(TableName, null, "website LIKE '%" + s + "%' or title LIKE '%" + s + "%'", null, null, null, "_id desc");
59 | }
60 | return c;
61 | }
62 |
63 | public void del(int id) {
64 | if (db == null)
65 | db = getWritableDatabase();
66 | db.delete(TableName, "_id=?", new String[] { String.valueOf(id) });
67 | // Log.e("id", id + "");
68 | // db.ExecuteNonQuery(CommandType.Text, "VACUUM");
69 | }
70 |
71 | @Override
72 | public void close() {
73 | if (db != null)
74 | db.close();
75 | }
76 | }
--------------------------------------------------------------------------------
/main/java/com/hty/browser/FavoriteActivity.java:
--------------------------------------------------------------------------------
1 | package com.hty.browser;
2 |
3 | import android.app.Activity;
4 | import android.app.AlertDialog;
5 | import android.content.ClipData;
6 | import android.content.ClipboardManager;
7 | import android.content.ContentValues;
8 | import android.content.Context;
9 | import android.content.DialogInterface;
10 | import android.content.Intent;
11 | import android.database.Cursor;
12 | import android.database.sqlite.SQLiteDatabase;
13 | import android.os.Bundle;
14 | import android.text.Editable;
15 | import android.text.TextWatcher;
16 | import android.util.Log;
17 | import android.view.ContextMenu;
18 | import android.view.ContextMenu.ContextMenuInfo;
19 | import android.view.Menu;
20 | import android.view.MenuItem;
21 | import android.view.MotionEvent;
22 | import android.view.View;
23 | import android.view.View.OnCreateContextMenuListener;
24 | import android.view.WindowManager;
25 | import android.view.inputmethod.InputMethodManager;
26 | import android.widget.AdapterView;
27 | import android.widget.AdapterView.AdapterContextMenuInfo;
28 | import android.widget.AdapterView.OnItemClickListener;
29 | import android.widget.EditText;
30 | import android.widget.ImageButton;
31 | import android.widget.ImageView;
32 | import android.widget.LinearLayout;
33 | import android.widget.ListView;
34 | import android.widget.SimpleCursorAdapter;
35 | import android.widget.TextView;
36 | import android.widget.Toast;
37 |
38 | import java.io.BufferedWriter;
39 | import java.io.File;
40 | import java.io.FileWriter;
41 | import java.lang.reflect.Field;
42 |
43 | public class FavoriteActivity extends Activity {
44 | EditText editText;
45 | ImageButton imageButton_clear;
46 | InputMethodManager IMM;
47 | ListView listView;
48 | SimpleCursorAdapter adapter;
49 | int position = 0;
50 |
51 | @Override
52 | protected void onCreate(Bundle savedInstanceState) {
53 | super.onCreate(savedInstanceState);
54 | setContentView(R.layout.activity_favorite);
55 | getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
56 | IMM = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
57 | imageButton_clear = (ImageButton) findViewById(R.id.imageButton_clear);
58 | imageButton_clear.setOnClickListener(new OnClickListener());
59 | imageButton_clear.setVisibility(View.GONE);
60 | editText = (EditText) findViewById(R.id.editText);
61 | editText.addTextChangedListener(new EditChangedListener());
62 | listView = (ListView) findViewById(R.id.listView1);
63 | listView.setOnItemClickListener(new OnItemClickListener() {
64 | @Override
65 | public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) {
66 | String url = ((TextView) arg1.findViewById(R.id.website)).getText().toString();
67 | Intent intent = new Intent(FavoriteActivity.this, MainActivity.class);
68 | intent.putExtra("url", url);
69 | setResult(RESULT_OK, intent);
70 | IMM.hideSoftInputFromWindow(editText.getWindowToken(), 0);
71 | finish();
72 | }
73 | });
74 | listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
75 | @Override
76 | public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
77 | AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
78 | String title = ((TextView) info.targetView.findViewById(R.id.title)).getText().toString();
79 | menu.setHeaderTitle(title);
80 | menu.add(0, 0, 0, "复制链接");
81 | menu.add(0, 1, 1, "删除");
82 | menu.add(0, 2, 2, "修改");
83 | menu.add(0, 3, 3, "分享");
84 | }
85 | });
86 | listView.setOnTouchListener(new View.OnTouchListener() {
87 | @Override
88 | public boolean onTouch(View v, MotionEvent event) {
89 | IMM.hideSoftInputFromWindow(editText.getWindowToken(), 0);
90 | return false;
91 | }
92 | });
93 | search(editText.getText().toString());
94 | }
95 |
96 |
97 |
98 | @Override
99 | public boolean onCreateOptionsMenu(Menu menu) {
100 | String[] sm = { "导出HTML", "导出CSV" };
101 | for (int i=0; i\n收藏夹\n\n\n\n收藏夹" + adapter.getCount() + "
\n\n\n