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);
上传头像
最新推荐文章于 2022-11-12 22:58:30 发布