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 在部分华为手机上出现乱码的问题相关推荐

  1. Android checkbox在华为手机上不显示问题

    一.问题描述 在CardView布局文件中有复选框代码. CardView具有白色背景.通常情况下,我认为未经检查的Checkbox是一个黑色方块.我的布局显示没有空白复选框.我只看到白色的CardV ...

  2. Android微信登录在华为手机上无法调起授权界面的问题

    Android微信登录在华为手机上无法调起授权界面的问题 App集成了微信登录,在其他手机上微信登录都可以正常调起微信授权页面,并且登录成功,但是 在华为手机上调用微信登录,没报异常,也无法调起微信授 ...

  3. 华为android通知使用权6,如何在华为手机上开启百度应用的通知使用权限

    如何在华为手机上开启百度应用的通知使用权限 有的人成为了果粉,有的人选择了安卓手机,那么在安卓手机华为手机上如何开启百度应用的通知使用权限呢?小编就来为大家介绍一下吧. 具体如下: 1. 第一步,打开 ...

  4. Android 高德地图在华为手机上获取位置信息失败

    昨天遇到一个特别奇怪的bug,华为手机获取高德定位信息失败,调试打印数据后发现 location.getAddress()这个获取值为空,之前一直选择高精度模式,但是获取不到位置信息 //设置定位模式 ...

  5. 利用开发者工具远程调试Android时,华为手机无法被识别

    利用开发者工具远程调试Android时,华为手机无法被识别的解决办法: 安装华为手机助手,成功安装华为手机驱动,重启USB调试,就可以了. 参考资料: 远程调试Android设备使用入门 键盘快捷键参 ...

  6. 【HMS Core】定位地图服务常见问题,穿戴设备支持、比例尺支持、在非华为手机上逆地理编码的支持?

     1.关于华为HMS-定位服务穿戴设备的支持问题. 想为华为手表开发定位服务相关的app,华为哪些手表支持定位服务,并且定位数据可以提供给开发者.基于华为自己的编译器开发的app,能否打包成apk包提 ...

  7. 电脑上如何登录华为云服务器地址,华为手机上的云服务备忘录如何在电脑上登录?...

    原标题:华为手机上的云服务备忘录如何在电脑上登录? 裕民是一名退伍军官,去年从部队转业回到西安老家,经过好朋友的介绍,在西安的一个乡村小镇上找了一片宽敞的地方,和好朋友老张一起开办了一家户外拓展训练中 ...

  8. android 无线显示功能,华为手机的无线显示功能在哪,怎么使用?

    华为手机的无线显示功能在哪,怎么使用?无线显示功能在华为手机上称为多屏互动.在主页面,咱们从上往下的滑动,就可以看到有多屏互动了.不过因为华为手机有许多的系列,荣耀.麦芒.mate等,多屏互动打开方式 ...

  9. 华为手机上高德sdk定位不准

    问题 在华为手机上测试高德sdk时,发现在切换城市或默认定位当前城市时,总是返回默认定位位置北京. 原因 由于华为的芯片是自主研发,导致和高德sdk的接口不兼容.因此无法准确定位. 高德sdk定位的逻 ...

最新文章

  1. java 重载 参数子类_java - Java中带有子类参数的函数重载 - 堆栈内存溢出
  2. java不同的数据源如何处理_java – 如何在不同的数据源上创建两个类之间的关系?...
  3. 执行RF测试只生成output.xml文件,不生成log和report文件
  4. PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名
  5. 滚动条判断是否滑动到顶部底部
  6. 【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析
  7. 机器学习笔记(八):神经网络:学习
  8. AMD 发布第二代EPYC处理器,重新定义数据中心新标准
  9. 基于优化反馈的组合在线学习
  10. 解决IOS中input失焦后,页面上移,点击不了问题
  11. Java项目导入eclipse后项目出现JRE System Library [JavaSE-1.8](unbound)
  12. ht1621b和单片机电平匹配_干货 | 143条 超详细整理STM32单片机学习笔记
  13. w3c 菜鸟mysql_w3c菜鸟
  14. 关心国事-21世纪经济报道:周鸿祎人治雅虎中国
  15. Exchangeable Image File (EXIF)图片信息
  16. Java的Scanner对象
  17. android studio开发十一 Library第三方类库源码, Jar包和SO库
  18. 提升团队客户服务技能的6个秘诀
  19. ios申请企业开发者账号的代理_苹果企业开发者账号如何申请?
  20. fing网络扫描仪android,Fing网络扫描仪

热门文章

  1. 解决Run As里面没有Java Application的方法
  2. 乐观锁和 MVCC 的区别
  3. 【BEV】BEVDet
  4. Git仓库(github/gialab)进行fork后如何与原仓库同步
  5. vue.config.js :配置webpack(文件传输大小受限)The following asset(s) exceed the recommended size limit (244 KiB)
  6. 孙鑫MFC笔记(15)--多线程和聊天室的创建
  7. [已解决]连接星巴克的wifi后不弹跳验证页面
  8. 北京/杭州内推 | 阿里达摩院对话智能团队招聘NLP算法研究型实习生
  9. 【Linux】网络入门
  10. 帮PCB工厂唱Hook-浅谈SMT表面安装