每个应用都有这样的功能,在我的界面,需要修改用户头像(拍照,选择本地),将图片上传到服务器.
- 这就涉及到了好几个问题:
- 1.现在市面上好多手机已经是7.0系统,这里我们就要注意一些兼容处理,6.0动态权限,7.0文件安全
- 2.图片的上传,这里我使用okhttp
1.最好用的拍照Utils
- 这里我只粘贴操作的代码,具体的utils类大家可以去copy,后面我会说到
- 这里我还用到了ios风格的底部选择框
CropImageUtils.getInstance().openAlbum(this); //打开相册
CropImageUtils.getInstance().takePhoto(this); //拍照
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
CropImageUtils.getInstance().onActivityResult(mContext, requestCode, resultCode, data, new CropImageUtils.OnResultListener() {
@Override
public void takePhotoFinish(String path) {
//拍照回调,去裁剪
CropImageUtils.getInstance().cropPicture(mContext, path);
}
@Override
public void selectPictureFinish(String path) {
//相册回调,去裁剪
CropImageUtils.getInstance().cropPicture(mContext, path);
}
@Override
public void cropPictureFinish(String path) {
LogUtils.d("path", path + " .....");
//TODO 上传图片
SpUtil.putString(mContext, GlobalVariables.USER_ICON_FILE_PATH, path);
// upload(path);
}
});
}
/**
* 上传图片到服务器
*
* @param path
*/
private void upload(String path) {
HashMap<String, Object> paramsMap = getMapParams(path);
//TODO 1. 请求路径url
String request_url = "";
MultipartBody.Builder builder = new MultipartBody.Builder();
//设置类型(表单上传)
builder.setType(MultipartBody.FORM);
//追加参数
for (String key : paramsMap.keySet()) {
Object object = paramsMap.get(key);
if (!(object instanceof File)) {
builder.addFormDataPart(key, object.toString());
} else {
File file = (File) object;
builder.addFormDataPart(key, file.getName(), RequestBody.create(null, file));
}
}
//创建RequestBody
RequestBody body = builder.build();
//创建Request
final Request request = new Request.Builder().url(request_url).post(body).build();
//单独设置参数 比如读取超时时间
Call call = new OkHttpClient().newBuilder().writeTimeout(50, TimeUnit.SECONDS).build().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
LogUtils.d("json", "上传失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String string = response.body().string();
LogUtils.d("json", "上传图片成功: " + string);
} else {
LogUtils.d("json", "上传失败");
}
}
});
}
//TODO 2. 添加参数
private HashMap<String, Object> getMapParams(String path) {
HashMap<String, Object> params = new HashMap<>();
//todo 这里根据接口自己改变参数
// params.put("uid", uid);
// params.put("pwd", Encrypt.getMD5Str(pwd));
// params.put("bid", Constant.PRODUCT);
// params.put("cp", Constant.OS);
// params.put("cv", AndroidUtil.getVersionName(this));
// params.put("pkgname", this.getPackageName());
// params.put("imei", SystemUtil.getImei(this));
// params.put("imsi", SystemUtil.getImsi(this));
// params.put("netmode", SystemUtil.getNetworkName(this));
// params.put("ts", String.valueOf(System.currentTimeMillis() / 1000));
File file = new File(path);
if (file != null) {
params.put("pic", file);
}
return params;
}
2.结束
- 上面只是粘贴了使用的部分代码,具体实现可以去看我上次的demo,可以完全用到你到项目中.
- 地址: https://github.com/hh-pan/UserInfoSetting