注意事项
进行相册、拍照、裁剪操作时需要检查是否申请了如下权限,注意6.0的动态权限申请,并且检查是否注册了FileProvider
app/src/main/AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<provider
android:name="android.support.v4.content.FileProvider4Util"
android:authorities="${applicationId}.utilcode.provider"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/util_code_provider_paths" />
</provider>
xml/filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path path="" name="external_files" />
</paths>
从相册中选择图片
启动系统相册
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
获取系统相册返回的图片路径
public static String getImagePath(Context context, Intent data){
String imagePath = null;
Uri uri = data.getData();
if(Build.VERSION.SDK_INT >= 19){
if(DocumentsContract.isDocumentUri(context,uri)){
String docId = DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())){
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID+"="+id;
imagePath = getImagePath(context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
imagePath = getImagePath(context,contentUri,null);
}
}else if("content".equalsIgnoreCase(uri.getScheme())){
imagePath = getImagePath(context,uri,null);
}else if("file".equalsIgnoreCase(uri.getScheme())){
imagePath = uri.getPath();
}
}else{
uri= data.getData();
imagePath = getImagePath(context,uri,null);
}
return imagePath;
}
private static String getImagePath(Context context, Uri uri, String selection) {
String path = null;
Cursor cursor = context.getContentResolver().query(uri,null,selection,null,null);
if(cursor != null){
if(cursor.moveToFirst()){
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
拍照
启动系统相机,并且传入照片的保存路径
File f = new File(path);//这里传入你自己的照片的保存路径
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, UriUtils.file2Uri(f));
startActivityForResult(intent, CAMERA_WITH_DATA);
public static Uri file2Uri(final File file) {
if (file == null) return null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//这里改成你自己的FileProvider
String authority = Utils.getApp().getPackageName() + ".utilcode.provider";
return FileProvider.getUriForFile(Utils.getApp(), authority, file);
} else {
return Uri.fromFile(file);
}
}
等到系统相机拍照返回成功时,直接拿传入的照片的保存路径即可
裁剪
启动系统裁剪,并且传入要裁剪的文件路径和裁剪完成后的图片的保存路径
File f = new File(path);//这里传入你自己的要裁剪的图片路径
File cropFile = new File(Environment.getExternalStorageDirectory()+File.separator+Environment
.DIRECTORY_DCIM,"crop.jpg");//这里传入你自己的裁剪完成后的图片的保存路径
Uri uri = UriUtils.file2Uri(f)
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//需要加上这两句话 : uri 权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", ICON_SIZE);
intent.putExtra("outputY", ICON_SIZE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cropFile));
startActivityForResult(intent, PHOTO_CROP_RESOULT);
等到系统裁剪完成返回成功时,直接拿传入的裁剪完成后的图片的路径即可
裁剪用到的参数意义如下所示
附加选项 | 数据类型 | 描述 |
---|---|---|
crop | String | 发送裁剪信号,“true”表示启用裁剪 |
aspectX | int | X方向比例 |
aspectY | int | Y方向比例 |
outputX | int | 裁剪区的宽 |
outputY | int | 裁剪区的高 |
scale | boolean | 是否保留比例 |
return-data | boolean | 是否将裁剪数据保留在Bitmap中返回 |
data | Parcelable | 需要裁剪的Bitmap数据 |
circleCrop | boolean | 是否圆形裁剪区域 |
MediaStore.EXTRA_OUTPUT | URI | 裁剪数据输出位置 |