Android 拍照、相册选图、裁剪上传

最近项目中用到的类似于微博个人中心那样的头像上传功能,对于我这样的小白来说仍然搞了两天才弄好,就拿出来放在这里,留着自己慢慢看。

首先机制没得说,仍然是使用Intent老套的调用系统的相机、相册、裁剪板

相机:

intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(sdcardTempFile)); 
startActivityForResult(intent, PHOTOGRAPH);

这里改变了照片的存储路径,

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(sdcardTempFile)); 

也可以不改变,此处这样是为了得到真实的照片而不是Bitmap处理过的缩略图,项目需求是上传的图片大小进行了限定。
在不改变路径的情况下,在onActivityResult回调函数中的data,中可获得返回值,返回的是Bitmap.

想到得到原照片的方法不止这改变存储位置在获取这一种方法,方法有很多种,我就用到了这一种。

此外还在不改变照片存储路径的情况下获得拍摄的照片对其编辑,展示。
可以用系统默认有媒体库,你用ContentResolver Cursor查询,随便取一条图片途径,然后截取即可。

这里有个小例子
 1 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 2         
 3         switch (requestCode) {
 4         case 1:
 5             Uri imgUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
 6             ContentResolver cr = CutActivity.this
 7                     .getContentResolver();
 8 
 9             Uri fileUri = Uri.fromFile(mCurrentPhotoFile);
10             sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
11                     fileUri));
12             try {
13                 Thread.sleep(3000);
14             } catch (InterruptedException e) {
15                 e.printStackTrace();
16             }
17             Cursor cursor = cr
18                     .query(imgUri, null,
19                             MediaStore.Images.Media.DISPLAY_NAME + "='"
20                                     + mCurrentPhotoFile.getName() + "'",
21                             null, null);
22             Uri uri = null;
23             if (cursor != null && cursor.getCount() > 0) {
24                 cursor.moveToLast();
25                 long id = cursor.getLong(0);
26                 uri = ContentUris.withAppendedId(imgUri, id);
27             }
28             final Intent intent = new Intent(
29                     "com.android.camera.action.CROP");
30             intent.setDataAndType(uri, "image/*");
31             intent.putExtra("crop", "true");
32             intent.putExtra("outputX", 380);
33             intent.putExtra("outputY", 500);
34             intent.putExtra("return-data", true);
35             CutActivity.this.startActivityForResult(intent, 3);
36             break;
37         case 2:
38             break;
39         case 3:
40             if (data != null) {
41                 cameraBitmap = (Bitmap) data.getExtras().get("data");
42                 imageView.setImageBitmap(cameraBitmap);
43             }
44             break;
45         default:
46             break;
47         }
48         super.onActivityResult(requestCode, resultCode, data);
49     }




相册:

1                 intent =  new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);   
2                 intent.setType("image/*"); 
3                 intent.putExtra("output", Uri.fromFile(sdcardTempFile));
4                 intent.putExtra("crop", "true");
5                 intent.putExtra("aspectX", 1);
6                 intent.putExtra("aspectY", 1);
7                 intent.putExtra("outputX", 180);
8                 intent.putExtra("outputY", 180);
9                 startActivityForResult(intent, ABLUM);  

裁剪板:

 1 Intent intent = new Intent("com.android.camera.action.CROP");
 2         intent.setDataAndType(uri, "image/*");
 3         intent.putExtra("crop", "true");
 4         intent.putExtra("aspectX", 1);
 5         intent.putExtra("aspectY", 1);
 6         intent.putExtra("scal", true);
 7         intent.putExtra("outputY",200);
 8         intent.putExtra("outputX",200);
 9         intent.putExtra("output", Uri.fromFile(sdcardTempFile));
10         intent.putExtra("return-data", false);
11         startActivityForResult(intent,RETURNPHOTO);

在onActivityResult回调中,分别对想得到的数据进行,存储展示就可以了。

在这里还用到了自定义样式的Dialog,这个真的很方便,本来我是想用popupWindow的,但是popupWindow的细节不好掌握,这里用用了自己定义样式的Dialog。

http://www.cnblogs.com/and_he/archive/2011/09/16/2178716.html,这篇博客里的方法真的不错。

原文地址:https://www.cnblogs.com/mauiie/p/3688629.html