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

Android 拍照+图片 裁剪 功能的实现

2014-05-28 18:03 501 查看
  接到一个小需求,要求实现类似截取头像的图片 裁剪 的功能!时间要求很紧,所以就上看了几个小Demo。虽然原理不难,但是真正好用的没有几个。在一堆烂苹果里找到一个最不烂的。然后又自己修改了一下,达到了预期需求实现!

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class DoPhotoActivity extends Activity implements
View.OnClickListener {

/** Called when the activity is first created. */

private Button selectImageBtn;

private ImageView imageView;

private File sdcardTempFile;

private AlertDialog dialog;

private int crop = 128;

private static final int PHOTO_PICKED_WITH_DATA = 3021;

private static final int PHOTO_CAMERA_PICKED_WITH_DATA = 3022;

private static final int CAMERA_WITH_DATA = 3023;

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.do_photo);

selectImageBtn = (Button) findViewById(R.id.selectImageBtn);

imageView = (ImageView) findViewById(R.id.imageView);

selectImageBtn.setOnClickListener(this);

sdcardTempFile = new File(Environment.getExternalStorageDirectory()
+ "/MYIMAGE/" + String.valueOf(System.currentTimeMillis())
+ ".jpg");
}

public void ImageScale() {

Intent intent = new Intent("android.intent.action.PICK");
intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI,
"image/*");
intent.putExtra("output", Uri.fromFile(sdcardTempFile));
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", crop);// 输出图片大小
intent.putExtra("outputY", crop);
startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
}

public void photo() {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_WITH_DATA);
}

protected void doCropPhoto(Bitmap data) {

Intent intent = getCropImageIntent(data);
startActivityForResult(intent, PHOTO_CAMERA_PICKED_WITH_DATA);
}

public Intent getCropImageIntent(Bitmap data) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
intent.putExtra("data", data);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", crop);
intent.putExtra("outputY", crop);
intent.putExtra("return-data", true);
return intent;
}

@Override
public void onClick(View v) {

if (v == selectImageBtn) {

if (dialog == null) {

dialog = new AlertDialog.Builder(this).setItems(
new String[] { "相机", "相册" },
new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog,
int which) {

if (which == 0) {

photo();

} else {
ImageScale();
}

}

}).create();

}

if (!dialog.isShowing()) {

dialog.show();

}

}

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == RESULT_OK) {

switch (requestCode) {

case CAMERA_WITH_DATA:

Bitmap camera_photo = data.getParcelableExtra("data");
doCropPhoto(camera_photo);

case PHOTO_PICKED_WITH_DATA:

Bitmap picked_photo = BitmapFactory.decodeFile(sdcardTempFile.getAbsolutePath());
imageView.setImageBitmap(picked_photo);
break;

case PHOTO_CAMERA_PICKED_WITH_DATA:

Bitmap camera_picked_photo = data.getParcelableExtra("data");
imageView.setImageBitmap(camera_picked_photo);
break;

}

}

}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: