Android中簡單實現選擇圖片並裁剪
在android中選擇圖片是一個很常見的功能,圖片的來源通常情況下是從相機擷取和從相簿擷取兩種。
先來寫一個簡單的選擇按鈕和一個能顯示圖片的ImageView
接下來就是實現的邏輯
private String[] takePhotoitems;// 擷取照片的操縱選項 public static final int TAKE_PHOTO = 1; public static final int CROP_PHOTO = 2; private Button getPicture; private ImageView picture; private Uri imageUri;
設定按鈕的點擊事件
@Override public void onClick(View v) { takePhotoitems = new String[] { 選擇本地圖片, 拍照 }; imageUri = getImageUri(); new AlertDialog.Builder(this) .setTitle(設定頭像) .setItems(takePhotoitems, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: getImageUri(); Intent intent = new Intent( Intent.ACTION_GET_CONTENT); intent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image/*); intent.setType(image/*); intent.putExtra(crop, true); intent.putExtra(scale, true); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, CROP_PHOTO); break; case 1: // 拍照 getImageUri(); if (isHasSdcard()) { Intent takePhotoIntent = new Intent( android.media.action.IMAGE_CAPTURE); takePhotoIntent.putExtra( MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(takePhotoIntent, TAKE_PHOTO); } else { Toast.makeText(MainActivity.this, 未檢測到sd卡, Toast.LENGTH_LONG) .show(); } break; } } }) .setNegativeButton(取消, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); }
用到的兩個工具方法
/** * 擷取圖片的路徑 */ private Uri getImageUri() { File outputImage = new File(Environment.getExternalStorageDirectory(), tempImage.jpg); if (outputImage.exists()) { outputImage.delete(); } try { outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } return Uri.fromFile(outputImage); };
/** * 判斷sd卡是否存在 */ public static boolean isHasSdcard() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { return true; } else { return false; } }
擷取到圖片後進行裁剪
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PHOTO: if (resultCode == RESULT_OK) { Intent intent = new Intent(com.android.camera.action.CROP); intent.setDataAndType(imageUri, image/*); intent.putExtra(scale, true); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, CROP_PHOTO); } break; case CROP_PHOTO: if (resultCode == RESULT_OK) { try { Bitmap bitmap = BitmapFactory .decodeStream(getContentResolver().openInputStream( imageUri)); picture.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } break; default: break; } }