拍照或从相册中选择


1.Dialog布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:gravity="center"
    android:minWidth="180dp"
    android:orientation="vertical"
    android:padding="10dp" >

    <Button
        android:id="@+id/from_camera"
        style="@style/TextStyleFlowTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_item_selector"
        android:padding="12dp"
        android:text="拍照" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:background="@color/divider" />

    <Button
        android:id="@+id/from_gallery"
        style="@style/TextStyleFlowTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_item_selector"
        android:padding="12dp"
        android:text="从相册中选择" />

</LinearLayout>


2.Dialog方法

	/**
	 * 选择头像设置是从拍照还是相册中选
	 */
	private void showDialog() {
		final Dialog dialog = new Dialog(this, R.style.dialog);
		LayoutInflater inflater = LayoutInflater.from(this);
		View view = inflater.inflate(R.layout.view_photoselect, null);
		dialog.setContentView(view);
		// 拍照
		view.findViewById(R.id.from_camera).setOnClickListener(
				new View.OnClickListener() {

					@Override
					public void onClick(View arg0) {
						formCamera();
						dialog.dismiss();
					}
				});
		// 从相册中选择
		view.findViewById(R.id.from_gallery).setOnClickListener(
				new View.OnClickListener() {

					@Override
					public void onClick(View arg0) {
						formGallerya();
						dialog.dismiss();
					}
				});
		dialog.show();
	}

	/**
	 * 拍照
	 */
	private void formCamera() {
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		tmp = System.currentTimeMillis() + ".jpg";
		File file = new File(Utils.SD_IMAGES_PATH + tmp);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
		startActivityForResult(intent, CODE_CAPTURE);
	}

	/**
	 * 照片中选择
	 */
	private void formGallerya() {
		Intent intent = new Intent(Intent.ACTION_PICK,
				android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
				"image/*");
		startActivityForResult(intent, CODE_GALLERY);
	}


3.回调处理

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		// 拍照返回图片
		if (requestCode == CODE_CAPTURE) {
			if (resultCode == RESULT_OK) {
				mPhoto = Utils.SD_IMAGES_PATH + tmp;
				mPhotoHandler.sendMessage(mPhotoHandler.obtainMessage(0,
						"保存照片到" + mPhoto));
			} else {
				showToast("拍照失败,请选择相册", Toast.LENGTH_SHORT);
			}
		}
		if (requestCode == CODE_GALLERY) {
			if (resultCode == RESULT_OK) {
				String path = dealPhotoFile(data);
				if (Utils.isEmpty(path)) {
					showToast("获取图片失败,请选择拍照", Toast.LENGTH_SHORT);
				} else {
					mPhoto = path;
					mPhotoHandler.sendMessage(mPhotoHandler.obtainMessage(0,
							"获取图片" + mPhoto));
				}
			} else {
				showToast("获取图片失败,请选择拍照", Toast.LENGTH_SHORT);
			}
		}
	}

	private String dealPhotoFile(final Intent data) {
		String path = null;
		if (data != null) {
			Uri uri = data.getData();
			if (uri != null) {
				path = uri.getPath();
				if (new File(path).exists()) {
					return path;
				}
			}
			String[] proj = { MediaStore.Images.Media.DATA };
			Cursor actualimagecursor = TaskDetailActivity.this.managedQuery(
					uri, proj, null, null, null);
			if (actualimagecursor != null) {
				int actual_image_column_index = actualimagecursor
						.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
				if (actualimagecursor.moveToFirst()) {
					path = actualimagecursor
							.getString(actual_image_column_index);
					if (new File(path).exists()) {
						return path;
					}
				}
			}
		}
		return path;
	}




PS:

在创建bitmap过程中,某些手机会导致创建失败,图片过大

			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inPreferredConfig = Bitmap.Config.RGB_565;
			options.inPurgeable = true;
			options.inInputShareable = true;
			options.inJustDecodeBounds = false;
			bmp = BitmapFactory.decodeFile(localImagePath, options);


对展示的图片进行大小压缩

	public static Bitmap getBitmapFromFile(File dst, int width, int height) {
		if (null != dst && dst.exists()) {
			BitmapFactory.Options opts = null;
			opts = new BitmapFactory.Options();
			if (width > 0 && height > 0) {
				opts.inJustDecodeBounds = true;
				BitmapFactory.decodeFile(dst.getPath(), opts);
				// 计算图片缩放比例
				final int minSideLength = Math.min(width, height);
				opts.inSampleSize = computeSampleSize(opts, minSideLength,
						width * height);
			}
			opts.inPreferredConfig = Bitmap.Config.RGB_565;
			opts.inJustDecodeBounds = false;
			opts.inInputShareable = true;
			opts.inPurgeable = true;
			try {
				return BitmapFactory.decodeFile(dst.getPath(), opts);
			} catch (Exception e) {
				e.printStackTrace();
			} catch (OutOfMemoryError e) {
				e.printStackTrace();
			}
		}
		return null;
	}

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

		int roundedSize;
		if (initialSize <= 8) {
			roundedSize = 1;
			while (roundedSize < initialSize) {
				roundedSize <<= 1;
			}
		} else {
			roundedSize = (initialSize + 7) / 8 * 8;
		}

		return roundedSize;
	}

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

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

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

		if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
			return 1;
		} else if (minSideLength == -1) {
			return lowerBound;
		} else {
			return upperBound;
		}
	}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值