Android记录8--编译时部分错误记载

java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es

Java调用 URLDecoder.decode(str, “UTF-8”); 抛出以上的异常,其主要原因是% 在URL中是特殊字符,需要特殊转义一下,

上面的字符串中’%’是一个中文字符’是’,而转换的实现是将%后面的两个字符一起转为一个16进制数。拿”%是”来转换数字,肯定会有NumberFormatException异常。

类似的如果请求字符串中有’+’,也会有问题。因为’+’被当做空格使用了。

一个解决办法就是将%替换为%25。

1
2
3
data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
data = data.replaceAll("\\+", "%2B");
data = URLDecoder.decode(data, "utf-8");

这里使用了一个特殊正则表达式:零宽负向先行断言(zero-width negative lookahead assertion),模式为(?!pattern),代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是’%’开始,但是后面两个字符不是数字,也不是字母。

Android版本27以上not permitted by network security policy

由于 Android P(版本27以上) 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。
如果当前应用的请求是 htttp 请求,而非 https ,这样就会导系统禁止当前应用进行该请求

解决办法:

  1. (推荐)服务器和本地应用都改用 https (推荐)
  2. 设置targetSdkVersion <= 27
  3. 在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下
    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    并在 AndroidManifest.xml application增加配置
    1
    android:networkSecurityConfig="@xml/network_security_config"

Received close_notify during handshake

问题存在原因:这是Android编译错误,jcenter里面的东西下载不了引起的。

问题解决:在项目的build.gradle文件中将jcenter()换成阿里的源,具体示例代码如下。修改之后再重新Sync Project即可。

1
2
3
4
5
6
7
8
repositories {
mavenCentral()
mavenLocal()
// jcenter()
maven{ url'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
google()
}