1 package zhangpgil.photo; 2 3 import java.io.File; 4 import android.support.v7.app.ActionBarActivity; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.ImageView; 8 import android.widget.Toast; 9 import android.content.Intent; 10 import android.graphics.Bitmap; 11 import android.net.Uri; 12 import android.os.Bundle; 13 import android.os.Environment; 14 import android.provider.MediaStore; 15 16 public class MainActivity extends ActionBarActivity { 17 18 /* 头像文件 */ 19 private static final String IMAGE_FILE_NAME = "temp_head_image.jpg"; 20 21 /* 请求识别码 */ 22 private static final int CODE_GALLERY_REQUEST = 0xa0; 23 private static final int CODE_CAMERA_REQUEST = 0xa1; 24 private static final int CODE_RESULT_REQUEST = 0xa2; 25 26 // 裁剪后图片的宽(X)和高(Y),480 X 480的正方形。(生成bitmap貌似有时要报错?可试下把大小弄小点) 27 private static int output_X = 480; 28 private static int output_Y = 480; 29 30 private ImageView headImage = null; 31 32 @Override 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.activity_main); 36 37 headImage = (ImageView) findViewById(R.id.imageView); 38 39 Button buttonLocal = (Button) findViewById(R.id.buttonLocal); 40 buttonLocal.setOnClickListener(new View.OnClickListener() { 41 42 @Override 43 public void onClick(View v) { 44 choseHeadImageFromGallery(); 45 } 46 }); 47 48 Button buttonCamera = (Button) findViewById(R.id.buttonCamera); 49 buttonCamera.setOnClickListener(new View.OnClickListener() { 50 51 @Override 52 public void onClick(View v) { 53 choseHeadImageFromCameraCapture(); 54 } 55 }); 56 } 57 58 // 从本地相册选取图片作为头像 59 private void choseHeadImageFromGallery() { 60 Intent intentFromGallery = new Intent(); 61 // 设置文件类型 62 intentFromGallery.setType("image/*"); 63 intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); 64 startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST); 65 } 66 67 // 启动手机相机拍摄照片作为头像 68 private void choseHeadImageFromCameraCapture() { 69 Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 70 71 // 判断存储卡是否可用,存储照片文件 72 if (hasSdcard()) { 73 intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri 74 .fromFile(new File(Environment 75 .getExternalStorageDirectory(), IMAGE_FILE_NAME))); 76 } 77 78 startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST); 79 } 80 81 @Override 82 protected void onActivityResult(int requestCode, int resultCode, 83 Intent intent) { 84 85 // 用户没有进行有效的设置操作,返回 86 if (resultCode == RESULT_CANCELED) { 87 Toast.makeText(getApplication(), "取消", Toast.LENGTH_LONG).show(); 88 return; 89 } 90 91 switch (requestCode) { 92 case CODE_GALLERY_REQUEST: 93 cropRawPhoto(intent.getData()); 94 break; 95 96 case CODE_CAMERA_REQUEST: 97 if (hasSdcard()) { 98 File tempFile = new File( 99 Environment.getExternalStorageDirectory(),100 IMAGE_FILE_NAME);101 cropRawPhoto(Uri.fromFile(tempFile));102 } else {103 Toast.makeText(getApplication(), "没有SDCard!", Toast.LENGTH_LONG)104 .show();105 }106 107 break;108 109 case CODE_RESULT_REQUEST:110 if (intent != null) {111 setImageToHeadView(intent);112 }113 114 break;115 }116 117 super.onActivityResult(requestCode, resultCode, intent);118 }119 120 /**121 * 裁剪原始的图片122 */123 public void cropRawPhoto(Uri uri) {124 125 Intent intent = new Intent("com.android.camera.action.CROP");126 intent.setDataAndType(uri, "image/*");127 128 // 设置裁剪129 intent.putExtra("crop", "true");130 131 // aspectX , aspectY :宽高的比例132 intent.putExtra("aspectX", 1);133 intent.putExtra("aspectY", 1);134 135 // outputX , outputY : 裁剪图片宽高136 intent.putExtra("outputX", output_X);137 intent.putExtra("outputY", output_Y);138 intent.putExtra("return-data", true);139 140 startActivityForResult(intent, CODE_RESULT_REQUEST);141 }142 143 /**144 * 提取保存裁剪之后的图片数据,并设置头像部分的View145 */146 private void setImageToHeadView(Intent intent) {147 Bundle extras = intent.getExtras();148 if (extras != null) {149 Bitmap photo = extras.getParcelable("data");150 headImage.setImageBitmap(photo);151 }152 }153 154 /**155 * 检查设备是否存在SDCard的工具方法156 */157 public static boolean hasSdcard() {158 String state = Environment.getExternalStorageState();159 if (state.equals(Environment.MEDIA_MOUNTED)) {160 // 有存储的SDCard161 return true;162 } else {163 return false;164 }165 }166 }
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:orientation="vertical" > 5 6 <ImageView 7 android:id="@+id/imageView" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content"10 android:src="@drawable/ic_launcher" />11 12 <Button13 android:id="@+id/buttonLocal"14 android:layout_width="wrap_content"15 android:layout_height="wrap_content"16 android:text="本地相册选取头像" />17 18 <Button19 android:id="@+id/buttonCamera"20 android:layout_width="wrap_content"21 android:layout_height="wrap_content"22 android:text="手机拍照选取头像" />23 24 </LinearLayout>
参考原文:http://www.open-open.com/lib/view/open1428569177447.html