修改用户头像,上传到服务器

来源:互联网 发布:亿网域名怎么解析 编辑:程序博客网 时间:2024/05/01 06:16

每个应用都有这样的功能,在我的界面,需要修改用户头像(拍照,选择本地),将图片上传到服务器.

  • 这就涉及到了好几个问题:
  • 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