4.0版:参考别人的代码终于实现了多窗口

This commit is contained in:
sonichy 2019-03-03 22:31:08 +08:00
parent 109cd67b13
commit aec6ce7b2c
9 changed files with 399 additions and 427 deletions

View File

@ -1,4 +1,4 @@
# Android海天鹰浏览器
基于 Android WebView 组件的浏览器,支持收藏夹、图片广告过滤、视频独立播放。
### 主界面
# Android海天鹰浏览器
基于 Android WebView 的多窗口浏览器,支持收藏夹、图片广告过滤、视频独立播放。
### 主界面
![alt](preview.png)

BIN
app.apk

Binary file not shown.

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hty.browser"
android:versionCode="3"
android:versionName="3.12">
android:versionCode="4"
android:versionName="4.0">
<uses-sdk
android:minSdkVersion="16"
@ -38,7 +38,6 @@
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>-->
<!-- 查询网络状态权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="andorid.permission.CHANGE_CONFIGURATION"/>

View File

@ -9,18 +9,20 @@ p { text-indent:2em; }
</style>
</head>
<body>
<h2 align=center><img src=logo.png><br>海天鹰浏览器 V3.12</h2>
<h2 align=center><img src=logo.png><br>海天鹰浏览器 V4.0</h2>
<p>内置扩展的浏览器。</p>
<p>扩展:链接关键字过滤,链接关键字高亮,图片自定义过滤,视频独立播放。</p>
<p>作者:黄颖</p>
<p>源码:<a href="https://github.com/sonichy/Android_HTYBrowser" target="_blank">https://github.com/sonichy/Android_HTYBrowser</a></p>
<p>E-mailsonichy@163.com</p>
<h3>参考:</h3>
<p><a href="https://gitee.com/daiji111/flying_browser/blob/master/app/src/main/java/com/daiji/feixiang/BrowserActivity.java">多窗口管理</a></p>
<p><a href="https://www.jianshu.com/p/6e38e1ef203a" target="_blank">Android WebView 三种文件下载方式</a></p>
<p><a href="https://blog.csdn.net/lowprofile_coding/article/details/77852131" target="_blank">自动安装apk包</a></p>
<p><a href="https://stackoverflow.com/questions/3462582/display-the-android-webviews-favicon" target="_blank">获取网页图标</a></p>
<h3>更新日志:</h3>
<h3>V3.12 (2019-02-25)</h3><ol><li>支持跨域。</li><li>获取网页图标。</li><li>屏蔽百度首页视频百度好看跳转下载。</li><li>Android API 19 以上开启调试,运行 adb devices 连接手机Chrome 浏览器 chrome://inspect 查看。</li></ol>
<h3>V4.0 (2019-02-13)</h3><ol><li>实现多窗口。</li></ol>
<h3>V3.12 (2019-02-27)</h3><ol><li>支持跨域。</li><li>获取网页图标。</li><li>屏蔽百度首页视频百度好看跳转下载。</li><li>Android API 19 以上开启调试,运行 adb devices 连接手机Chrome 浏览器 chrome://inspect 查看。</li><li>增加标题按钮,点击标题按钮显示地址栏,点击网页隐藏地址栏。</li></ol>
<h3>V3.11 (2019-02-13)</h3><ol><li>链接中的关键字屏蔽、高亮可设置。</li></ol>
<h3>V3.10 (2019-02-10)</h3><ol><li>增加:收藏前修改,收藏后修改,修改校验。</li></ol>
<h3>V3.9 (2018-12-20)</h3><ol><li>视频独立播放JS读不到iframe里的video使用跳转iframe代替。</li></ol>

View File

