您的位置:首页 > 移动开发 > Android开发

选择照片、拍照裁剪上传

2017-02-14 22:11 288 查看

在做项目时免不了要上传用户头像这些操作,有时是从相册里面直接取,有时是使用照相机拍照过后进行截图的,现在来实现以下这两种方法。

布局文件

Java代码

布局文件,使用了个第三方的圆形ImageView:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="circleimageview.myself.com.croppicturedemo.MainActivity">

<Button
android:id="@+id/btn_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="相册" />

<Button
android:id="@+id/btn_cammer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_pic"
android:text="相机" />

<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/iv"
android:layout_width="96dp"
android:layout_height="96dp"
app:civ_border_color="#FF000000"
app:civ_border_width="2dp" />
</RelativeLayout>


java代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

/**
* 指定拍摄图片文件位置避免获取到缩略图
*/
private File outFile;
/**
* 选择头像相册选取
*/
private static final int REQUESTCODE_PICK = 1;
/**
* 裁剪好头像-设置头像
*/
private static final int REQUESTCODE_CUTTING = 2;
/**
* 选择头像拍照选取
*/
private static final int PHOTO_REQUEST_TAKEPHOTO = 3;
/**
* 裁剪好的头像的Bitmap
*/
private Bitmap currentBitmap;
private CircleImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button btn_pic = (Button) findViewById(R.id.btn_pic);
Button btn_cammer = (Button) findViewById(R.id.btn_cammer);
btn_pic.setOnClickListener(this);
btn_cammer.setOnClickListener(this);

iv = (CircleImageView)findViewById(R.id.iv);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_pic:
openPic();
break;
case R.id.btn_cammer:
openCamera();
break;
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//  进行判断是那个操作跳转回来的,如果是裁剪跳转回来的这块就要把图片现实到View上,其他两种的话都把数据带入裁剪界面
switch (requestCode) {
//相册
case REQUESTCODE_PICK:
if (data == null || data.getData() == null) {
return;
}
startPhotoZoom(data.getData());
//图片的路径
String s = data.getData().getPath().toString();
Log.i("ss","相片的路径:"+s);
break;
//裁剪
case REQUESTCODE_CUTTING:
if (data != null) {
setPicToView(data);
}
break;
//拍照
case PHOTO_REQUEST_TAKEPHOTO:
startPhotoZoom(Uri.fromFile(outFile));
//图片的路径
String s2 = Uri.fromFile(outFile).getPath().toString();
Log.i("ss","照相机照的照片路径:"+s2);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}

/**
* 把裁剪好的图片设置到View上或者上传到网络
*
* @param data
*/
private void setPicToView(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
/** 可用于图像上传 */
currentBitmap = extras.getParcelable("data");
iv.setImageBitmap(currentBitmap);
}
}

/**
* 调用系统的图片裁剪
*
* @param data
*/
private void startPhotoZoom(Uri data) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(data, "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("scaleUpIfNeeded", true);//黑边
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
Uri cropUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath() + "/wangjunling/image/crop.png"));
intent.putExtra(MediaStore.EXTRA_OUTPUT,cropUri);
startActivityForResult(intent, REQUESTCODE_CUTTING);

String s1 = cropUri.getPath().toString();
Log.i("ss","截图的路径:"+s1);
}
/**
* 打开相册
*/
private void openPic() {
Intent pickIntent = new Intent(Intent.ACTION_PICK, null);
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(pickIntent, REQUESTCODE_PICK);
}
/**
* 打开相机
*/
private void openCamera() {
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File outDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
if (!outDir.exists()) {
outDir.mkdirs();
}
outFile = new File(outDir, System.currentTimeMillis() + ".jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);
} else {
Log.e("CAMERA", "请确认已经插入SD卡");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