android中 拍照 视频 录音 显示缩略图

22 篇文章 0 订阅
1 篇文章 0 订阅

1、拍照

/**
	 * 处理拍照录音 视频的点击事件
	 * 
	 * @author 00
	 */
	class MyOnClickLitener implements OnClickListener {
		@Override
		public void onClick(View v) {
			//申明意图对象
			Intent intent = null;
			//申明文件要保存的位置
			File dir = null;
			switch (v.getId()) {
			case R.id.id_btn_take_photo:
				//初始化文件保存位置的对象
				dir = new File(SDCardUtils.getRootDirectory()+ "/gdmsaec/picture/");
				if (!dir.exists()) {
					//如果文件夹不存在 则创建
					dir.mkdirs();
				}
				//创建要保存的文件
				photoFile = new File(dir.getAbsolutePath(), "IMG_"+ DateFormatUtils.getPVAFormatDate() + ".jpg");
				// 打开系统相机
				intent = new Intent();
				//此句代码 代表拍照成功之后 直接保存拍照之后的图片到sdcad中的文件中 这样文件的质量是最好的 最清晰的
				intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));
				//设置打开系统相机的意图action
				intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
				//打开相机
				startActivityForResult(intent, Constants.OPEN_CAMERA);
				break;

			case R.id.id_btn_aideo:// 录音
				intent = new Intent();
				//设置打开录音的意图action
				intent.setAction(Media.RECORD_SOUND_ACTION);
				startActivityForResult(intent, Constants.OPEN_AIDEO);
				break;
			case R.id.id_btn_video:// 视频
				//申明视频文件需要保存的文件夹
				dir = new File(SDCardUtils.getRootDirectory()+ "/gdmsaec/video/");
				if (!dir.exists()) {
					dir.mkdirs();
				}
				intent = new Intent();
				//初始化视频文件的名字
				videoFile = new File(dir.getAbsoluteFile(), "VID_"+ DateFormatUtils.getPVAFormatDate() + ".3gp");
				//此句代码 标识  视频录制成功后 直接保存到手机sdcrad中 以上面声明的文件名 命名
				intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(videoFile));
				//设置打开视频录制的action
				intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
				startActivityForResult(intent, Constants.OPEN_VIDEO);
				break;
			case R.id.id_btn_upload:
				// 打开系统相册
				intent = new Intent();
				//过滤 选择的相册是所有类型的
				intent.setType("image/*");
				//设置action
				intent.setAction(Intent.ACTION_GET_CONTENT);
				startActivityForResult(intent, Constants.OPEN_XIANGCE);
				break;
			}
		}
	}


 

2、拍照 视频 录音 成功时候的调用的方法

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		//当用户拍照  录音 视频 完成之后调用此方法
		//这里说明一下 如果之前在启动是设置 intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));那么这里的data是获取不到返回的值得
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == Activity.RESULT_OK) {
			switch (requestCode) {
			case CAMERA:
				cameraPopupWindow.dismiss();
				alertDialog(0,"拍照成功,是否上传至服务器?", photoFile);
				break;
			case VIDEO:
				cameraPopupWindow.dismiss();
				alertDialog(1,"录制成功,是否上传至服务器?", videoFile);
				break;
			case AUDIO://录音文件需要特殊处理一下
				Uri audioUri = data.getData();
				// String aa = Util.getPath(this, audioUri);
				// File fileAudio = new File(aa);
				// fileAudio.delete();
				try {
					AssetFileDescriptor descriptor = getContentResolver().openAssetFileDescriptor(audioUri, "r");
					FileInputStream fis = descriptor.createInputStream();
					File path = new File(SDCardUtils.getRootDirectory()+ "/gdmsaec/aideo/");
					if (!path.exists()) {
						path.mkdirs();
					}
					audioFile = new File(path.getAbsolutePath(), "AID_"+ DateFormatUtils.getPVAFormatDate() + ".amr");
					FileOutputStream fos = new FileOutputStream(audioFile);
					byte[] buffer = new byte[1024];
					int len = 0;
					while ((len = (fis.read(buffer))) != -1) {
						fos.write(buffer, 0, len);
					}
					fis.close();
					fos.close();
				} catch (Exception e) {
					//ToastUtils.showToast(mainActivity, e.getMessage());
				}
				cameraPopupWindow.dismiss();
				alertDialog(2,"录制成功,是否上传至服务器?", audioFile);
				break;
			case XIANGCE:
				cameraPopupWindow.dismiss();
				Uri uri = data.getData();
				String path = Util.getPath(this, uri);
				photoFile = new File(path);
				// Bitmap bitmap = BitmapFactory.decodeFile(path);
				alertDialog(3,"照片已选中,是否上传至服务器?", photoFile);
				break;
        }
    }
}

 

