Android中簡單實現選擇圖片並裁剪,
在android中選擇圖片是一個很常見的功能,圖片的來源通常情況下是從相機擷取和從相簿擷取兩種。
先來寫一個簡單的選擇按鈕和一個能顯示圖片的ImageView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/bt_picture" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="擷取圖片" /> <ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" /></LinearLayout>
接下來就是實現的邏輯
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; } }