您的位置:首页 > 其它

手机系统自带相机相册上传服务器

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;
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);
}
});
}
};由此完成相机相册的整体上传逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