UCrop图片裁剪框架

项目开源地址

1.添加依赖

	implementation 'com.github.yalantis:ucrop:2.2.3'-轻型通用解决方案
	
	implementation 'com.github.yalantis:ucrop:2.2.3-native'-获得本地代码的强大功能,以保持图像质量(+1.5MB到apk大小)

2.将UCropActivity添加到AndroidManifest.xml中

    <activity
        android:name="com.yalantis.ucrop.UCropActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

3.配置权限

	 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  	 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

4.创建启动裁剪方法

	 private void startCrop(Uri uri){
	        UCrop.of(uri, Uri.fromFile(new File(getCacheDir()+"/uCrop.jpg")))
	                .withAspectRatio(16, 16)
	                .withMaxResultSize(128, 128)
	                .start(this);
	
	    }

5.重写onActivityResult方法并处理uCrop结果

       @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode){
                case UCrop.REQUEST_CROP:
                    Uri resultUri = UCrop.getOutput(data);
                    break;
                case UCrop.RESULT_ERROR:
                    Throwable cropError = UCrop.getError(data);
                    break;
            }
        }

6.混淆配置

	-dontwarn com.yalantis.ucrop**
	-keep class com.yalantis.ucrop** { *; }
	-keep interface com.yalantis.ucrop** { *; }

7.注意:

destinationUri :是裁剪后图片的保存路径,裁剪后返回的Uri结果也是它

UCrop.of(sourceUri, destinationUri)
    .withAspectRatio(16, 9)
    .withMaxResultSize(maxWidth, maxHeight)
    .start(context);

8.必看!!!!(开源项目有些问题)

如果点击这个按钮,会造成当前活动的崩溃

在这里插入图片描述

原因:onActivityResult方法data回传为null。

看一下UCrop.getError(data)源码:

可以看到result.getSerializableExtra(EXTRA_ERROR),result为空,所以有个空指针异常。捕获一下就行了。
在这里插入图片描述
UCrop.getOutput(data)同理
在这里插入图片描述

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
            final Uri resultUri = UCrop.getOutput(data);
        } else if (resultCode == UCrop.RESULT_ERROR) {
            final Throwable cropError = UCrop.getError(data);
        }
    }

更多信息请参考开源项目

项目开源地址

发布了15 篇原创文章 · 获赞 5 · 访问量 1156

猜你喜欢

转载自blog.csdn.net/jsupoker/article/details/98035719
今日推荐