上传头像

public class MainActivity extends Activity implements OnClickListener {

    private ImageView image;
    private File imgRoot;
    private Intent intent;
    private Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 相机需要加权限
        findViewById(R.id.Button1).setOnClickListener(this);
        findViewById(R.id.Button2).setOnClickListener(this);
        image = (ImageView) findViewById(R.id.image);
        // 第一步 : 判断SD卡是否可用 ,可用的话,创建照片存储的目录
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            // SD卡根目录
            File rootSD = Environment.getExternalStorageDirectory();
            // 创建存储的路径
            imgRoot = new File(rootSD.getAbsolutePath() + File.separator+ "imgs");
            // 判断目录是否存在,不存在就创建
            if (!imgRoot.exists()) {
                imgRoot.mkdirs();
            }
        }
        // 隐式Intent,我们不用去指定要跳转到的Activity,只需要指定一个Action,就可以跳转到相应的页面
        // 这个页面一般是系统给我们指定好的页面
        // Intent intent = new Intent(Intent.ACTION_PICK);
        // // 设置类型 image/jpeg image/png image/gif,*是通配符
        // intent.setType("image/*");
        // startActivity(intent);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.Button1:
                // 第二步:
                // imgRoot, new Date().getTime() + ".jpg":每次获取的照片不重复
                File f = new File(imgRoot, new Date().getTime() + ".jpg");
                // 创建照片存储的路径
                uri = Uri.fromFile(f);
                // 第三步:
                // 调用系统的相机功能 用隐式intent的方法
                // 只写这个 不能存储/获取照片 要创建照片存储的路径
                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // 拍照输出的路径
                intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                // 开启intent
                startActivityForResult(intent, 0);
                break;
            case R.id.Button2:
                // 从相册里获取照片
                intent = new Intent(intent.ACTION_PICK);
                // 设置类型 image/jpeg image/png image/gif,*是通配符
                intent.setType("image/*");
                startActivityForResult(intent, 1);
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
            // 从系统相机返回的值
            intent = crop(uri);
            startActivityForResult(intent, 2);

        } else if (requestCode == 1) {
            // 从相册中返回的值
            uri = data.getData();
            intent = crop(uri);
            startActivityForResult(intent, 2);

        } else if (requestCode == 2) {
            // 从返回值中直接获取bitmap
            Bitmap bmp = (Bitmap) data.getExtras().get("data");
            //本地图片转换为file
		 file = getFile(bmp);
		 //上传文件
 		presenter.upLoad(file, uid);
        }
    }
//将本地图片资源转换成File
private File getFile(Bitmap bmp) {
    String defaultPath = getApplicationContext().getFilesDir().getAbsolutePath() + "/defaultGoodInfo";
    File file = new File(defaultPath);
    if (!file.exists()) {
        file.mkdirs();
    }
    String defaultImgPath = defaultPath + "/messageImg.jpg";
    file = new File(defaultImgPath);
    try {
        file.createNewFile();
        FileOutputStream fOut = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 20, fOut);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return file;
}

    private Intent crop(Uri uri) {
        // 隐式Intent,调用系统的裁剪
        Intent intent = new Intent("com.android.camera.action.CROP");
        // 设置裁剪的数据源和数据类型
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");// 可裁剪
        // 裁剪的宽高比例
        intent.putExtra("aspectX", 1); // 裁剪的宽比例
        intent.putExtra("aspectY", 1); // 裁剪的高比例

        // 裁剪的宽度和高度
        intent.putExtra("outputX", 300); // 裁剪的宽度
        intent.putExtra("outputY", 300); // 裁剪的高度
        // 可省略
//    intent.putExtra("scale", true); // 支持缩放
        // 裁剪之后保存的路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.parse(uri.getPath() + ".bak")); // 将裁剪的结果输出到指定的Uri
        // 必须加,否则返回值中找不到返回的值
        intent.putExtra("return-data", true); // 若为true则表示返回数据
        // 可以省略
//    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());// 裁剪成的图片的格式
        // intent.putExtra("noFaceDetection", true); //启用人脸识别
        return intent;
    }

}
P层
  public void upLoad(File file, String uid) {
        tuiLoginModel.upLoad(file, uid)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<TiShiBean>() {
                    @Override
                    public void accept(TiShiBean bean) throws Exception {
                        if (bean != null && "0".equals(bean.getCode())) {
                            iView.onSuccess3(bean);
                        } else {
                            iView.onFailed(new Throwable("服务器未响应"));
                        }
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        iView.onFailed(new Throwable("网络异常"));
                    }
                });
    }
M层
    public Observable<TiShiBean> upLoad(File file, String uid) {
        IApi iApi = HttpUtils.getInstance().create(IApi.class);
//        File file = getFile();
        //RequestBody封装了文件和文件的类型
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
        // MultipartBody.Part封装了接受的key和文件名字和RequestBody
        MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
        Observable<TiShiBean> observable = iApi.upLoad(uid, part);
        return observable;
    }
    
IApi接口
@Multipart
    @POST("file/upload")
    Observable<TiShiBean> upLoad(@Query("uid") String uid, @Part MultipartBody.Part part);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值