@ -10,14 +10,9 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
@ -25,7 +20,6 @@ import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebIconDatabase;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
@ -38,12 +32,7 @@ import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class FavoriteActivity extends Activity {
SimpleCursorAdapter adapter;
@ -51,7 +40,6 @@ public class FavoriteActivity extends Activity {
EditText editText;
InputMethodManager IMM;
ImageButton imageButton_clear;
WebIconDatabase WID;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -66,8 +54,6 @@ public class FavoriteActivity extends Activity {
imageButton_clear.setVisibility(View.GONE);
search(editText.getText().toString());
IMM = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
WID = WebIconDatabase.getInstance();
WID.open(getDir("icons", MODE_PRIVATE).getPath());
}
class ButtonListener implements View.OnClickListener {
@ -190,40 +176,24 @@ public class FavoriteActivity extends Activity {
void search(String s) {
DBHelper helper = new DBHelper(this);
Cursor c = helper.query(s);
Cursor cursor1 = helper.query(s);
String[] from = { "_id", "title", "website", "website" };
int[] to = { R.id.id, R.id.title, R.id.website, R.id.imageView_favicon };
adapter = new SimpleCursorAdapter(this, R.layout.favorite_row, c, from, to, 0);
adapter = new SimpleCursorAdapter(this, R.layout.favorite_row, cursor1, from, to, 0);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder(){
public boolean setViewValue(View view, Cursor cursor, int columnIndex){
//Log.e("L192", view.toString() + columnIndex);
if(view.getId() == R.id.imageView_favicon){
if (view.getId() == R.id.imageView_favicon) {
String website = cursor.getString(columnIndex);
// if (website.startsWith("https://")) {
// //((ImageView) view).setImageResource(android.R.drawable.ic_secure);
// Runner1 r1 = new Runner1();
// r1.setUrl("https://static.easyicon.net/preview/52/523893.gif");
// r1.setView(view);
// Thread thread1 = new Thread(r1);
// thread1.start();
// return true;
// } else if (website.startsWith("http://")) {
// // ((ImageView) view).setImageResource(android.R.drawable.ic_partial_secure);
// Runner1 r1 = new Runner1();
// r1.setUrl("https://static.easyicon.net/preview/1/11847.gif");
// r1.setView(view);
// Thread thread1 = new Thread(r1);
// thread1.start();
// return true;
// } else {
// ((ImageView) view).setImageResource(R.drawable.network);
// return true;
// }
Runner1 r1 = new Runner1();
r1.setUrl(website);
r1.setView(view);
Thread thread1 = new Thread(r1);
thread1.start();
if (website.startsWith("https://")) {
((ImageView) view).setImageResource(android.R.drawable.ic_secure);
} else if (website.startsWith("http://")) {
((ImageView) view).setImageResource(android.R.drawable.ic_partial_secure);
} else if (website.startsWith("file://")) {
((ImageView) view).setImageResource(android.R.drawable.stat_notify_sdcard);
} else {
((ImageView) view).setImageResource(R.drawable.network);
}
return true;
}
return false;
@ -231,32 +201,6 @@ public class FavoriteActivity extends Activity {
});
listView.setAdapter(adapter);
// WebIconDatabase WID = WebIconDatabase.getInstance();
// WID.open(getDir("icons", MODE_PRIVATE).getPath());
// for (int i=0; i<adapter.getCount(); i++) {
// LinearLayout layout = (LinearLayout) listView.getAdapter().getView(i, null, null);
// String website = ((TextView) layout.findViewById(R.id.website)).getText().toString();
// if (website.startsWith("https://")) {
// Log.e("star_big_on", website);
// ImageView imageView = (ImageView) layout.findViewById(R.id.imageView_favicon);
// imageView.setImageResource(android.R.drawable.star_big_on);
// } else if (website.startsWith("http://")){
// ImageView imageView = (ImageView) layout.findViewById(R.id.imageView_favicon);
// imageView.setImageResource(android.R.drawable.star_big_off);
// Log.e("star_big_off", website);
// } else {
// Log.e("earth", website);
// }
// WID.requestIconForPageUrl(website, new WebIconDatabase.IconListener() {
// public void onReceivedIcon(String url, Bitmap icon) {
// Log.e("onReceivedIcon", url);
// ImageView imageView = (ImageView) layout.findViewById(R.id.imageView_favicon);
// imageView.setImageBitmap(icon);
// }
// });
// }
// adapter.notifyDataSetChanged();
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
@ -306,72 +250,4 @@ public class FavoriteActivity extends Activity {
}
}
public Bitmap webBitMap(String surl) {
URL url = null;
Bitmap bitmap = null;
try {
url = new URL(surl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream IS = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(IS);
IS.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
class Runner1 implements Runnable {
private String surl;
private View view;
private void setUrl(String surl1) {
surl = surl1;
}
private void setView(View view1) {
view = view1;
}
public void run() {
// Bitmap bitmap = webBitMap(surl);
// Message msg = new Message();
// Bundle bundle = new Bundle();
// bundle.putParcelable("bitmap", bitmap);
// msg.setData(bundle);
// msg.obj = view;
// handler.sendMessage(msg);
Log.e("L350", surl);
WID.requestIconForPageUrl(surl, new WebIconDatabase.IconListener() {
public void onReceivedIcon(String url, Bitmap icon) {
Log.e("L353", url);
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", icon);
msg.setData(bundle);
msg.obj = view;
handler.sendMessage(msg);
}
});
}
}
static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
Bitmap bitmap = bundle.getParcelable("bitmap");
View view = (View) msg.obj;
Log.e("L372", "setIcon");
((ImageView) view).setImageBitmap(bitmap);
}
};
}

View File

@ -34,6 +34,7 @@ import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.media.MediaScannerConnection;
@ -76,23 +77,25 @@ import android.webkit.WebView.FindListener;
import android.webkit.WebView.HitTestResult;
import android.webkit.WebViewClient;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
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;
public class MainActivity extends Activity {
Button button_title, button_page;
TextView findCount;
EditText editText1, findText;
ImageButton btnGo, btnBack, btnForward, btnMenu, findPrev, findNext, findClose, imageButton_info;
WebView webView1;
// RelativeLayout RelativeLayout1;
LinearLayout LinearLayout1, LinearLayout2;
FrameLayout video, findbar;
FrameLayout webViewLayout, video, findbar;
ImageView imageView1;
InputMethodManager IMM;
ProgressBar pgb1;
@ -105,6 +108,8 @@ public class MainActivity extends Activity {
SharedPreferences sharedPreferences;
Thread CU;
long downloadIdUpdate;
List<WebView> list_webView = new ArrayList<>();
int currentPage;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -117,14 +122,12 @@ public class MainActivity extends Activity {
dir.mkdirs();
}
setContentView(R.layout.activity_main);
//ptitle = "百度";
//urln = "http//www.baidu.com";
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
LinearLayout1 = (LinearLayout) findViewById(R.id.LinearLayout1);
LinearLayout2 = (LinearLayout) findViewById(R.id.LinearLayout2);
// RelativeLayout1 = (RelativeLayout)
// findViewById(R.id.RelativeLayout1);
// RelativeLayout1 = (RelativeLayout) findViewById(R.id.RelativeLayout1);
webViewLayout = (FrameLayout) findViewById(R.id.webViewLayout);
video = (FrameLayout) findViewById(R.id.video);
findbar = (FrameLayout) findViewById(R.id.findbar);
pgb1 = (ProgressBar) findViewById(R.id.progressBar1);
@ -155,7 +158,10 @@ public class MainActivity extends Activity {
findNext = (ImageButton) findViewById(R.id.findNext);
findClose = (ImageButton) findViewById(R.id.findClose);
imageButton_info = (ImageButton) findViewById(R.id.imageButton_info);
// imageView1.setAlpha(100);
button_title = (Button) findViewById(R.id.button_title);
button_page = (Button) findViewById(R.id.button_page);
button_title.setOnClickListener(new ButtonListener());
button_page.setOnClickListener(new ButtonListener());
btnGo.setOnClickListener(new ButtonListener());
btnBack.setOnClickListener(new ButtonListener());
btnForward.setOnClickListener(new ButtonListener());
@ -165,218 +171,9 @@ public class MainActivity extends Activity {
findNext.setOnClickListener(new ButtonListener());
findClose.setOnClickListener(new ButtonListener());
editText1 = (EditText) findViewById(R.id.EditText1);
webView1 = (WebView) findViewById(R.id.WebView1);
editText1.setVisibility(View.GONE);
WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath()); //获取图标数据库路径
registerForContextMenu(webView1);
// 开启JS
webView1.getSettings().setJavaScriptEnabled(true);
// 开启JS能打开窗口
webView1.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
// 开启缓存
webView1.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
// 自适应屏幕
webView1.getSettings().setUseWideViewPort(true);
webView1.getSettings().setLoadWithOverviewMode(true);
// 支持缩放
webView1.getSettings().setSupportZoom(true);
// 启用内置缩放控件
webView1.getSettings().setBuiltInZoomControls(true);
// 隐藏缩放控件
webView1.getSettings().setDisplayZoomControls(false);
// 开启访问文件
webView1.getSettings().setAllowFileAccess(true);
// 开启数据库
webView1.getSettings().setDatabaseEnabled(true);
// 开启localStorage
webView1.getSettings().setDomStorageEnabled(true);
// 开启定位
webView1.getSettings().setGeolocationEnabled(true);
// 支持多窗口
webView1.getSettings().supportMultipleWindows();
// 支持获取手势焦点
webView1.requestFocusFromTouch();
// 允许跨域
webView1.getSettings().setAllowUniversalAccessFromFileURLs(true);
// 允许调试
if(Build.VERSION.SDK_INT >= 19) {
webView1.setWebContentsDebuggingEnabled(true);
}
webView1.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("OverrideUrlLoading", url);
// 协议过滤
if(url.startsWith("http") && !url.startsWith("https://cdn-haokanapk.baidu.com/")){
view.loadUrl(url);
}
/*
else if(url.startsWith("tbopen://")){
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse(url);
intent.setData(uri);
intent.setClassName("com.taobao.taobao", "com.taobao.tao.detail.activity.DetailActivity");
startActivity(intent);
}
*/
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//super.onPageStarted(view, url, favicon);
editText1.setText(url);
urln = url;
btnBack.setEnabled(true);
IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0);
pgb1.setVisibility(View.VISIBLE);
imageButton_info.setImageResource(android.R.drawable.ic_menu_info_details);
// if(favicon != null) {
// imageButton_info.setImageBitmap(favicon);
// }
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pgb1.setVisibility(View.INVISIBLE);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Toast.makeText(getApplicationContext(), "ReceivedError:" + errorCode, Toast.LENGTH_SHORT).show();
if (isNetworkConnected()) {
switch(errorCode){
case WebViewClient.ERROR_HOST_LOOKUP: // 找不到主机跳转百度搜索
Log.e("ErrorHostLookup", failingUrl);
String url = "http://m.baidu.com/s?word=" + urlo;
editText1.setText(url);
webView1.loadUrl(url);
urln = url;
break;
case WebViewClient.ERROR_UNSUPPORTED_SCHEME:
Log.e("ErrorUnsupportedScheme",failingUrl);
}
} else {
webView1.loadDataWithBaseURL(
"",
"<html><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"/><style>h1{font-size:10vw;margin:40vh auto;text-align:center;}</style><h1>网络未连接</h1></html>",
"text/html", "utf-8", "");
}
}
});
webView1.setWebChromeClient(new WebChromeClient() {
// JS的alert('')提示信息转换成安卓控件提示信息
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
// HTML5.input.file转换为安卓文件选择器
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
openFileChooserImplForAndroid5(uploadMsg);
return true;
}
// 进度条
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
pgb1.setProgress(newProgress);
if(sharedPreferences.getBoolean("switch_adBlock",true)){
ADBlock();
}
if(sharedPreferences.getBoolean("switch_iframeBlock",false)) {
if (!view.getUrl().contains("baidu.com")){
iframeBlock();
}
}
// 链接关键字屏蔽
if(sharedPreferences.getBoolean("switch_filter",false)){
String sf = sharedPreferences.getString("filter","");
if(!sf.equals("")) {
String js = "javascript:var s='"+sf+"';var sl=s.split(';');var a=document.getElementsByTagName('a');for(var i=0;i<a.length;i++){for(var j=0;j<sl.length;j++){if(a[i].textContent.indexOf(sl[j])!=-1){a[i].textContent='';}}}";
view.loadUrl(js);
}
}
// 链接关键字高亮
if(sharedPreferences.getBoolean("switch_highlight",false)){
String shl = sharedPreferences.getString("highlight","");
if(!shl.equals("")) {
String js = "javascript:var s='"+shl+"';var sl=s.split(';');var a=document.getElementsByTagName('a');for(var i=0;i<a.length;i++){for(var j=0;j<sl.length;j++){if(a[i].textContent.indexOf(sl[j])!=-1){a[i].style.color='white';a[i].style.backgroundColor='#DA3434';}}}";
view.loadUrl(js);
}
}
}
// 获取网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
ptitle = title;
}
// 接收网站图标(favicon)
public void onReceivedIcon(WebView view, Bitmap icon) {
imageButton_info.setImageBitmap(icon);
}
// 播放网络视频时全屏会被调用的方法
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
Log.e("onShowCustomView", "onShowCustomView");
//Toast.makeText(getApplicationContext(), "onShowCustomView", Toast.LENGTH_SHORT).show();
customViewCallback = callback;
// 将video放到当前视图中
video.addView(view);
// 设置全屏
setFullScreen();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
// 视频播放退出全屏会被调用的
@Override
public void onHideCustomView() {
Log.e("onHideCustomView", "onHideCustomView");
//Toast.makeText(getApplicationContext(), "onHideCustomView", Toast.LENGTH_SHORT).show();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 退出全屏
// quitFullScreen();
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.d("onConsoleMessage", consoleMessage.message() + " at " + consoleMessage.sourceId() + ":" + consoleMessage.lineNumber());
return super.onConsoleMessage(consoleMessage);
}
// 定位权限
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
});
webView1.setDownloadListener(new MyWebViewDownLoadListener());
webView1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
webView1.requestFocus();
IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0);
return false;
}
});
newWindow();
editText1.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
@ -393,7 +190,7 @@ public class MainActivity extends Activity {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
webView1.findAllAsync(findText.getText().toString());
list_webView.get(currentPage).findAllAsync(findText.getText().toString());
IMM.hideSoftInputFromWindow(findText.getWindowToken(), 0);
return true;
}
@ -408,7 +205,7 @@ public class MainActivity extends Activity {
// start 输入框中改变后的字符串的起始位置
// before 输入框中改变前的字符串的位置 默认为0
// count 输入框中改变后的一共输入字符串的数量
webView1.findAllAsync(text.toString());
list_webView.get(currentPage).findAllAsync(text.toString());
}
@Override
@ -433,13 +230,6 @@ public class MainActivity extends Activity {
loadPage(sharedPreferences.getString("homepage","http://www.baidu.com"));
}
webView1.setFindListener(new FindListener() {
@Override
public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
boolean isDoneCounting) {
findCount.setText(activeMatchOrdinal + "/" + numberOfMatches);
}
});
CU = new Thread() {
@ -512,20 +302,51 @@ public class MainActivity extends Activity {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_title:
button_title.setVisibility(View.GONE);
editText1.setVisibility(View.VISIBLE);
break;
case R.id.button_page:
List<String> list_title = new ArrayList<>();
for (int i = 0 ; i < list_webView.size() ; i++) {
list_title.add(i + 1 + "." + list_webView.get(i).getTitle());
}
String[] titles = list_title.toArray(new String[list_title.size()]);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("窗口");
builder.setIcon(android.R.drawable.ic_menu_slideshow);
builder.setItems(titles, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
if(which != currentPage) {
webViewLayout.removeAllViews();
WebView webView = list_webView.get(which);
webViewLayout.addView(webView);
button_page.setText(which + 1 + "");
button_title.setText(webView.getTitle());
editText1.setText(webView.getUrl());
imageButton_info.setImageBitmap(webView.getFavicon());
currentPage = which;
}
}
});
builder.create().show();
break;
case R.id.ImageButtonGo:
loadPage(editText1.getText().toString());
break;
case R.id.ImageButtonBack:
if (webView1.canGoBack()) {
webView1.goBack();
if (list_webView.get(currentPage).canGoBack()) {
list_webView.get(currentPage).goBack();
btnForward.setEnabled(true);
} else {
btnBack.setEnabled(false);
}
break;
case R.id.ImageButtonForward:
if (webView1.canGoForward()) {
webView1.goForward();
if (list_webView.get(currentPage).canGoForward()) {
list_webView.get(currentPage).goForward();
btnBack.setEnabled(true);
} else {
btnForward.setEnabled(false);
@ -539,10 +360,10 @@ public class MainActivity extends Activity {
imageView1.setVisibility(View.GONE);
break;
case R.id.findPrev:
webView1.findNext(false);
list_webView.get(currentPage).findNext(false);
break;
case R.id.findNext:
webView1.findNext(true);
list_webView.get(currentPage).findNext(true);
break;
case R.id.findClose:
findText.setText("");
@ -589,7 +410,7 @@ public class MainActivity extends Activity {
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 0:
webView1.loadUrl(HTRE);
list_webView.get(currentPage).loadUrl(HTRE);
break;
case 1:
ClipboardManager mClipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
@ -614,8 +435,8 @@ public class MainActivity extends Activity {
break;
case 5:
String js = "javascript:var imgs=document.getElementsByTagName('img');for(i=0;i<imgs.length;i++){if(imgs[i].src=='" + HTRE +"'){imgs[i].style.display='none';break;}}";
webView1.loadUrl(js);
break;
list_webView.get(currentPage).loadUrl(js);
break;
}
return true;
}
@ -627,8 +448,8 @@ public class MainActivity extends Activity {
imageView1.setVisibility(View.GONE);
quitFullScreen();
} else {
if (webView1.canGoBack()) {
webView1.goBack();
if (list_webView.get(currentPage).canGoBack()) {
list_webView.get(currentPage).goBack();
} else {
// moveTaskToBack(false);
// MenuDialog();
@ -637,20 +458,18 @@ public class MainActivity extends Activity {
return true;
}
if (keyCode == KeyEvent.KEYCODE_ENTER) {
webView1.findAllAsync(findText.getText().toString());
list_webView.get(currentPage).findAllAsync(findText.getText().toString());
IMM.hideSoftInputFromWindow(findText.getWindowToken(), 0);
return true;
}
if (keyCode == KeyEvent.KEYCODE_F) {
findbar.setVisibility(View.VISIBLE);
findText.requestFocus();
webView1.findAllAsync(findText.getText().toString());
list_webView.get(currentPage).findAllAsync(findText.getText().toString());
return true;
}
if (keyCode == KeyEvent.KEYCODE_ESCAPE) {
findbar.setVisibility(View.GONE);
// Toast.makeText(getApplicationContext(), "Esc Pressed",
// Toast.LENGTH_SHORT).show();
return true;
}
return super.onKeyDown(keyCode, event);
@ -665,7 +484,7 @@ public class MainActivity extends Activity {
Log.e("webview", url);
IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0);
findText.setText("");
webView1.loadUrl(url);
list_webView.get(currentPage).loadUrl(url);
// btnBack.setEnabled(true);
}
@ -691,7 +510,7 @@ public class MainActivity extends Activity {
}
if (requestCode == 0) {
if (intent != null)
webView1.loadUrl(intent.getStringExtra("url"));
list_webView.get(currentPage).loadUrl(intent.getStringExtra("url"));
}
}
@ -779,16 +598,16 @@ public class MainActivity extends Activity {
void pauseVideo() {
String js = "javascript:var obj = document.getElementsByTagName('video');for (var i = 0; i < obj.length; i++) { obj[i].pause();}";
webView1.loadUrl(js);
list_webView.get(currentPage).loadUrl(js);
}
void playVideo() {
String js = "javascript:var obj = document.getElementsByTagName('video');for (var i = 0; i < obj.length; i++) { obj[i].play();}";
webView1.loadUrl(js);
list_webView.get(currentPage).loadUrl(js);
}
void MenuDialog() {
String[] items = { "收藏当前页", "收藏夹", "查找", "分享", "视频独立播放", "查看源码", "主页", "全屏", "广告过滤规则", "设置", "检查更新", "关于", "退出" };
String[] items = { "新建窗口", "关闭当前窗口", "收藏当前页", "收藏夹", "查找", "分享", "视频独立播放", "查看源码", "主页", "全屏", "广告过滤规则", "设置", "检查更新", "关于", "退出" };
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("菜单");
builder.setIcon(R.drawable.ic_launcher);
@ -798,6 +617,24 @@ public class MainActivity extends Activity {
dialog.dismiss();
switch (which) {
case 0:
newWindow();
break;
case 1:
list_webView.remove(currentPage);
if(list_webView.size() == 0){
newWindow();
}else{
currentPage--;
button_page.setText(currentPage + 1 + "");
webViewLayout.removeAllViews();
WebView webView = list_webView.get(currentPage);
webViewLayout.addView(webView);
button_title.setText(webView.getTitle());
editText1.setText(webView.getUrl());
imageButton_info.setImageBitmap(webView.getFavicon());
}
break;
case 2:
LinearLayout layout = new LinearLayout(MainActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText ET_title = new EditText(MainActivity.this);
@ -809,7 +646,8 @@ public class MainActivity extends Activity {
ET_url.setText(urln);
layout.addView(ET_url);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
Bitmap icon = webView1.getFavicon();
Bitmap icon = list_webView.get(currentPage).getFavicon();
if(icon == null) icon = BitmapFactory.decodeResource(getResources(), R.drawable.network);
Matrix matrix = new Matrix();
matrix.postScale((float)100/icon.getWidth(), (float)100/icon.getHeight());
Bitmap bitmap = Bitmap.createBitmap(icon, 0, 0, icon.getWidth(), icon.getHeight(), matrix, true);
@ -884,53 +722,53 @@ public class MainActivity extends Activity {
});
builder.create().show();
break;
case 1:
case 3:
Intent intent = new Intent(MainActivity.this, FavoriteActivity.class);
startActivityForResult(intent, 0);
break;
case 2:
case 4:
findbar.setVisibility(View.VISIBLE);
findText.requestFocus();
webView1.findAllAsync(findText.getText().toString());
list_webView.get(currentPage).findAllAsync(findText.getText().toString());
break;
case 3:
case 5:
intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, webView1.getUrl());
intent.putExtra(Intent.EXTRA_TEXT, list_webView.get(currentPage).getUrl());
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, "分享"));
break;
case 4:
String js = "javascript:var videos=document.getElementsByTagName('video'); if(videos.length!=0){ var url=videos[0].src; document.body.innerHTML=''; var video=document.createElement('video'); video.style.width='100%'; video.style.height='auto'; video.src=url; video.controls=true; document.body.appendChild(video); var a=document.createElement('a'); a.textContent=url; a.href=url; document.body.appendChild(a); } else { var iframes=document.getElementsByTagName('iframe'); if(iframes.length!=0) window.location.href=iframes[0].src; }";
webView1.loadUrl(js);
break;
case 5:
js = "javascript:var s='<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'; document.body.innerHTML=''; var pre=document.createElement('pre'); document.body.appendChild(pre); pre.textContent=s;";
webView1.loadUrl(js);
break;
case 6:
webView1.loadUrl(sharedPreferences.getString("homepage",""));
String js = "javascript:var videos=document.getElementsByTagName('video'); if(videos.length!=0){ var url=videos[0].src; document.body.innerHTML=''; var video=document.createElement('video'); video.style.width='100%'; video.style.height='auto'; video.src=url; video.controls=true; document.body.appendChild(video); var a=document.createElement('a'); a.textContent=url; a.href=url; document.body.appendChild(a); } 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:
js = "javascript:var s='<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>'; document.body.innerHTML=''; var pre=document.createElement('pre'); document.body.appendChild(pre); pre.textContent=s;";
list_webView.get(currentPage).loadUrl(js);
break;
case 8:
list_webView.get(currentPage).loadUrl(sharedPreferences.getString("homepage",""));
break;
case 9:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
LinearLayout2.setVisibility(View.GONE);
pgb1.setVisibility(View.GONE);
isFullScreen = true;
break;
case 8:
case 10:
DialogBlockList();
break;
case 9:
case 11:
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
break;
case 10:
case 12:
isManualCheckUpdate = true;
new Thread(CU).start();
break;
case 11:
webView1.loadUrl("file:///android_asset/about.htm");
case 13:
list_webView.get(currentPage).loadUrl("file:///android_asset/about.htm");
break;
case 12:
case 14:
MainActivity.this.finish();
break;
}
@ -1090,6 +928,7 @@ public class MainActivity extends Activity {
ostream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return "";
} catch (IOException e) {
e.printStackTrace();
}
@ -1104,13 +943,13 @@ public class MainActivity extends Activity {
rules = rules.substring(0, rules.length() - 1);
}
String js = "javascript:var rules='" + rules + "';var rule=new Array();rule=rules.split(',');var img=document.getElementsByTagName('img');for(i=0;i<img.length;i++){for(j=0;j<rule.length;j++){if(img[i].src.indexOf(rule[j])!=-1){img[i].style.display='none';}}}";
webView1.loadUrl(js);
list_webView.get(currentPage).loadUrl(js);
}
}
void iframeBlock(){
String js = "javascript:var iframes=document.getElementsByTagName('iframe');for(i=0;i<iframes.length;i++){iframes[i].style.display='none';}document.getElementById('win-pop-foot').style.display='none';document.getElementById('win-pop-foot1').style.display='none';";
webView1.loadUrl(js);
list_webView.get(currentPage).loadUrl(js);
}
// 调用系统下载https://www.jianshu.com/p/6e38e1ef203a
@ -1124,7 +963,7 @@ public class MainActivity extends Activity {
// 设置通知栏的标题如果不设置默认使用文件名
// request.setTitle("This is title");
// 设置通知栏的描述
request.setDescription(surl);
request.setDescription(surl);
// 允许在计费流量下下载
request.setAllowedOverMetered(false);
// 允许该记录在下载管理界面可见
@ -1163,8 +1002,8 @@ public class MainActivity extends Activity {
Log.e("Version", versionS + " > " + versionL + " ?");
String[] AVersionS = versionS.split("\\.");
String[] AVersionL = versionL.split("\\.");
//Log.e("Version: ", AVersionS[0] + " > " + AVersionL[0] + " ? " + AVersionS[1] + " > " + AVersionL[1] + " ?");
if ((Integer.parseInt(AVersionS[0]) > Integer.parseInt(AVersionL[0])) || (Integer.parseInt(AVersionS[1]) > Integer.parseInt(AVersionL[1]))) {
Log.e("Version", "(" + AVersionS[0] + " > " + AVersionL[0] + ") && (" + AVersionS[1] + " > " + AVersionL[1] + ")");
if ((Integer.parseInt(AVersionS[0]) > Integer.parseInt(AVersionL[0])) || (Integer.parseInt(AVersionS[0]) == Integer.parseInt(AVersionL[0]) && Integer.parseInt(AVersionS[1]) > Integer.parseInt(AVersionL[1]))) {
Looper.prepare();
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
@ -1221,4 +1060,240 @@ public class MainActivity extends Activity {
}
}
void newWindow(){
WebView webView = new WebView(MainActivity.this);
setWebView(webView);
webView.loadUrl(sharedPreferences.getString("homepage","http://www.baidu.com"));
webViewLayout.removeAllViews();
webViewLayout.addView(webView);
list_webView.add(webView);
currentPage = list_webView.size() - 1;
button_page.setText(currentPage + 1 + "");
list_webView.get(currentPage).setFindListener(new FindListener() {
@Override
public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting) {
findCount.setText(activeMatchOrdinal + "/" + numberOfMatches);
}
});
}
void setWebView(final WebView webView){
// 支持获取手势焦点
webView.requestFocusFromTouch();
// 允许调试
if(Build.VERSION.SDK_INT >= 19) {
webView.setWebContentsDebuggingEnabled(true);
}
WebSettings webSettings = webView.getSettings();
// 开启JS
webSettings.setJavaScriptEnabled(true);
// 开启JS能打开窗口
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 开启缓存
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
// 自适应屏幕
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
// 支持缩放
webSettings.setSupportZoom(true);
// 启用内置缩放控件
webSettings.setBuiltInZoomControls(true);
// 隐藏缩放控件
webSettings.setDisplayZoomControls(false);
// 开启访问文件
webSettings.setAllowFileAccess(true);
// 开启数据库
webSettings.setDatabaseEnabled(true);
// 开启localStorage
webSettings.setDomStorageEnabled(true);
// 开启定位
webSettings.setGeolocationEnabled(true);
// 支持多窗口
webSettings.supportMultipleWindows();
// 允许跨域
webSettings.setAllowUniversalAccessFromFileURLs(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("OverrideUrlLoading", url);
// 协议过滤
if(url.startsWith("http") && !url.startsWith("https://cdn-haokanapk.baidu.com/")){
view.loadUrl(url);
}
/*
else if(url.startsWith("tbopen://")){
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse(url);
intent.setData(uri);
intent.setClassName("com.taobao.taobao", "com.taobao.tao.detail.activity.DetailActivity");
startActivity(intent);
}
*/
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//super.onPageStarted(view, url, favicon);
button_title.setText(url);
button_title.setVisibility(View.VISIBLE);
editText1.setText(url);
editText1.setVisibility(View.GONE);
urln = url;
btnBack.setEnabled(true);
IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0);
pgb1.setVisibility(View.VISIBLE);
imageButton_info.setImageResource(android.R.drawable.ic_menu_info_details);
// if(favicon != null) {
// imageButton_info.setImageBitmap(favicon);
// }
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pgb1.setVisibility(View.INVISIBLE);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Toast.makeText(getApplicationContext(), "ReceivedError:" + errorCode, Toast.LENGTH_SHORT).show();
if (isNetworkConnected()) {
switch(errorCode){
case WebViewClient.ERROR_HOST_LOOKUP: // 找不到主机跳转百度搜索
Log.e("ErrorHostLookup", failingUrl);
String url = "http://m.baidu.com/s?word=" + urlo;
editText1.setText(url);
webView.loadUrl(url);
urln = url;
break;
case WebViewClient.ERROR_UNSUPPORTED_SCHEME:
Log.e("ErrorUnsupportedScheme",failingUrl);
}
} else {
webView.loadDataWithBaseURL(
"",
"<html><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"/><style>h1{font-size:10vw;margin:40vh auto;text-align:center;}</style><h1>网络未连接</h1></html>",
"text/html", "utf-8", "");
}
}
});
webView.setWebChromeClient(new WebChromeClient() {
// JS的alert('')提示信息转换成安卓控件提示信息
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
result.confirm();
return true;
}
// HTML5.input.file转换为安卓文件选择器
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
openFileChooserImplForAndroid5(uploadMsg);
return true;
}
// 进度条
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
pgb1.setProgress(newProgress);
if(sharedPreferences.getBoolean("switch_adBlock",true)){
ADBlock();
}
if(sharedPreferences.getBoolean("switch_iframeBlock",false)) {
if (!view.getUrl().contains("baidu.com")){
iframeBlock();
}
}
// 链接关键字屏蔽
if(sharedPreferences.getBoolean("switch_filter",false)){
String sf = sharedPreferences.getString("filter","");
if(!sf.equals("")) {
String js = "javascript:var s='"+sf+"';var sl=s.split(';');var a=document.getElementsByTagName('a');for(var i=0;i<a.length;i++){for(var j=0;j<sl.length;j++){if(a[i].textContent.indexOf(sl[j])!=-1){a[i].textContent='';}}}";
view.loadUrl(js);
}
}
// 链接关键字高亮
if(sharedPreferences.getBoolean("switch_highlight",false)){
String shl = sharedPreferences.getString("highlight","");
if(!shl.equals("")) {
String js = "javascript:var s='"+shl+"';var sl=s.split(';');var a=document.getElementsByTagName('a');for(var i=0;i<a.length;i++){for(var j=0;j<sl.length;j++){if(a[i].textContent.indexOf(sl[j])!=-1){a[i].style.color='white';a[i].style.backgroundColor='#DA3434';}}}";
view.loadUrl(js);
}
}
}
// 获取网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
button_title.setText(title);
ptitle = title;
}
// 接收网站图标(favicon)
public void onReceivedIcon(WebView view, Bitmap icon) {
imageButton_info.setImageBitmap(icon);
}
// 播放网络视频时全屏会被调用的方法
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
Log.e("onShowCustomView", "onShowCustomView");
//Toast.makeText(getApplicationContext(), "onShowCustomView", Toast.LENGTH_SHORT).show();
customViewCallback = callback;
// 将video放到当前视图中
video.addView(view);
// 设置全屏
setFullScreen();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
// 视频播放退出全屏会被调用的
@Override
public void onHideCustomView() {
Log.e("onHideCustomView", "onHideCustomView");
//Toast.makeText(getApplicationContext(), "onHideCustomView", Toast.LENGTH_SHORT).show();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 退出全屏
// quitFullScreen();
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.d("onConsoleMessage", consoleMessage.message() + " at " + consoleMessage.sourceId() + ":" + consoleMessage.lineNumber());
return super.onConsoleMessage(consoleMessage);
}
// 定位权限
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
});
webView.setDownloadListener(new MyWebViewDownLoadListener());
webView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
button_title.setVisibility(View.VISIBLE);
editText1.setVisibility(View.GONE);
webView.requestFocus();
IMM.hideSoftInputFromWindow(editText1.getWindowToken(), 0);
return false;
}
});
}
}