3、对话框提示

/**
	 * 弹出是否上传文件的对话框
	 * 
	 * @param str
	 */
	private void alertDialog(int i , String str, final File file) {
		Bitmap bitmap =null;
		if(i == 0){
			//拍照 获取缩略图
			bitmap = BitmapUtils.getImageThumbnail(file.getAbsolutePath(), 200, 200);
		}else if(i == 1){
			//获取视频的缩略图
			bitmap = BitmapUtils.getVideoThumbnail(file.getAbsolutePath(), 200, 200, Thumbnails.MINI_KIND);
		}
		DialogUtils.showDialog2(mainActivity, "温馨提示", bitmap, str,new DialogOnClickListenner() {
			@Override
			public void btnConfirmClick(Dialog dialog) {
				dialog.dismiss();
				uploadFile(file);
			}

			@Override
			public void btnCancelClick(Dialog dialog) {
				dialog.dismiss();
			}
		});
	}


 

4、获取缩略图的工具类

public class BitmapUtils {

	/**
	 * 根据指定的图像路径和大小来获取缩略图 此方法有两点好处: 1.
	 * 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,
	 * 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。 2.
	 * 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使 用这个工具生成的图像不会被拉伸。
	 * 
	 * @param imagePath
	 *            图像的路径
	 * @param width
	 *            指定输出图像的宽度
	 * @param height
	 *            指定输出图像的高度
	 * @return 生成的缩略图
	 */
	public static Bitmap getImageThumbnail(String imagePath, int width,
			int height) {
		Bitmap bitmap = null;
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		// 获取这个图片的宽和高,注意此处的bitmap为null
		bitmap = BitmapFactory.decodeFile(imagePath, options);
		options.inJustDecodeBounds = false; // 设为 false
		// 计算缩放比
		int h = options.outHeight;
		int w = options.outWidth;
		int beWidth = w / width;
		int beHeight = h / height;
		int be = 1;
		if (beWidth < beHeight) {
			be = beWidth;
		} else {
			be = beHeight;
		}
		if (be <= 0) {
			be = 1;
		}
		options.inSampleSize = be;
		// 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
		bitmap = BitmapFactory.decodeFile(imagePath, options);
		// 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
		bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
				ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
		return bitmap;
	}

	/**
	 * 获取视频的缩略图 先通过ThumbnailUtils来创建一个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。
	 * 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。
	 * 
	 * @param videoPath
	 *            视频的路径
	 * @param width
	 *            指定输出视频缩略图的宽度
	 * @param height
	 *            指定输出视频缩略图的高度度
	 * @param kind
	 *            参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。
	 *            其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
	 * @return 指定大小的视频缩略图
	 */
	public static Bitmap getVideoThumbnail(String videoPath, int width, int height,
			int kind) {
		Bitmap bitmap = null;
		// 获取视频的缩略图
		bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
		System.out.println("w" + bitmap.getWidth());
		System.out.println("h" + bitmap.getHeight());
		bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
				ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
		return bitmap;
	}
}



 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值