Android 在部分华为手机上出现乱码的问题
Android APP 在部分华为手机上出现了乱码问题,找了好久了终于找到原因了
前后台post请求体编码和解码时一致的 URL;UTF-8
但是还是出现了乱码,原因如下:
Content-Type:application/x-www-form-urlencoded; charset=UTF-8,application/x-www-form-urlencoded; charset=utf-8
Content-Type:application/x-www-form-urlencoded含义是表示客户端提交给服务器文本内容的编码方式 是URL编码,
即除了标准字符外,每字节以双字节16进制前加个“%”表示,当然还有其他编码方式,如:CONTENT-TYPE:multipart/form-data 。
Content-Type 内容重复了,格式不对,服务器识别不了,所有当发送post请求时请求体里面有中文时服务器解码不正确,所以乱码了
具体问题如下(使用了Volley请求)
1.Volley post请求是请求头会自动加上content-type
详细代码如下:
public static RequestQueuenewRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), "volley");
String userAgent = "volley/0";
try {
String network = context.getPackageName();
PackageInfo queue = context.getPackageManager().getPackageInfo(network,0);
userAgent = network + "/" + queue.versionCode;
} catch (NameNotFoundException var6) {
;
}
if(stack == null) {
if(VERSION.SDK_INT>= 9) {
stack = newHurlStack();
} else {
stack = newHttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
BasicNetwork network1 = new BasicNetwork((HttpStack)stack);
RequestQueue queue1 = new RequestQueue(new DiskBasedCache(cacheDir),network1);
queue1.start();
return queue1;
}
HurlStack类中
publicHttpResponse performRequest(Request<?> request, Map<String, String>additionalHeaders) throws IOException, AuthFailureError {
String url = request.getUrl();
HashMap map = new HashMap();
map.putAll(request.getHeaders());
map.putAll(additionalHeaders);
if(this.mUrlRewriter != null) {
String parsedUrl =this.mUrlRewriter.rewriteUrl(url);
if(parsedUrl == null) {
throw new IOException("URLblocked by rewriter: " + url);
}
url = parsedUrl;
}
URL parsedUrl1 = new URL(url);
HttpURLConnection connection =this.openConnection(parsedUrl1, request);
//volley使用的是HttpURLConnection
Iterator responseCode =map.keySet().iterator();
while(responseCode.hasNext()) {
String protocolVersion =(String)responseCode.next();
connection.addRequestProperty(protocolVersion,(String)map.get(protocolVersion));
}
setConnectionParametersForRequest(connection, request);//注意这个方法
ProtocolVersion protocolVersion1 = newProtocolVersion("HTTP", 1, 1);
int responseCode1 =connection.getResponseCode();
if(responseCode1 == -1) {
throw new IOException("Couldnot retrieve response code from HttpUrlConnection.");
} else {
BasicStatusLine responseStatus =new BasicStatusLine(protocolVersion1, connection.getResponseCode(),connection.getResponseMessage());
BasicHttpResponse response = newBasicHttpResponse(responseStatus);
response.setEntity(entityFromConnection(connection));
Iterator var12 =connection.getHeaderFields().entrySet().iterator();
while(var12.hasNext()) {
Entry header =(Entry)var12.next();
if(header.getKey() != null) {
BasicHeader h = newBasicHeader((String)header.getKey(), (String)((List)header.getValue()).get(0));
response.addHeader(h);
}
}
return response;
}
}
下面的添加content-type请求头参数的方法
static voidsetConnectionParametersForRequest(HttpURLConnection connection,Request<?> request) throws IOException, AuthFailureError {
switch(request.getMethod()) {
case -1:
byte[] postBody =request.getPostBody();
if(postBody != null) {
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", request.getPostBodyContentType());
DataOutputStream out = newDataOutputStream(connection.getOutputStream());
out.write(postBody);
out.close();
}
break;
case 0:
connection.setRequestMethod("GET");
break;
case 1:
connection.setRequestMethod("POST");
addBodyIfExists(connection,request);
break;
case 2:
connection.setRequestMethod("PUT");
addBodyIfExists(connection,request);
break;
case 3:
connection.setRequestMethod("DELETE");
break;
default:
throw newIllegalStateException("Unknown method type.");
}
}
private staticvoid addBodyIfExists(HttpURLConnection connection, Request<?> request)throws IOException, AuthFailureError {
byte[] body = request.getBody();
if(body != null) {
connection.setDoOutput(true);
connection.addRequestProperty("Content-Type",request.getBodyContentType());
DataOutputStream out = newDataOutputStream(connection.getOutputStream());
out.write(body);
out.close();
}
}
默认的请求和自己设置为post请求都会添加一个content-type
protectedString getParamsEncoding() {
return "UTF-8";
}
public String getBodyContentType() {
return"application/x-www-form-urlencoded; charset=" +this.getParamsEncoding();
}
content-type的值为application/x-www-form-urlencoded; charset=UTF-8
2.android 在部分华为手机上乱码
Volley VERSION.SDK_INT>= 9 时使用的是 HttpURLConnection
HttpURLConnection添加请求头参数的代码如下
public synchronized voidaddRequestProperty(String var1, String var2) {
if(!this.connected && !this.connecting) {
if(var1 == null) {
throw newNullPointerException("key is null");
} else {
if(this.isExternalMessageHeaderAllowed(var1, var2)) {
this.requests.add(var1, var2);
if(!var1.equalsIgnoreCase("Content-Type")){
this.userHeaders.add(var1, var2);
}
}
}
} else {
throw new IllegalStateException("Already connected");
}
}
// this.requests.add(var1, var2); 这段代码是加入content-type 的代码
private MessageHeader requests; //requests为MessageHeader 的实例
MessageHeader 是通过数组来存储key和value的
publicsynchronized void add(String var1, String var2) {
this.grow();
this.keys[this.nkeys] = var1;
this.values[this.nkeys] = var2;
++this.nkeys;
}
private voidgrow() {
if(this.keys == null || this.nkeys>= this.keys.length) {
String[] var1 = new String[this.nkeys + 4];
String[] var2 = new String[this.nkeys + 4];
if(this.keys != null) {
System.arraycopy(this.keys, 0,var1, 0, this.nkeys);
}
if(this.values != null) {
System.arraycopy(this.values,0, var2, 0, this.nkeys);
}
this.keys = var1;
this.values = var2;
}
}
正常情况下加两次content-type 会在请求头里面重新两次content-type
如下:
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Content-Type: application/x-www-form-urlencoded;charset=utf-8
但是在部分华为手机上会奇葩的自动拼接到一起
Content-Type:application/x-www-form-urlencoded; charset=UTF-8,application/x-www-form-urlencoded; charset=utf-8
看到上面的奇葩逗号没,格式不对了,服务器无法识别这种格式的请求体了编码方式了,最后出现乱码了。
具体是为什么Content-Type字段的值在部分华为的手机上为什么会拼接到一起,还没有找到原因,求大神们指导一下
Android 在部分华为手机上出现乱码的问题相关推荐
- Android checkbox在华为手机上不显示问题
一.问题描述 在CardView布局文件中有复选框代码. CardView具有白色背景.通常情况下,我认为未经检查的Checkbox是一个黑色方块.我的布局显示没有空白复选框.我只看到白色的CardV ...
- Android微信登录在华为手机上无法调起授权界面的问题
Android微信登录在华为手机上无法调起授权界面的问题 App集成了微信登录,在其他手机上微信登录都可以正常调起微信授权页面,并且登录成功,但是 在华为手机上调用微信登录,没报异常,也无法调起微信授 ...
- 华为android通知使用权6,如何在华为手机上开启百度应用的通知使用权限
如何在华为手机上开启百度应用的通知使用权限 有的人成为了果粉,有的人选择了安卓手机,那么在安卓手机华为手机上如何开启百度应用的通知使用权限呢?小编就来为大家介绍一下吧. 具体如下: 1. 第一步,打开 ...
- Android 高德地图在华为手机上获取位置信息失败
昨天遇到一个特别奇怪的bug,华为手机获取高德定位信息失败,调试打印数据后发现 location.getAddress()这个获取值为空,之前一直选择高精度模式,但是获取不到位置信息 //设置定位模式 ...
- 利用开发者工具远程调试Android时,华为手机无法被识别
利用开发者工具远程调试Android时,华为手机无法被识别的解决办法: 安装华为手机助手,成功安装华为手机驱动,重启USB调试,就可以了. 参考资料: 远程调试Android设备使用入门 键盘快捷键参 ...
- 【HMS Core】定位地图服务常见问题,穿戴设备支持、比例尺支持、在非华为手机上逆地理编码的支持?
1.关于华为HMS-定位服务穿戴设备的支持问题. 想为华为手表开发定位服务相关的app,华为哪些手表支持定位服务,并且定位数据可以提供给开发者.基于华为自己的编译器开发的app,能否打包成apk包提 ...
- 电脑上如何登录华为云服务器地址,华为手机上的云服务备忘录如何在电脑上登录?...
原标题:华为手机上的云服务备忘录如何在电脑上登录? 裕民是一名退伍军官,去年从部队转业回到西安老家,经过好朋友的介绍,在西安的一个乡村小镇上找了一片宽敞的地方,和好朋友老张一起开办了一家户外拓展训练中 ...
- android 无线显示功能,华为手机的无线显示功能在哪,怎么使用?
华为手机的无线显示功能在哪,怎么使用?无线显示功能在华为手机上称为多屏互动.在主页面,咱们从上往下的滑动,就可以看到有多屏互动了.不过因为华为手机有许多的系列,荣耀.麦芒.mate等,多屏互动打开方式 ...
- 华为手机上高德sdk定位不准
问题 在华为手机上测试高德sdk时,发现在切换城市或默认定位当前城市时,总是返回默认定位位置北京. 原因 由于华为的芯片是自主研发,导致和高德sdk的接口不兼容.因此无法准确定位. 高德sdk定位的逻 ...
最新文章
- java 重载 参数子类_java - Java中带有子类参数的函数重载 - 堆栈内存溢出
- java不同的数据源如何处理_java – 如何在不同的数据源上创建两个类之间的关系?...
- 执行RF测试只生成output.xml文件,不生成log和report文件
- PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名
- 滚动条判断是否滑动到顶部底部
- 【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析
- 机器学习笔记(八):神经网络:学习
- AMD 发布第二代EPYC处理器,重新定义数据中心新标准
- 基于优化反馈的组合在线学习
- 解决IOS中input失焦后,页面上移,点击不了问题
- Java项目导入eclipse后项目出现JRE System Library [JavaSE-1.8](unbound)
- ht1621b和单片机电平匹配_干货 | 143条 超详细整理STM32单片机学习笔记
- w3c 菜鸟mysql_w3c菜鸟
- 关心国事-21世纪经济报道:周鸿祎人治雅虎中国
- Exchangeable Image File (EXIF)图片信息
- Java的Scanner对象
- android studio开发十一 Library第三方类库源码, Jar包和SO库
- 提升团队客户服务技能的6个秘诀
- ios申请企业开发者账号的代理_苹果企业开发者账号如何申请?
- fing网络扫描仪android,Fing网络扫描仪
热门文章
- 解决Run As里面没有Java Application的方法
- 乐观锁和 MVCC 的区别
- 【BEV】BEVDet
- Git仓库(github/gialab)进行fork后如何与原仓库同步
- vue.config.js :配置webpack(文件传输大小受限)The following asset(s) exceed the recommended size limit (244 KiB)
- 孙鑫MFC笔记(15)--多线程和聊天室的创建
- [已解决]连接星巴克的wifi后不弹跳验证页面
- 北京/杭州内推 | 阿里达摩院对话智能团队招聘NLP算法研究型实习生
- 【Linux】网络入门
- 帮PCB工厂唱Hook-浅谈SMT表面安装