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;
}
}