安卓和web混合开发,android和h5混合开发
现在很多的应用中会嵌套HTML5的页面,比如经常变化的等等,有一部分页面需要原生爪哇与HTML5中的射流研究…进行交互操作,下面介绍一下机器人中HTML5的使用:
1、关于HTML5种cookie
网页中可能会用到用户信息等很多参数,可以提前把这些信息放到甜饼干中,可以采用以下方法:
public static void add cookie(Context Context,WebView webView,String URL){ String URL=" https://www .xxxx。com/xx/xx/"字符串协议= ;字符串授权="";尝试{ URL URL obj=新URL(URL);协议=URL对象。get协议();权限=URL对象。getauthority();} catch(Exception e){ e . printstacktrace();} String ua=webView.getSettings().getUserAgentString();webView.getSettings().setUserAgentString(常量PROJECT _ NAME“/”参数处理程序。“getversion(context)”(“ua”);HFWSH));如果(!TextUtils.isEmpty(url)!TextUtils.isEmpty(协议)!textutils。isempty(authority)){ if(协议。equals( https )权限。的索引。com )-1){ cookiesyncmanager。创建实例(上下文);CookieManager CookieManager=CookieManager。getinstance();厨师经理。setacceptcookie(true);请尝试{ ListString data=getcookiestring();如果(!列出实用程序。isempty(data)){ for(String value:data){ cookiemanager。设置cookie(URL,值);} } cookieManager.setCookie(url, client_id=常量 CLIENT _ ID ;path=/;域=。xxxx。com’);cookieManager.setCookie(url, appVersion=常量。版本;path=/;域=。xxxx。com’);CookieSyncManager.getInstance().sync();} catch(异常e){ logutils。e( Exception: e . getmessage());} } } } public ListString getcookiestring(){ ArrayList data=new ArrayList();这个。清除过期();集合值=这个。饼干。values();迭代器var 3=值。迭代器();而(var 3。has next()){ swift cookie c=(swift cookie)var 3。next();数据。添加(c . tocookiestring());}返回数据;}在mWebView.loadUrl(Url)之前添加饼干,网页就可以通过甜饼干取到相应的参数值了。
2、关于js的安全问题
射流研究…在4.2以前有漏洞
通过JavaScript,可以访问当前设备的南达科他州卡上面的任何东西,甚至是联系人信息,短信等。好,我们一起来看看是怎么出现这样的错误的。
1、网络视图添加了Java脚本语言对象,并且当前应用具有读写SDCard的权限,也就是:安卓。许可。写_外部_存储
2,JS中可以遍历窗户对象,找到存在" getClass "方法的对象的对象,然后再通过反射的机制,得到运行时间对象,然后调用静态方法来执行一些命令,比如访问文件的命令。
3,再从执行命令后返回的输入流中得到字符串,就可以得到文件名的信息了。然后想干什么就干什么,好危险。核心射流研究…代码如下:
函数execute(cmdArgs){ for(window中的var obj){ if(window[obj]中的getClass ){ alert(obj);返回窗口[对象]。getClass().for name(“Java . lang . runtime”).getMethod(getRuntime ,null).调用(null,null).exec(cmd args);} } }解决方案:
1,Android 4.2以上的系统
在安卓4.2以上的,谷歌作了修正,通过在爪哇的远程方法上面声明一个@JavascriptInterface,如下面代码:
?可扩展标记语言版本=1.0 编码=utf-8 ?线性布局xmlns:Android= http://模式。安卓。com/apk/RES/Android Android:layout _ width= match _ parent Android:layout _ height= match _ parent Android:orientation= vertical !-按钮演示爪哇调用we b-Button Android:id= @ id/Button Android:layout _ width= match _ parent Android:text= @ string/Button _ name Android:layout _ height= DP /!-网络视图演示网调用Java-com。github。lzyzd。jsbridge。桥webView Android:id= @ id/webView Android:layout _ width= match _ parent Android:layout _ height= match _ parent /com。github。lzyzd。jsbridge。桥webView/线性布局3、Java代码
//加载服务器网页网络视图。loadurl( https://www。百度一下。com’);//必须和射流研究…同名函数网络视图。register handler(从web提交,new bridge handler(){ @ Override public void handler(String data,CallBackFunction函数){ String str=html返回给爪哇岛的数据:数据;makeText(MainActivity.this,str,LENGTH_SHORT).show();Log.i(TAG, handler=submitFromWeb,data from web= data);function.onCallBack( str ,Java经过处理后: str.substring(,));} });//模拟用户获取本地位置User User=new User();Location Location=new Location();location . address= xxxuser . location=位置;user.name= Brucewebview。调用处理程序( function injs ,new Gson().toJson(user),new callback函数(){ @ Override public void onCallBack(String data){ make text(main activity。“这,”网页在获取你的信息,LENGTH_SHORT).show();} });网络视图。发送(你好);网络视图。调用处理程序( function injs , data from Java ,新的回调函数(){ @ Override public void onCallBack(String data){//TODO自动生成的方法存根Log.i(标签,来自js的响应数据数据);} });射流研究…调用
var str 1=文档。getelementbyid(“文本1”).价值;var str 2=文档。getelementbyid(“text 2”).价值;//调用本地爪哇岛方法窗户webview JavaScript桥。调用处理程序(从web提交,{param: str},函数(响应数据){ document。getelementbyid( show ).innerHTML=从Java发送获取响应数据,data= response data });//注册事件监听文档。addevent listener( webview JavaScript bridge ready ,function(){ callback(webview JavaScript bridge)},false);//注册回调函数,第一次连接时调用初始化函数connectwebview JavaScript bridge(函数(桥){ bridge。init(function(message,responseCallback){ console。log( JS get a message ,message);var data={ Javascript response : Wee!};console.log(JS responding with ,data);响应回调(数据);});大桥。注册处理程序( function injs ,function(data,responseCallback){ document。getelementbyid( show ).innerHTML=( data from Java:= data);var responseData=Javascript说右回又名!响应回调(响应数据);});}) 4、关于网络视图的优化
1、设置网络视图缓存模式
private void init webview(){ mwebview。获取设置().set JavaScript enabled(true);mWebView.getSettings().setRenderPriority(渲染优先级.高);mWebView.getSettings().setCacheMode(WebSettings .LOAD _ DEFAULT);//设置缓存模式//开启数字正射影像图存储应用程序接口功能mWebView.getSettings().setDomStorageEnabled(true);//开启数据库存储应用程序接口功能mWebView.getSettings().setdatabasenabled(true);String cacheDirPath=getFilesDir().getAbsolutePath()APP _ caca he _ DIRNAME;//String cacheDirPath=getCacheDir().getAbsolutePath()常量. APP _ DB _ DIRNAMELog.i(标记, cacheDirPath= cacheDirPath);//设置数据库缓存路径mWebView.getSettings().setDatabasePath(cacheDirPath);//设置应用程序缓存缓存目录mWebView.getSettings().setAppCachePath(cacheDirPath);//开启应用程序缓存功能mWebView.getSettings().setAppCacheEnabled(true);2、清除缓存
/** * 清除网络视图缓存*/public void clearWebViewCache(){//清理网络视图缓存数据库请尝试{删除数据库( webview。db’);删除数据库( webview缓存。db’);} catch(Exception e){ e . printstacktrace();} //WebView缓存文件文件appCacheDir=新文件(getFilesDir().getAbsolutePath()APP _ caca he _ DIRNAME);Log.e(标记, appCacheDir path= appCacheDir。getabsolutepath());文件webviewCacheDir=新文件(getCacheDir().getAbsolutePath()/webview cache );Log.e(标记, webviewCacheDir path= webviewCacheDir。getabsolutepath());//删除网络视图缓存目录if(webviewCacheDir。exists()){ delete file(webviewCacheDir);} //删除网络视图缓存缓存目录if(appCacheDir。exists()){删除文件(appCacheDir);} } 3、在使用网络视图加载网页的时候,有一些固定的资源文件如js/css/图片等资源会比较大,如果直接从网络加载会导致页面加载的比较慢,而且会消耗比较多的流量。所以这些文件应该放在资产里面同应用打包。
解决这个问题用到API 11(蜂巢)提供的shouldInterceptRequest(WebView视图,字符串网址)函数来加载本地资源。
API 21又将这个方法弃用了,是重载一个新的shouldInterceptRequest,需要的参数中将全球资源定位器(统一资源定位器)替换成了成了请求。
比如有一个图片
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。