Android中使用js对webview的password控件赋值的问题
在cnblogs的android客户端开中使用webview模拟登录,这样就需要将用户输入的用户名和密码传到webview上然后提交,这个过程在mx3的flyme3和flyme4上测试一切正常,然而在我的htcG12上(用的miui4),和三星note2上都报错。
报错的代码为:
代码如下 | 复制代码 |
public void LoginByPassword(String username, String password){ mCurrentRT = EnumRequestType.LoginFinish; final String strJS = String.format("javascript:document.getElementById('tbUserName').value='%s';document.getElementById('tbPassword').value='%s';document.getElementById('form1').submit();", username, password); mWeb.post(new Runnable() { public void run() { mWeb.loadUrl(strJS); } }); } |
mWeb.loadUrl(strJS);时报错了,报错的内容为“android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application”。
解决办法,是对mWeb的settings进行设置不保存密码“settings.setSavePassword(false);”代码如下:
代码如下 | 复制代码 |
@SuppressLint({ "SetJavaScriptEnabled"}) private void initialWeb(){ WebSettings settings = mWeb.getSettings(); settings.setSavePassword(false); settings.setSaveFormData(false); settings.setJavaScriptEnabled(true); settings.setBlockNetworkImage(true); mWeb.addJavascriptInterface(new JSInterface(), "IFObj"); mWeb.setWebViewClient(mBlogWebClient); } |
就此,原因找到了,不过“Unable to add window -- token null is not for an application”的错误,并不都是这个导致的。
智能手机时代使Android迅速成为移动端的主流系统,Android开发遍地开花。安卓的网络编程分为2种,一种是基于socket的,另外一种是基于http协议。下面我们分别来分析。基于socket的用法
服务器端:
先启动一个服务器端的socket
ServerSocket svr = new ServerSocket(8989);
开始侦听请求
Socket s = svr.accept();
取得输入和输出
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
Socket 的交互通过流来完成,即是说传送的字节流,因此任何文件都可以在上面传送。谁打开的记得要关上。
用DataInputStream/DataOutputStream来进行包装是因为我们想要他们对基本数据类型的读写功能readInt(),writeInt(),readUTF(),writeUTF()等等。
客户端:
发起一个socket连接
Socket s = new Socket("192.168.1.200",8989);
取得输入和输出
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
之后就可以相互通信了。谁打开的记得要关上。
基于Http协议
一般是发送请求到某个应用服务器。此时需要用到HttpURLConnection
先取得HttpURLConnection
urlConn = new URL("http://www.google.com").openConnection();
设置标志
urlConn.setDoOutput(true); urlConn.setDoInput(true);
//post的情况下需要设置DoOutput为true
urlConn.setRequestMethod("POST");
urlConn.setUseCache(false);//设置是否用缓存
//设置content-type
urlConn.setRequestProperty("Content-type","application/x-www-form-urlencoded");
获得输出流,便于想服务器发送信息。
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
望流里面写请求参数
dos.writeBytes("name="+URLEncoder.encode("chenmouren","gb2312");
dos.flush();dos.close();//发送完后马上关闭。
获得输入流,取数据
BufferReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
reader.readLine();//用 !=null来判断是否结束
reader.close();
读完了记得关闭connection urlConn.disconnect();
一、下载相应的文件
1.android-sdk-windows
下载地址:http://developer.android.com/sdk/index.html
2.Eclipse IDE for Java EE Developers
下载地址:http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/heliossr1
二、安装
1.将android-sdk-windows解压到E:Program Filesandroid-sdk-windows。
2.将Eclipse IDE for Java EE Developers解压到E:Program FilesEclipse。
3.配置Eclipse
打开Eclipse,Help->Install New Software->Add
Name=Android Development Tools (ADT)
Location=http://dl-ssl.google.com/android/eclipse/
当安装完ADT插件后,在Eclipse的window菜单下会多出一个Android SDK And AVD Manager菜单项,在这个里你可以管理你的“虚拟设备”和“SDK包”。
请使用 UTF-8 格式来查看代码,避免出现中文乱码。
至于注释应该使用中文还是英文,请自己行决定,根据公司或项目的要求而定,推荐使用英文。
1. 整理代码
1.1. Java 代码中不允许出现警告,无法消除的警告要用 @SuppressWarnings。
1.2. 去掉无用的包、方法、变量等,减少僵尸代码。
1.3. 使用 Lint 工具来查看并消除警告和错误。
1.4. 使用 Ctrl+Shift+F 来格式化代码,然后再进行调整。
1.5. 使用 Ctrl+Shift+O 来格式化 Import 包。
2. 命名规则
2.1. 基本原则
2.1.1. 变量,方法,类命名要表义,严格禁止使用 name1, name2 等命名。
2.1.2. 命名不能太长,适当使用简写或缩写。(最好不要超过 25 个字母)
2.1.3. 方法名以小写字母开始,以后每个单词首字母大写。
2.1.4. 避免使用相似或者仅在大小写上有区别的名字。
2.1.5. 避免使用数字,但可用 2 代替 to,用 4 代替 for 等,如 go2Clean。
2.2. 类、接口
2.2.1. 所有单词首字母都大写。使用能确切反映该类、接口含义、功能等的词。一般采用名词。
2.2.2. 接口带 I 前缀,或able, ible, er等后缀。如ISeriable。
2.3. 字段、常量
2.3.1. 成员变量以 m 开头,静态变量以 s 开头,如 mUserName, sInstance。
2.3.2. 常量全部大写,在词与词之前用下划线连接,如 MAX_NUMBER。
2.3.3. 代码中禁止使用硬编码,把一些数字或字符串定义成常用量。
2.3.4. 对于废弃不用的函数,为了保持兼容性,通常添加 @Deprecated
3. 注释
请参考 下面示例类的注释。
4. Class 内部顺序和逻辑
4.1. 每个 class 都应该按照一定的逻辑结构来排列基成员变量、方法、内部类等, 从而达到良好的可读性。
4.2. 总体上来说,要按照先 public, 后 protected, 最后 private, 函数的排布 也应该有一个逻辑的先后顺序,由重到轻。
4.3. 以下顺序可供参考:
定义TAG,一般为 private(可选)
定义 public 常量
定义 protected 常量、内部类
定义 private 变量
定义 public 方法
定义 protected 方法
定义 private 方法
5. 表达式与语句
5.1. 基本原则:采用紧凑型风格来编写代码
5.2. 细则请参见示例类CodingRuler
代码如下 | 复制代码 |
/** * 文件名(可选),如 xxx.java * * 版本信息(可选),如:@version 1.0.0 * * 版权申明(开源代码一般都需要添加),如:Copyright (C) 2010-2014 xxx Corporation. */ package com.ntes.ruler; /** * 类的大体描述放在这里。 * * * @author 作者名 * @since 2014-XX-XX */ @SuppressWarnings("unused") public class CodingRuler { /** 公有的常量注释 */ public static final String ACTION_MAIN = "android.intent.action.MAIN"; /** 私有的常量注释(同类型的常量可以分块并紧凑定义) */ private static final int MSG_AUTH_NONE = 0; private static final int MSG_AUTH_SUCCESS = 1; private static final int MSG_AUTH_FAILED = 2; /** 保护的成员变量注释 */ protected Object mObject0; /** 私有的成员变量 mObject1 注释(同类型的成员变量可以分块并紧凑定义) */ private Object mObject1; /** 私有的成员变量 mObject2 注释 */ private Object mObject2; /** 私有的成员变量 mObject3 注释 */ private Object mObject3; /** * 对于注释多于一行的,采用这种方式来 定义该变量 */ private Object mObject4; /** * 公有方法描述... * * @param param1 * 参数1描述... * @param param2 * 参数2描述... * @param paramXX * 参数XX描述... (注意:请将参数、描述都对齐) */ public void doSomething(int param1, float param2, String paramXX) { // 以下注释标签可以通过Eclipse内置的Task插件看到 // TODO 使用TODO来标记代码,说明标识处有功能代码待编写 // FIXME 使用FIXME来标记代码,说明标识处代码需要修正,甚至代码是 // 错误的,不能工作,需要修复 // XXX 使用XXX来标记代码,说明标识处代码虽然实现了功能,但是实现 // 的方法有待商榷,希望将来能改进 } /** * 保护方法描述... */ @Deprecated protected void doSomething() { // ...implementation } /** * 私有方法描述... * * @param param1 * 参数1描述... * @param param2 * 参数2描述... */ private void doSomethingInternal(int param1, float param2) { // ...implementation } /** * 条件表达式原则。 */ private void conditionFun() { boolean condition1 = true; boolean condition2 = false; boolean condition3 = false; boolean condition4 = false; boolean condition5 = false; boolean condition6 = false; // 原则: 1. 所有 if 语句必须用 {} 包括起来,即便只有一句,禁止使用不带{}的语句 // 2. 在含有多种运算符的表达式中,使用圆括号来避免运算符优先级问题 // 3. 判断条件很多时,请将其它条件换行 if (condition1) { // ...implementation } if (condition1) { // ...implementation } else { // ...implementation } if (condition1) /* 禁止使用不带{}的语句 */ condition3 = true; if ((condition1 == condition2) || (condition3 == condition4) || (condition5 == condition6)) { } } /** * Switch语句原则。 */ private void switchFun() { // 原则: 1. switch 语句中,break 与下一条 case 之间,空一行 // 2. 对于不需要 break 语句的,请使用 /* Falls through */来标注 // 3. 请默认写上 default 语句,保持完整性 int code = MSG_AUTH_SUCCESS; switch (code) { case MSG_AUTH_SUCCESS: break; case MSG_AUTH_FAILED: break; case MSG_AUTH_NONE: /* Falls through */ default: break; } } /** * 循环表达式。 */ private void circulationFun() { // 原则: 1. 尽量使用for each语句代替原始的for语句 // 2. 循环中必须有终止循环的条件或语句,避免死循环 // 3. 循环要尽可能的短, 把长循环的内容抽取到方法中去 // 4. 嵌套层数不应超过3层, 要让循环清晰可读 int array[] = { 1, 2, 3, 4, 5 }; for (int data : array) { // ...implementation } int length = array.length; for (int ix = 0; ix < length; ix++) { // ...implementation } boolean condition = true; while (condition) { // ...implementation } do { // ...implementation } while (condition); } /** * 异常捕获原则。 */ private void exceptionFun() { // 原则: 1. 捕捉异常是为了处理它,通常在异常catch块中输出异常信息。 // 2. 资源释放的工作,可以放到 finally 块部分去做。如关闭 Cursor 等。 try { // ...implementation } catch (Exception e) { e.printStackTrace(); } finally { } } /** * 其它原则(整理中...)。 */ private void otherFun() { // TODO } } |
无觅相关文章插件,快速提升流量
静默安装是在手机有了root权限之后使用静默安装给你手机安装软件了,这种安装方式手机没有任何提醒哦,下面来看一段代码。android手机在获得root权限之后,可以调用命令的方式静默安装软件,这一点体验是很不错,但是目前网络上关于android静默安装app的代码均出自一人之手,其中有一个非常sb的bug,借用代码的人居然都没有发现,导致网络上几乎所有关于android app静默安装的代码都是错误的。
代码如下 | 复制代码 |
new Thread() { |
这个代码实际上也可以运行起来,在root的手机中,也可以静默安装成功,但是代码有问题就是bug,不知道哪一天这个有问题的代码就会出现错误
下面是修改之后的代码,修改了上面的bug
代码如下 | 复制代码 |
new Thread() { |
修改的地方就在于从输出流中读取输出数据,可以看出如果输出的数据大于缓存区大小(256),就会导致安装后的操作多次执行,上面这段错误的代码之所以可以运行,是在于输出流的输出为Success ,小于256,但是如果运行指令出错,返回一大推的错误,那么上面的那一段将读取所有的数据,读逐一进行比较。
相关文章
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- 下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24- 夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
- C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
- 如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24- 深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02