android 编写简单浏览器带下载
16lz
2021-12-04
android 编写简单浏览器带下载 支持多触点 支持下载功能
转自:http://www.cmd59.com/html/2182.html
- packageorg.badboy.browser;
- importjava.io.ByteArrayOutputStream;
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.FileNotFoundException;
- importjava.io.FileOutputStream;
- importjava.io.InputStream;
- importjava.net.HttpURLConnection;
- importjava.net.MalformedURLException;
- importjava.net.URL;
- importjava.net.URLConnection;
- importorg.metalev.multitouch.controller.MultiTouchController;
- importorg.metalev.multitouch.controller.MultiTouchController.MultiTouchObjectCanvas;
- importorg.metalev.multitouch.controller.MultiTouchController.PointInfo;
- importorg.metalev.multitouch.controller.MultiTouchController.PositionAndScale;
- importandroid.app.Activity;
- importandroid.app.AlertDialog;
- importandroid.app.Dialog;
- importandroid.app.ProgressDialog;
- importandroid.app.SearchManager;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.res.Configuration;
- importandroid.net.Uri;
- importandroid.os.Bundle;
- importandroid.os.Environment;
- importandroid.util.Log;
- importandroid.view.KeyEvent;
- importandroid.view.Menu;
- importandroid.view.MenuItem;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.view.Window;
- importandroid.webkit.DownloadListener;
- importandroid.webkit.URLUtil;
- importandroid.webkit.WebChromeClient;
- importandroid.webkit.WebView;
- importandroid.webkit.WebViewClient;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.ProgressBar;
- importandroid.widget.Toast;
- /***
- *使用WebView对象创建一个简单网页浏览器。
- *@authorBadBoy
- *
- */
- publicclassBrowserActivityextendsActivityimplementsMultiTouchObjectCanvas<Object>{
- privatefinalstaticintMENU_NEW_WEB=Menu.FIRST;
- privatefinalstaticintMENU_SET_MAIN_PAGE=MENU_NEW_WEB+1;
- privateStringdefaultGoogleUrl="";
- privateStringdefaultUCWebUrl="";
- privateStringdefaultUrl="";
- privateWebViewmWebView;
- //储存默认网址文件
- privateStringfileUrl="fileUrl.txt";
- //对话框标识
- privatefinalstaticintPROGRESS_DIALOG=110;
- privatefinalstaticintSET_DEFAULT_URL_DIALOG=111;
- //显示网页加载进度
- privateProgressDialogmDialog;
- privateProgressBarbar;
- //多点触摸
- privateMultiTouchController<Object>mMultiTouchController;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //下面四条语句要在setContentView()方法之前调用,否则程序会出错,在本程序中,加入以下的语句貌似还没有什么影响,或者有我还没发现
- this.requestWindowFeature(Window.FEATURE_LEFT_ICON);
- this.requestWindowFeature(Window.FEATURE_RIGHT_ICON);
- this.requestWindowFeature(Window.FEATURE_PROGRESS);
- this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- setContentView(R.layout.main);
- initWebView();
- performSearchIntent(getIntent());
- }
- @Override
- protectedvoidonNewIntent(Intentintent){
- setIntent(intent);
- performSearchIntent(intent);
- }
- /**
- *执行搜索,打开网页
- */
- privatevoidperformSearchIntent(Intentintent){
- if(Intent.ACTION_SEARCH.equals(intent.getAction())){
- Stringquery=intent.getStringExtra(SearchManager.QUERY);
- //还没有对网址进行严格的解析
- if(!query.startsWith("http://")){
- mWebView.loadUrl("http://"+query);
- }
- if(query.startsWith("http://")){
- mWebView.loadUrl(query);
- }
- /*else{
- Toast.makeText(this,R.string.url_error,Toast.LENGTH_SHORT).show();
- }*/
- }
- }
- privatevoidinitWebView(){
- defaultGoogleUrl=this.getResources().getString(R.string.default_google_url);
- defaultUCWebUrl=this.getResources().getString(R.string.default_ucweb_url);
- setDefaultURL();
- bar=(ProgressBar)findViewById(R.id.progress_bar);
- mMultiTouchController=newMultiTouchController<Object>(this,false);
- mWebView=(WebView)findViewById(R.id.webview);
- //使用mWebView的getSettings()方法设置支持JavaScript为true
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.setScrollBarStyle(0);
- //用loadUrl方法加载网址
- mWebView.loadUrl(defaultUrl);
- //对mWebView设置WebViewClient对象,如果不设置此对象那么当单击mWebView中的链接时将由系统
- //默认的Browser来响应链接,即由默认的Browser打开链接,而不是你自己写的Browser来打开
- //故为了mWebView自己处理页面中的所有链接,则要扩展WebViewClient类,重载shouldOverrideUrlLoading()方法
- mWebView.setWebViewClient(newMyWebViewClient());
- //
- mWebView.setWebChromeClient(newMyWebChromeClient());
- //实现下载监听
- mWebView.setDownloadListener(newDownloadListener(){
- publicvoidonDownloadStart(Stringurl,StringuserAgent,StringcontentDisposition,
- Stringmimetype,longcontentLength){
- /*Uriuri=Uri.parse(url);
- Intentintent=newIntent(Intent.ACTION_VIEW,uri);
- startActivity(intent);
- */
- downloadFile(url,mimetype,mimetype,mimetype,contentLength);
- }
- });
- }
- /*
- *下列代码实现网络文件下载功能,目前下载的文件时存储在/data/data/org.badboy.browser/files目录下的。
- *后续还会更新这个方法,将其下载到SDCard上来。思路是这样子的:下载文件时先检查是否由sdcard或udisk外存储设备,
- *若有则直接下载到外存储设备,否则存储到/data/data/org.badboy.browser/files目录中。最后还要增加一个功能:就是
- *列出已下载文件,以及对文件copy,delete等操作
- *2011-3-4
- */
- privatevoiddownloadFile(Stringurl,StringuserAgent,StringcontentDisposition,
- Stringmimetype,longcontentLength){
- /*Stringfilename=URLUtil.guessFileName(url,
- contentDisposition,mimetype);
- //ChecktoseeifwehaveanSDCard
- Stringstatus=Environment.getExternalStorageState();
- if(!status.equals(Environment.MEDIA_MOUNTED)){
- inttitle;
- Stringmsg;
- //ChecktoseeiftheSDCardisbusy,sameasthemusicapp
- if(status.equals(Environment.MEDIA_SHARED)){
- msg=getString(R.string.download_sdcard_busy_dlg_msg);
- title=R.string.download_sdcard_busy_dlg_title;
- }else{
- msg=getString(R.string.download_no_sdcard_dlg_msg,filename);
- title=R.string.download_no_sdcard_dlg_title;
- }
- newAlertDialog.Builder(this)
- .setTitle(title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(msg)
- .setPositiveButton(R.string.ok,null)
- .show();
- return;
- }*/
- try{
- Stringfilename=URLUtil.guessFileName(url,
- contentDisposition,mimetype);
- URLurl2=newURL(url);
- HttpURLConnectionconn=(HttpURLConnection)url2.openConnection();
- conn.setDoInput(true);
- conn.connect();
- if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){
- InputStreamis=conn.getInputStream();
- FileOutputStreamfos=this.openFileOutput(filename,Context.MODE_APPEND);
- intlen=0;
- byte[]buf=newbyte[1024];
- while((len=is.read(buf))!=-1){
- fos.write(buf,0,len);
- }
- is.close();
- fos.close();
- }else{
- Toast.makeText(this,R.string.net_error,Toast.LENGTH_SHORT).show();
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- privatevoidsetDefaultURL(){
- try{
- //android中使用openFileInput()方法得到文件输入流
- FileInputStreamfis=this.openFileInput(fileUrl);
- ByteArrayOutputStreambaos=newByteArrayOutputStream();
- byte[]buffer=newbyte[1024];
- intlen=0;
- while((len=fis.read(buffer))!=-1){
- baos.write(buffer,0,len);
- }
- //defaultUrl=newString(buffer,0,len);
- defaultUrl=baos.toString();
- fis.close();
- baos.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- //如果还是为空,则使用defaultUCWebUrl
- if(defaultUrl.equals("")){
- defaultUrl=defaultUCWebUrl;
- }
- }
- /**
- *按键事件处理
- */
- @Override
- publicbooleanonKeyDown(intkeyCode,KeyEventevent){
- //按返回键可退回之前浏览过的网页
- if((keyCode==KeyEvent.KEYCODE_BACK)&&mWebView.canGoBack()){
- mWebView.goBack();
- returntrue;
- }
- //搜索按键
- if(keyCode==KeyEvent.KEYCODE_SEARCH){
- onSearchRequested();
- }
- returnsuper.onKeyDown(keyCode,event);
- }
- /**
- *重写WebChromeClient类
- */
- privateclassMyWebChromeClientextendsWebChromeClient{
- //设置网页加载进度条
- @Override
- publicvoidonProgressChanged(WebViewwebview,intnewProgress){
- BrowserActivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS,100);
- //以下注释代码是用来ProgressDialog显示网页加载进度的
- /*showDialog(PROGRESS_DIALOG);
- mDialog.setProgress(newProgress);
- if(newProgress==100){
- dismissDialog(PROGRESS_DIALOG);
- }*/
- //以下代码是用来ProgressBar显示网页加载进度的
- bar.setProgress(newProgress);
- bar.setVisibility(View.VISIBLE);
- if(bar.getProgress()==100){
- bar.setVisibility(View.GONE);
- }
- super.onProgressChanged(webview,newProgress);
- }
- }
- /**
- *重写WebViewClient类,由本Browser处理网页中的链接
- */
- privateclassMyWebViewClientextendsWebViewClient{
- @Override
- publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
- view.loadUrl(url);
- returntrue;
- }
- }
- /**
- *Menu按键的添加和事件处理
- */
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- //打开网址输入栏
- menu.add(0,MENU_NEW_WEB,0,R.string.new_web_page)
- .setIcon(R.drawable.search_icon);
- //设置默认网址
- menu.add(0,MENU_SET_MAIN_PAGE,0,R.string.set_default_url)
- .setIcon(R.drawable.browser_icon);
- returnsuper.onCreateOptionsMenu(menu);
- }
- @Override
- publicbooleanonMenuItemSelected(intfeatureId,MenuItemitem){
- switch(item.getItemId()){
- caseMENU_NEW_WEB:
- onSearchRequested();
- returntrue;
- caseMENU_SET_MAIN_PAGE:
- this.showDialog(SET_DEFAULT_URL_DIALOG);
- break;
- }
- returnsuper.onMenuItemSelected(featureId,item);
- }
- /**
- *重写onSearchRequested(),可实现调用SearchBar
- */
- @Override
- publicbooleanonSearchRequested(){
- //本程序还没处理Bundle对象传来的数据,注释下列三行代码
- /*BundleappData=newBundle();
- appData.putBoolean("search",true);
- this.startSearch(null,false,appData,false);*/
- this.startSearch(null,false,null,false);
- returntrue;
- }
- /**
- *当要调用this.showDialog(intid)方法来显示Dialog时,要重写下列方法
- */
- @Override
- protectedDialogonCreateDialog(intid){
- switch(id){
- casePROGRESS_DIALOG:
- mDialog=newProgressDialog(this);
- //mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mDialog.setMessage("Pageisloading...");
- returnmDialog;
- caseSET_DEFAULT_URL_DIALOG:
- returncreateDefaultUrlDialog();
- default:
- returnsuper.onCreateDialog(id);
- }
- }
- privateDialogcreateDefaultUrlDialog(){
- finalDialogdialog=newDialog(this);
- dialog.setContentView(R.layout.default_url_dialog);
- dialog.setTitle(R.string.dialog_title);
- finalEditTexturl=(EditText)dialog.findViewById(R.id.url);
- ButtonbtnOK=(Button)dialog.findViewById(R.id.ok_btn);
- btnOK.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewarg0){
- defaultUrl=url.getText().toString();
- try{
- FileOutputStreamfos=BrowserActivity.this.openFileOutput(fileUrl,Context.MODE_PRIVATE);
- byte[]buffer=defaultUrl.getBytes();
- fos.write(buffer);
- fos.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- dialog.dismiss();
- mWebView.loadUrl(defaultUrl);
- }
- });
- ButtonbtnCancel=(Button)dialog.findViewById(R.id.cancel_btn);
- btnCancel.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewarg0){
- dialog.dismiss();
- }
- });
- returndialog;
- }
- /**
- *屏幕旋转时,程序会重新调用onCreate()方法,即重新加载程序。当不需要这么做时,
- *可在manifest文件中的Activity标签中加入android:configChanges="orientation|keyboardHidden"
- *属性,并且重写下列方法。该方法中可以处理屏幕旋转时发生的动作
- */
- @Override
- publicvoidonConfigurationChanged(ConfigurationnewConfig){
- /*if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
- }elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
- }*/
- super.onConfigurationChanged(newConfig);
- }
- //-------------multitouchstuff------------------------------------
- privateintmCurrentZoom=0;
- privatestaticfinaldoubleZOOM_SENSITIVITY=1.6;
- privatestaticfinalfloatZOOM_LOG_BASE_INV=1.0f/(float)Math.log(2.0/ZOOM_SENSITIVITY);
- privatebooleanisMultiTouchScale=false;
- @Override
- publicbooleandispatchTouchEvent(MotionEventevent){
- if(mMultiTouchController.onTouchEvent(event)){
- if(!isMultiTouchScale){
- event.setAction(MotionEvent.ACTION_CANCEL);
- super.dispatchTouchEvent(event);
- }
- }else{
- isMultiTouchScale=true;
- if(super.dispatchTouchEvent(event)){
- returntrue;
- }
- returnfalse;
- }
- returntrue;
- }
- publicObjectgetDraggableObjectAtPoint(PointInfotouchPoint){
- returnnewObject();
- }
- publicvoidgetPositionAndScale(Objectobj,
- PositionAndScaleobjPosAndScaleOut){
- objPosAndScaleOut.set(0.0f,0.0f,true,1.0f,false,0.0f,0.0f,false,0.0f);
- mCurrentZoom=0;
- }
- publicvoidselectObject(Objectobj,PointInfotouchPoint){
- }
- publicbooleansetPositionAndScale(Objectobj,
- PositionAndScalenewObjPosAndScale,PointInfotouchPoint){
- floatnewRelativeScale=newObjPosAndScale.getScale();
- inttargetZoom=(int)Math.round(Math.log(newRelativeScale)
- *ZOOM_LOG_BASE_INV);
- while(mCurrentZoom>targetZoom){
- mCurrentZoom--;
- mWebView.zoomOut();
- }
- while(mCurrentZoom<targetZoom){
- mCurrentZoom++;
- mWebView.zoomIn();
- }
- returntrue;
- }
- }
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- python list.sort()根据多个关键字排序的方法实现
- 收集整理的Android(安卓)color.xml文件的颜色配置
- Android(安卓)- Manifest 文件 详解
- Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜
- Android(安卓)onSaveInstanceState和onRestoreInstanceState触发