針對這個功能,一般app中都會需要這個功能,雖然簡單,但是每次都要寫不少的重複代碼,因此對其進行了封裝
權限需要拍照和讀寫SDCard的權限
佈局就一個Button和ImageView這裏就不再寫了
對於這個功能,用戶只要拍照後的照片結果,其他他們並不會關心,所以我們只需要返回一個剪切後的照片給他們就OK了。這裏用了回調接口來將剪切後的結果回傳給用戶
public OnPhotoResultCallback onPhotoResultCallback;
public void setOnPhotoResultCallback(
OnPhotoResultCallback onPhotoResultCallback) {
this.onPhotoResultCallback = onPhotoResultCallback;
}
// 照片剪切後的結果
public interface OnPhotoResultCallback {
void onResult(Intent data);
}
這裏就是拍照,選照片和剪切的功能,就不再多說了,都有註釋
/**
*
* @author oliver
*
*/
public class PhotoUtil {
private static final int REQUESTCODE_PICK = 1;
private static final int REQUESTCODE_TAKE = 2;
private static final int REQUESTCODE_CUTTING = 3;
private Uri imageUri;
private static PhotoUtil mPhotoUtil;
private PhotoUtil() {}
public static PhotoUtil getInstance() {
if (mPhotoUtil == null) {
synchronized (PhotoUtil.class) {
if (mPhotoUtil == null) {
mPhotoUtil = new PhotoUtil();
}
}
}
return mPhotoUtil;
}
/**
* 選照片
* @param activity
*/
public void pickPhoto(Activity activity) {
Intent pickIntent = new Intent(Intent.ACTION_PICK);
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
activity.startActivityForResult(pickIntent, REQUESTCODE_PICK);
}
/**
* 拍照
* @param activity
*/
public void takePhoto(Activity activity) {
// 圖片名稱 時間命名
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss",
Locale.CHINA);
Date date = new Date(System.currentTimeMillis());
String filename = format.format(date);
// 創建File對象用於存儲拍照的圖片 SD卡根目錄
// File outputImage = new
// File(Environment.getExternalStorageDirectory(),test.jpg);
// 存儲至DCIM文件夾
File path = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File outputImage = new File(path, filename + ".jpg");
try {
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 照相
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // 指定圖片輸出地址
activity.startActivityForResult(intent, REQUESTCODE_TAKE); // 啓動照相
}
/**
* 剪切照片
* @param activity
* @param uri
*/
public void startPhotoZoom(Activity activity, Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", true);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
activity.startActivityForResult(intent, REQUESTCODE_CUTTING);
}
/**
* 對返回結果的處理,此方法需要在activity的onActivityResult中調用
* @param activity
* @param requestCode
* @param resultCode
* @param data
*/
public void onActivityResult(Activity activity, int requestCode,
int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case REQUESTCODE_PICK:// 選照片
startPhotoZoom(activity, data.getData());// 剪切功能
break;
case REQUESTCODE_TAKE:// 拍照
startPhotoZoom(activity, imageUri);// 剪切功能
break;
case REQUESTCODE_CUTTING:// 剪切結果
if (data != null) {
if (onPhotoResultCallback != null) {
onPhotoResultCallback.onResult(data);
}
}
break;
default:
break;
}
}
}
最後我們直接上封裝後的代碼,是不是感覺比之前少了很多代碼,其實可以做很多擴展,這裏就不再寫了,需要的自行擴展吧。
這裏寫代碼片
public class MainActivity extends ActionBarActivity{
private ImageView ivImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ivImage = (ImageView) findViewById(R.id.iv_image);
/**
* 拍照的結果
*/
PhotoUtil.getInstance().setOnPhotoResultCallback(new OnPhotoResultCallback() {
@Override
public void onResult(Intent data) {
setPicToView(data);
}
});
}
public void select(View view) {
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("照片來源");
builder.setItems(new String[] { "拍照", "相冊" },
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch (which) {
case 0:
PhotoUtil.getInstance().takePhoto(MainActivity.this);
break;
case 1:
PhotoUtil.getInstance().pickPhoto(MainActivity.this);
break;
}
}
});
builder.create().show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
/**
* 將結果交給PhotoUtil處理
*/
PhotoUtil.getInstance().onActivityResult(this, requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
private void setPicToView(Intent picdata) {
Bundle extras = picdata.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
Drawable drawable = new BitmapDrawable(getResources(), photo);
ivImage.setImageDrawable(drawable);
}
}
}