View File

@ -42,6 +42,15 @@
android:background="@null"
android:src="@android:drawable/ic_media_ff"/>
<Button
android:id="@+id/button_page"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="2dp"
android:background="@drawable/border"
android:text="0"
android:textColor="#808080"/>
<ImageButton
android:id="@+id/imageButton_info"
android:layout_width="25dp"
@ -50,6 +59,15 @@
android:scaleType="fitCenter"
android:src="@android:drawable/ic_menu_info_details"/>
<Button
android:id="@+id/button_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#ffffff"
android:ellipsize="marquee"
android:singleLine="true"/>
<EditText
android:id="@+id/EditText1"
android:layout_width="fill_parent"
@ -79,7 +97,16 @@
</LinearLayout>
<RelativeLayout
<ProgressBar
android:id="@+id/progressBar1"
style="@android:style/Widget.Holo.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_alignTop="@+id/WebView1"
android:progressDrawable="@drawable/progressbar_color"/>
<FrameLayout
android:id="@+id/webViewLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@ -88,15 +115,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:id="@+id/progressBar1"
style="@android:style/Widget.Holo.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_alignTop="@+id/WebView1"
android:progressDrawable="@drawable/progressbar_color"/>
</RelativeLayout>
</FrameLayout>
</LinearLayout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 539 KiB

After

Width:  |  Height:  |  Size: 536 KiB

View File

@ -1 +1 @@
3.12
4.0