内测的时候有人反映微信登录时用户昵称是乱码,所以回来调试时在logcat中打印了一下, 发现确实是乱码,我一开始以为是编码问题,然后几种常用的中文编码方式我都试了下,发现还是乱码,网上大概地搜了一下,发现直接在获取网络输入流时就进行转码可以解决这个问题。
但我们原来都是用volley来发网络请求的,要修改的话就需要在初始化RequestQueue时提供自己实现的HttpStack,虽然可以直接复制并稍微修改一下默认的HurlStack的代码,但是这样影响太大而且太麻烦,所以直接改用原生的URLConnection+AsyncStack发请求
代码修改如下
static class GetUserInfoTask extends AsyncTask<Object, Void, String> {
private OnGetUserInfoListener mListener;
private String mUrl;
public GetUserInfoTask(OnGetUserInfoListener listener, String getUserInfoUrl) {
mListener = listener;
mUrl = getUserInfoUrl;
}
@Override
protected String doInBackground(Object... params) {
HttpURLConnection conn = null;
BufferedReader in = null;
StringBuilder result = new StringBuilder();
try {
conn = (HttpURLConnection)new URL(mUrl).openConnection();
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String buf;
while ((buf = in.readLine()) != null)
result.append(buf);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (conn != null)
conn.disconnect();
FileUtils.close(in);
}
return result.toString();
}
@Override
protected void onPostExecute(String s) {
Log.d(TAG, "onPostExecute " + s);
mListener.onGetUserInfo(s);
}
}
public interface OnGetUserInfoListener {
void onGetUserInfo(String userInfo); //json字符串
void onNetError();
}
获取用户昵称的代码改成下面的
private void getUserInfo(String accessToken, String openId) {
String url = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=" + accessToken + "&openid=" + openId;
mGetUserInfoTask = new GetUserInfoTask(this, url); //this代表WXEntryActivity.this
mGetUserInfoTask.execute();
}
然后WXEntryActivity实现OnGetUserInfoListener接口,具体的逻辑就是应用相关的了
不过话说回来微信的SDK做的真的是水