Android实战Samples之相册拍照

相册拍照的功能在实际开发中是最常见的功能,我整理成图片裁剪和不裁剪,另外你还能学习自定义的PopupWindow。在我开发这块,发现网上很多demo都有选择相册大图片时有溢出的bug,我的这个sample解决了这个bug。

效果图:
Android实战Samples之相册拍照_第1张图片 
核心代码如下:
  1. /**
  2.        * 相册取照片
  3.        */
  4.       @OnClick(R.id.btn_user_album)
  5.       void albumOnClick() {
  6.           try {
  7.               // 选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
  8.               // 有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
  9.               Intent intent = new Intent();
  10.               intent.setType("image/*");
  11.               intent.setAction(Intent.ACTION_GET_CONTENT);
  12.               startActivityForResult(intent,
  13.                       AppConfig.REQUEST_CODE_USER_ALBUM);
  14.           } catch (ActivityNotFoundException e) {

  15.           }
  16.       }
  17.        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  18.         super.onActivityResult(requestCode, resultCode, data);
  19.         if (resultCode == RESULT_OK) {
  20.             /**
  21.              * 用户相册
  22.              */
  23.             if (requestCode == AppConfig.REQUEST_CODE_USER_ALBUM) {
  24.                 if (data != null) {

  25.                     // 取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意
  26.                     Uri mImageCaptureUri = data.getData();
  27.                     // 返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
  28.                     if (mImageCaptureUri != null) {

  29.                         // try {
  30.                         // // 这个方法是根据Uri获取Bitmap图片的静态方法,大图会内存溢出
  31.                         // bitmap = MediaStore.Images.Media.getBitmap(
  32.                         // this.getContentResolver(), mImageCaptureUri);
  33.                         //
  34.                         // if (bitmap != null) {
  35.                         // add_camera.setImageBitmap(bitmap);
  36.                         // }
  37.                         // // add_camera.setImageURI(mImageCaptureUri);
  38.                         //
  39.                         // } catch (Exception e) {
  40.                         // e.printStackTrace();
  41.                         // }
  42.                         getPath(mImageCaptureUri);
  43.                     } else {
  44.                         // android拍照获得图片URI为空的处理方法http://www.xuebuyuan.com/1929552.html
  45.                         // 这样做取得是缩略图,以下链接是取得原始图片
  46.                         // http://blog.csdn.net/beyond0525/article/details/8940840
  47.                         Bundle extras = data.getExtras();
  48.                         if (extras != null) {
  49.                             // 这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
  50.                             // Bitmap imageBitmap =
  51.                             // extras.getParcelable("data");
  52.                             Bitmap imageBitmap = (Bitmap) extras.get("data");
  53.                             mImageCaptureUri = Uri
  54.                                     .parse(MediaStore.Images.Media.insertImage(
  55.                                             getContentResolver(), imageBitmap,
  56.                                             null, null));

  57.                             // if (imageBitmap != null) {
  58.                             // add_camera.setImageBitmap(imageBitmap);
  59.                             // }

  60.                             getPath(mImageCaptureUri);
  61.                         }
  62.                     }

  63.                 }

  64.             }
  65.         }
  66.         }

  67.      public void getPath(Uri mImageCaptureUri) {
  68.         Cursor cursor = getContentResolver().query(mImageCaptureUri, null,
  69.                 null, null, null);
  70.         cursor.moveToFirst();
  71.         String path = cursor.getString(1); // 获取的是图片的绝对路径
  72.         imagePath = path;
  73.         cursor.close();
  74.         BitmapFactory.Options opts = new BitmapFactory.Options();
  75.         opts.inJustDecodeBounds = true;
  76.         // BitmapFactory.decodeFile(path, opts);

  77.         opts.inSampleSize = computeSampleSize(opts, -1, 128 * 128);
  78.         opts.inJustDecodeBounds = false;
  79.         try {
  80.             Bitmap bmp = BitmapFactory.decodeFile(path, opts);
  81.             imageViewShow.setImageBitmap(bmp);
  82.         } catch (OutOfMemoryError err) {
  83.         }
  84.     }

  85.     public static int computeSampleSize(BitmapFactory.Options options,
  86.                                         int minSideLength, int maxNumOfPixels) {
  87.         int initialSize = computeInitialSampleSize(options, minSideLength,
  88.                 maxNumOfPixels);

  89.         int roundedSize;
  90.         if (initialSize <= 8) {
  91.             roundedSize = 1;
  92.             while (roundedSize < initialSize) {
  93.                 roundedSize <<= 1;
  94.             }
  95.         } else {
  96.             roundedSize = (initialSize + 7) / 8 * 8;
  97.         }

  98.         return roundedSize;
  99.     }

  100.     private static int computeInitialSampleSize(BitmapFactory.Options options,
  101.                                                 int minSideLength, int maxNumOfPixels) {
  102.         double w = options.outWidth;
  103.         double h = options.outHeight;

  104.         int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
  105.                 .sqrt(w * h / maxNumOfPixels));
  106.         int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
  107.                 Math.floor(w / minSideLength), Math.floor(h / minSideLength));

  108.         if (upperBound < lowerBound) {
  109.             // return the larger one when there is no overlapping zone.
  110.             return lowerBound;
  111.         }

  112.         if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
  113.             return 1;
  114.         } else if (minSideLength == -1) {
  115.             return lowerBound;
  116.         } else {
  117.             return upperBound;
  118.         }
  119.     }
复制代码
源码:

本帖隐藏的内容

https://github.com/WuXiaolong/AndroidSamples


详见博客 http://wuxiaolong.me/android/2014/11/10/Android-Samples-Photograph/

你可能感兴趣的:(Android实战Samples之相册拍照)