1.权限申请参考https://blog.csdn.net/chailongger/article/details/104833783
2.
private static final int TAKEVIDEO_FORESULT = 1001;
private String videoPath;//视频保存后的路径
/**
* 调用相机录像
*/
private void takeVideo(){
Intent intent=new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
Uri fileUri;
try {
//fileUri=Uri.fromFile(createMediaFile());如果这样写会报错
fileUri= FileProvider.getUriForFile(getContext(),getActivity().getApplicationContext().getPackageName() + ".provider",createMediaFile());//这是正确的写法
intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
Logs.i("fileUri "+fileUri.toString());
Logs.i("打开录像机");
} catch (IOException e) {
e.printStackTrace();
}
//质量
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);
//限制时长
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 5);
//限制大小
intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024*1024*20L);
startActivityForResult(intent,TAKEVIDEO_FORESULT);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == TAKEVIDEO_FORESULT && resultCode == -1){//resultCode == 0 时表示取消
Logs.i("调用相机录像并保存");
if(videoPath != null){
Logs.i("videoPath "+videoPath);
//生成视频的缩略图
Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND);
videoPath = videoPath.replace("/storage/emulated/0","");
videoPath = videoPath.replace("Video","Camera");
videoPath = videoPath.replace(".mp4",".jpg");
Logs.i("filepath " +videoPath);
File file = ConvertUtil.compressImage(bitmap,videoPath);
getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
ImageItem imageItem = new ImageItem();
imageItem.path = Environment.getExternalStorageDirectory()+videoPath;
selImageList.add(imageItem);
adapter.setImages(selImageList);
}
}
//创建并保存视频的方法
private File createMediaFile() throws IOException {
if(checkSDCardAvaliable()) {
if ((Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))) {
// 选择自己的文件夹
String path = Environment.getExternalStorageDirectory().getPath() + "/DCIM/Video/";
File mediaStorageDir = new File(path);
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Logs.i("文件夹创建失败");
return null;
}
}
// 文件根据当前的时间给自己命名
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA);
String imageFileName = "VID_" + dateFormat.format(new Date(System.currentTimeMillis()));
String suffix = ".mp4";
Logs.i("path "+mediaStorageDir + File.separator + imageFileName + suffix);
videoPath = mediaStorageDir + File.separator + imageFileName + suffix;
File mediaFile = new File(mediaStorageDir + File.separator + imageFileName + suffix);
return mediaFile;
}
}
return null;
}
/**
* 检查sd卡是否可用
*
* @return
*/
public static boolean checkSDCardAvaliable() {
if (Environment.getExternalStorageState() == Environment.MEDIA_REMOVED) {
return false;
}
return true;
}
转换工具类
/**
* 转换工具类
* 1. string转成bitmap
* 2. bitmap转file
*/
public class ConvertUtil {
/** * string转成bitmap * * @param st */
public static Bitmap convertStringToIcon(String st) {
Bitmap bitmap = null;
try {
// out = new FileOutputStream("/sdcard/aa.jpg");
byte[] bitmapArray;
bitmapArray = Base64.decode(st, Base64.DEFAULT);
bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
// bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
return bitmap;
} catch (Exception e) { return null; }
}
public static File compressImage(Bitmap bitmap,String filepath) {
//将要保存图片的路径filepath
File file = new File(Environment.getExternalStorageDirectory(), filepath);
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
// uploadPic(file);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
}
在applicationmanifest中添加fileprovider,android6.0以后读取或保存文件时需要用fileProvider进行转换。
<application>
<provider
android:authorities="${applicationId}.provider"
android:name="android.support.v4.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths">
</meta-data>
</provider>
</application>
provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--<external-path name="external_files" path="."/>-->
<!-- 物理路径为Context.getFilesDir() + /files/* -->
<files-path path="." name="files" />
<!-- 物理路径为Context.getCacheDir() + /files/* -->
<cache-path path="." name="cache" />
<!-- 物理路径为Environment.getExternalStorageDirectory() + /files/* -->
<external-path path="." name="external" />
<!-- 物理路径为Context.getExternalFilesDir(String) + /files/* -->
<external-files-path path="." name="externalfiles"/>
<!-- 物理路径为Context.getExternalCacheDir() + /files/* -->
<external-cache-path path="." name="externalcache"/>
<!-- 物理路径为`Context.getExternalMediaDirs() + /files/*, 要求API21+ -->
<external-media-path name="." path="files" />
</paths>