Andriod相册、拍照、裁剪总结

注意事项

进行相册、拍照、裁剪操作时需要检查是否申请了如下权限,注意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);

等到系统裁剪完成返回成功时,直接拿传入的裁剪完成后的图片的路径即可
裁剪用到的参数意义如下所示

附加选项数据类型描述
cropString发送裁剪信号,“true”表示启用裁剪
aspectXintX方向比例
aspectYintY方向比例
outputXint裁剪区的宽
outputYint裁剪区的高
scaleboolean是否保留比例
return-databoolean是否将裁剪数据保留在Bitmap中返回
dataParcelable需要裁剪的Bitmap数据
circleCropboolean是否圆形裁剪区域
MediaStore.EXTRA_OUTPUTURI裁剪数据输出位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值