手机系统自带相机相册上传服务器
2018-02-23 17:29
211 查看
本篇文章主要实现点击系统自带的相机,相册获取到图片,进行裁剪上传到服务器。以及6.0动态权限的获取。
首先:private static final int CAMERA = 1; //相机
private static final int PICTURE = 2; //相册
第一步:设置相机相册点击事件,包括设置6.0动态权限的获取。
case R.id.user_pop_photograph: //相机
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return;
} else {
open_camera();
}
} else {
open_camera();
}
break;
case R.id.user_pop_photo_picture: //相册
if (Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((BaseActivity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 2);
return;
} else {
open_galley();
}
} else {
open_galley();
}
break;
第二步:在onActivityResult()中接收点击相机拍照和相册选取后返回的信息,对图片进行裁剪和保存。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK || data == null) {
return;
}
switch (requestCode) {
case CAMERA: //相机获取
if (resultCode == RESULT_OK) {
if (data == null) {
return;
} else {
d8b2
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap bm = extras.getParcelable("data");
Uri uri = saveBitmap(bm);
startImageZoom(uri);
}
}
}
break;
case PICTURE: //相册获取
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Uri fileUri = convertUri(uri);//转换为file类型的uri
startImageZoom(fileUri);
}
break;
}
}
Glide.with(UserAccountActivity.this).load(jsonObject.get("body"))
.asBitmap().centerCrop()
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.override(720, 1280)//图片压缩
.centerCrop()
.dontAnimate()
.into(new BitmapImageViewTarget(mIv_head) {
@Override
protected void setResource(Bitmap resource) {
super.setResource(resource);
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(UserAccountActivity.this.getResources(), resource);
circularBitmapDrawable.setCircular(true);
mIv_head.setImageDrawable(circularBitmapDrawable);
}
});
}
};由此完成相机相册的整体上传逻辑。
首先:private static final int CAMERA = 1; //相机
private static final int PICTURE = 2; //相册
第一步:设置相机相册点击事件,包括设置6.0动态权限的获取。
case R.id.user_pop_photograph: //相机
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
return;
} else {
open_camera();
}
} else {
open_camera();
}
break;
case R.id.user_pop_photo_picture: //相册
if (Build.VERSION.SDK_INT >= 23) {
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((BaseActivity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 2);
return;
} else {
open_galley();
}
} else {
open_galley();
}
break;
private void open_galley() { Intent intent; intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*");//相片类型 startActivityForResult(intent, PICTURE); pop.dismiss(); } private void open_camera() { Intent intent; intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAMERA);//跳转界面传回拍照所得数据 pop.dismiss(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { open_camera(); } else { Toast.makeText(UserAccountActivity.this, "ACTION_IMAGE_CAPTURE Denied", Toast.LENGTH_SHORT).show(); } } else if (requestCode == 2) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { open_galley(); } else { Toast.makeText(UserAccountActivity.this, "ACTION_PICK Denied", Toast.LENGTH_SHORT).show(); } } }
第二步:在onActivityResult()中接收点击相机拍照和相册选取后返回的信息,对图片进行裁剪和保存。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK || data == null) {
return;
}
switch (requestCode) {
case CAMERA: //相机获取
if (resultCode == RESULT_OK) {
if (data == null) {
return;
} else {
d8b2
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap bm = extras.getParcelable("data");
Uri uri = saveBitmap(bm);
startImageZoom(uri);
}
}
}
break;
case PICTURE: //相册获取
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Uri fileUri = convertUri(uri);//转换为file类型的uri
startImageZoom(fileUri);
}
break;
}
}
private Uri convertUri(Uri uri) { InputStream is = null; try { is = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); return saveBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } private Uri saveBitmap(Bitmap bm) { //获取sdcard中的一个路径 File tmpDir = new File(Environment.getExternalStorageDirectory() + "/avater"); if (tmpDir.exists()) { tmpDir.mkdir(); } File img = new File(tmpDir.getAbsolutePath() + "avater.png"); try { FileOutputStream fos = new FileOutputStream(img); //将图像的数据写入该输出流中,第一个参数是要压缩的格式,第二个参数:图片的质量 bm.compress(Bitmap.CompressFormat.PNG, 85, fos); fos.flush(); fos.close(); return Uri.fromFile(img); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return Uri.fromFile(img); } private void startImageZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*");//通过参数uri将数据传递给裁剪界面 intent.putExtra("crop", "true");//设置在开启的intent中显示的view是可裁剪的 intent.putExtra("aspectX", 1); //设置裁剪的宽高比例 intent.putExtra("aspectY", 1); intent.putExtra("outputX", 200); //裁剪图片的宽高 intent.putExtra("outputY", 200); intent.putExtra("return-data", true);//裁剪之后的数据是通过intent返回回来的 startActivityForResult(intent, CROP_REQUEST_CODE); }第三步:在onActivityResult()中接收裁剪后返回的数据,转换成bitmap上传到服务器
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK || data == null) { return; } switch (requestCode) { case CROP_REQUEST_CODE: if (data == null) { return; } Bundle extras = data.getExtras(); Bitmap bm = extras.getParcelable("data"); //调用上传到服务器的方法 upload(saveBitmap(bm).getPath()); default: break; } }
/** * 上传图片到服务器 */ private void upload(String picturePath) { String url = API.API_USER_PICTURE; OkHttpUtils.postPicture(url, new File(picturePath), mToken, new OkHttpCallback(new OkHttpCallback.OkHttpListener() { @Override public void onSuccess(String message, final String response) throws JSONException { JSONObject jsonObject = new JSONObject(response); int code = jsonObject.getInt("code"); if (code == Constant.REQUEST_SUCESS) { Toast.makeText(mContext, "上传成功", Toast.LENGTH_SHORT).show();
glideImage(jsonObject);} } @Override public void onFailure(String errorMsg) { Toast.makeText(UserAccountActivity.this, "上传失败", Toast.LENGTH_LONG).show(); } }));} private void glideImage(JSONObject jsonObject) throws JSONException {
Glide.with(UserAccountActivity.this).load(jsonObject.get("body"))
.asBitmap().centerCrop()
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.override(720, 1280)//图片压缩
.centerCrop()
.dontAnimate()
.into(new BitmapImageViewTarget(mIv_head) {
@Override
protected void setResource(Bitmap resource) {
super.setResource(resource);
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(UserAccountActivity.this.getResources(), resource);
circularBitmapDrawable.setCircular(true);
mIv_head.setImageDrawable(circularBitmapDrawable);
}
});
}
};由此完成相机相册的整体上传逻辑。
相关文章推荐
- 如何修改WebUpload上传文件默认调用系统相机,而不是手机相册?
- h5 app开发使用cordova调用相册、相机、文件系统或录音录视频,并上传到服务器
- 安卓开发小米4,酷派 手机适配和调用系统相机相册做图片上传的问题
- 调用系统相册上传图片到服务器--OPPO等部分手机上出现短暂的显示桌面问题
- Android调取系统相册和相机照片设置到ImageView并上传到服务器
- Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法
- 安卓 相机或相册图片上传至手机界面并显示 最后上传至服务器(界面xml布局代码前一个文章有)
- JS中调用android和ios系统手机打开相机并可选择相册功能
- 调用系统相机、相册、剪裁图片并上传(常用于上传头像,兼容Android7.0)
- 调用系统相册上传头像到服务器
- Android调用系统相机拍照、从相册中取照片,裁剪,并保存到手机SD卡中,展示到界面
- Android调用系统相机和图库设置到控件上并上传服务器
- ionic3从手机相册选择多张照片预览并上传到服务器
- 调用系统相机相册上传头像
- 调用系统相机、相册、剪裁图片并上传(常用于上传头像,兼容Android7.0)
- android 打开系统相册得到路径 上传图片到php服务器
- Android调用手机相机和相册拿到图片保存上传
- Android手机调用系统相机拍照、裁剪以及获取Url上传图片
- 微信小程序-从相册获取图片,视频 使用相机拍照,录像上传+服务器(nodejs版)接收
- android 打开系统相册得到路径 上传图片到php服务器