记录一下api的使用。
拍照
步骤:
-
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <!--可能还要其他权限如写,麦克风-->
-
动态申请
private void goTackPhoto() { String[] permissions = {Manifest.permission.CAMERA}; if (!PermissionUtil.hasPermissions(this, permissions)) { requestPermission(permissions, PermissionUtil.STORY_REQUEST_CODE); } else { taskPhoto(); } }
private void requestPermission(String[] permissions, int code) { if (!PermissionUtil.hasPermissions(this, permissions)) { if (PermissionUtil.shouldShowRequestPage(this, permissions)) { Uri packageURI = Uri.parse("package:" + this.getPackageName()); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI); startActivity(intent); } else { ActivityCompat.requestPermissions(this, permissions, code); } } else { ActivityCompat.requestPermissions(this, permissions, PermissionUtil.STORY_REQUEST_CODE); } }
//申请后的回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case PermissionUtil.STORY_REQUEST_CODE: if (grantResults.length > 0) { if (!PermissionUtil.hasAllPermission(grantResults)) { //TODO } else { taskPhoto(); } } break; default: break; } }
-
调用
private void taskPhoto() { File outputImage = new File(Environment.getExternalStorageState(), System.nanoTime() + IMAGE_SUFFIX); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { Log.e(TAG, "taskPhoto: " + e.toString()); } //添加这3行后可以调用摄像头,但是不懂什么原理 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); mImageUri = Uri.fromFile(outputImage);//这个 Uri 对象标识着 output_image.jpg 这张图片的唯一地址 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);//指定图片的输出地址 startActivityForResult(intent, TAKE_PHOTO); // 启动相机程序 }
-
拍照后的回调处理
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); MediaBean.MediaType mediaType = MediaBean.MediaType.IMAGE;//自定义的javabean if (resultCode == RESULT_OK) { switch (requestCode) { case TAKE_PHOTO: Log.d(TAG, "老的获取到选择的图片=" + mFileUri); if (data != null) { mFileUri = data.getData(); Log.d(TAG, "修改获取到选择的图片=" + mFileUri); } if (mCloseBinder != null) { mCloseBinder.close(); } Intent intent = new Intent(MainActivity.this, CloseService.class); stopService(intent); mShouldDeleteImage = false; break; case TACK_VIDEO: if (data != null) { mFileUri = data.getData(); mediaType = MediaBean.MediaType.VIDEO; Log.d(TAG, "获取到选择的视频=" + mFileUri);//??? } break; case SELECT_PIC: if (data != null) { mFileUri = data.getData(); if (!isImageType(mFileUri)) { mediaType = MediaBean.MediaType.VIDEO; } Log.d(TAG, "获取到选择的图片2=" + mFileUri); } break; case SELECT_VIDEO: if (data != null) { mFileUri = data.getData(); mediaType = MediaBean.MediaType.VIDEO; Log.d(TAG, "获取到选择的视屏2=" + mFileUri); } break; default: break; } } }
拍视频
步骤:
-
权限申请
-
调用
private void takeVideo() { File outputVideo = new File(Environment.getExternalStorageState(), System.nanoTime() + VIDEO_SUFFIX); mFileUri = getMediaFileUri(outputVideo); Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); startActivityForResult(intent, TACK_VIDEO); }
-
回调接收
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case TAKE_PHOTO: if (data != null) { mFileUri = data.getData(); Log.d(TAG, "获取到选择的视频=" + mFileUri);//??? } break; } default:break; } }
调用相册选择
步骤:
-
申请读取权限
-
使用
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, SELECT_PIC);
-
回调
调用视频选择
步骤1、3同上。
private void selectVideo() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("video/*");
startActivityForResult(intent, SELECT_VIDEO);
}
获取视频第一帧
private Bitmap getVideoThumb() {
Bitmap bm;
MediaMetadataRetriever media = new MediaMetadataRetriever();
//mFileUri为视频文件的uri
media.setDataSource(MainActivity.this, mFileUri);
bm = media.getFrameAtTime();
return bm;
}
// setDataSource()有多个重载方法,调用setDataSource(String path)可能会出问题,不同的机型在调用不同的方法也可能会出问题。