zoukankan      html  css  js  c++  java
  • 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,这篇博客里的方法真的不错。

  • 相关阅读:
    峰哥说技术:14-Spring Boot异常处理方案源码解析与实践
    峰哥说技术:13-Spring Boot ControllerAdvice处理全局异常
    峰哥说技术:12-Spring Boot文件上传
    峰哥说技术:11-Spring Boot返回JSON
    Vant+小程序+购物车实例
    Element-ui框架Tree树形控件切换高亮显示选中效果
    Element-ui框架checkbox复选框回显
    Vue+Element-ui+DateTimePicker 日期时间选择器传值给后台
    Vue+Element+Select获取选中的对象
    Vue+Element+computed实现购物车
  • 原文地址:https://www.cnblogs.com/mauiie/p/3688629.html
Copyright © 2011-2022 走看看