package cn.mutils.app.media; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; import java.io.File; import cn.mutils.app.ui.core.IActivityExecutor; import cn.mutils.app.util.AppUtil; import cn.mutils.core.event.IListener; import cn.mutils.core.time.DateTime; /** * Take photo by system call */ @SuppressWarnings({"UnnecessaryInterfaceModifier", "StringBufferReplaceableByString"}) public class TakePhotoTask extends MediaTask { public static interface TakePhotoListener extends IListener { public void onComplete(Uri uri); } public static final int EXPECT_WIDTH = 768; public static final int EXPECT_HEIGHT = 1024; protected Uri mExtraOutput; public TakePhotoTask(IActivityExecutor executor, int requestCode) { super(executor, requestCode); } public boolean takePhoto() { if (mLocked) { return false; } mExtraOutput = generateExtraOutput(); if (mExtraOutput == null) { return false; } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, mExtraOutput); mExecutor.startActivityForResult(intent, mRequestCode); mExecutor.addOnActivityResultListener(mOnActivityResultListener); mLocked = true; return true; } public void setListener(TakePhotoListener listener) { super.setListener(listener); } protected Uri generateExtraOutput() { try { String mediaStorageDir = AppUtil.getDiskCacheDir(mExecutor.getContext(), AppUtil.TAG); if (mediaStorageDir == null) { return null; } DateTime date = new DateTime(); date.setFormat("yyyyMMdd_HHmmss"); StringBuilder sb = new StringBuilder(); sb.append(mediaStorageDir); sb.append("IMG_"); sb.append(date.toString()); sb.append(".jpg"); return Uri.fromFile(new File(sb.toString())); } catch (Exception e) { return null; } } @Override protected void onActivityResult(Context context, int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } Uri uri = data != null ? data.getData() : mExtraOutput; if (AppUtil.compress(uri.getPath(), EXPECT_WIDTH, EXPECT_HEIGHT)) { TakePhotoListener listener = getListener(TakePhotoListener.class); if (listener != null) { listener.onComplete(uri); } } } }