public abstract class StartActivityForResultDelegate {
private Activity mCurrentActivity;
private int mReqCode;
public StartActivityForResultDelegate(Activity currentActivity, int reqCode){
mCurrentActivity = currentActivity;
mReqCode = reqCode;
}
protected abstract Intent initIntent();
public void startActivityForResult(){
mCurrentActivity.startActivityForResult(initIntent(), mReqCode);
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == mReqCode){
if (resultCode == Activity.RESULT_OK){
onResultOk(data);
}
}
}
protected void onResultOk(Intent data){
}
}
public class PhotoTakeDelegate extends StartActivityForResultDelegate{
public static interface Callback{
void onTook(Uri uri);
}
private Uri mOutFileUri;
private Callback mCallback;
public PhotoTakeDelegate(Activity currentActivity, int reqCode){
super(currentActivity, reqCode);
mOutFileUri = getOutputImageFileUri("photo_take_" + System.currentTimeMillis() + ".jpg");
}
public PhotoTakeDelegate(Activity currentActivity, int reqCode, Uri outFileUri){
this(currentActivity, reqCode);
}
public PhotoTakeDelegate(Activity currentActivity, int reqCode, String fileName){
this(currentActivity, reqCode);
mOutFileUri = getOutputImageFileUri(fileName);
}
public void setCallback(Callback callback){
mCallback = callback;
}
@Override
protected Intent initIntent() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mOutFileUri);
return intent;
}
@Override
protected void onResultOk(Intent data) {
onTook(mOutFileUri);
if (mCallback != null){
mCallback.onTook(mOutFileUri);
LogUtils.i("photo take callback . uri = " + mOutFileUri.toString() );
}
}
protected void onTook(Uri uri){
}
private Uri getOutputImageFileUri(String fileName){
File mediaStorageDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File imageFile = new File(mediaStorageDir.getPath() + File.separator
+ fileName);
return Uri.fromFile(imageFile);
}
}
public class ImageCropDelegate extends StartActivityForResultDelegate {
public static interface Callback{
void onCrop(Bitmap bm);
}
private Uri mUri;
private Callback mCallback;
public ImageCropDelegate(Activity activity, int reqCode, Uri uri){
this(activity, reqCode);
mUri = uri;
}
public ImageCropDelegate(Activity activity, int reqCode){
super(activity, reqCode);
}
public void setCallback(Callback callback){
mCallback = callback;
}
public void setUri(Uri uri){
mUri = uri;
}
@Override
protected Intent initIntent() {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(mUri, "image/*");
// intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 0.3);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);// 输出图片大小
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
return intent;
}
@Override
protected void onResultOk(Intent data) {
if (data != null){
Bitmap bitmap = data.getParcelableExtra("data");
onCrop(bitmap);
if (mCallback != null){
mCallback.onCrop(bitmap);
LogUtils.i("image crop callback . bitmap = null : " + (bitmap == null));
}
}
}
protected void onCrop(Bitmap bm){
}
}
public class ImageSelectDelegate extends StartActivityForResultDelegate {
public static interface Callback{
void onImageSelected(Uri uri);
}
private Callback mCallback;
public ImageSelectDelegate(Activity activity , int reqCode){
super(activity, reqCode);
}
public void setCallback(Callback callback){
mCallback = callback;
}
@Override
protected Intent initIntent() {
Intent selectIntent =
new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
return selectIntent;
}
@Override
protected void onResultOk(Intent data) {
if(data != null) {
Uri image = data.getData();
onImageSelected(image);
if (mCallback != null){
mCallback.onImageSelected(image);
LogUtils.i("image select callback . uri = " + image.toString());
}
}
}
protected void onImageSelected(Uri uri){
}
}