一:使用原因
虽然,android系统自带裁剪图片的相关应用,但是说实话缺陷很大, 先不说界面,UI,不允许选择图片裁剪等等的诸多问
题,单单适配性贼差这一点, 就让人不得不放弃使用。特别是小米手机,华为手机要花精力去解决闪退问题,还不如自己写个裁
剪功能,或者使用相关的框架。由于项目短期时间内要解决小米手机的适配bug, 所以, 我准备使用框架的方案来解决这个问
题。
二 :相关代码
(1) 管理类:UploadImgManagr.java
public class UploadImgManagr {
public final static int CAMERA_REQUEST_CODE = 0x0101; //打开相机
public final static int ALBUM_REQUEST_CODE = 0x0102; //打开崩地突破
public final static int CROP_REQUEST_CODE = UCrop.REQUEST_CROP; //裁剪图片
private Activity context;
private static volatile UploadImgManagr instance;
private UploadImgManagr(Activity context){
this.context = context;
}
/**
* 实例化管理类 单例模式-双重校验锁
*/
public static UploadImgManagr instance(Activity context){
if (instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new UploadImgManagr(context);
}
}
}
return instance;
}
/**
* 打开本地图片
*/
public void uploadLocalPicture(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
context.startActivityForResult(intent, ALBUM_REQUEST_CODE);
}
/**
* 打开相机功能
*/
public Uri uploadCameraPicture(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String mTempPhotoPath = Environment.getExternalStorageDirectory() + File.separator + "photo.jpeg";
Uri imageUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".my.provider", new File(mTempPhotoPath));
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
context.startActivityForResult(intent, CAMERA_REQUEST_CODE);
return imageUri;
}
/**
* 裁剪图片
*/
public void toCropHandler(Uri uri, String path){
UCrop.of(uri, Uri.fromFile(new File(context.getCacheDir(),path))).withAspectRatio(1, 1).withMaxResultSize(150, 150).start(context);
}
/**
* 获取Urcp裁剪后的图片
*/
public Bitmap getCropPicture(Intent data, Bitmap defaultBitmap){
String imagePath ;
if (null != UCrop.getOutput(data) && null != (imagePath = Objects.requireNonNull(UCrop.getOutput(data)).toString())){
try {
InputStream is = new URL(imagePath).openStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
return bitmap;
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(context, "获取图片失败", Toast.LENGTH_SHORT).show();
return defaultBitmap;
}
return defaultBitmap;
}
}
(2) 集成Ucrop架构
implementation 'com.yalantis:ucrop:1.4.1'
(3) 注册 实现相机功能所需的provider和Ucrop相关Activity
<!-- 截图工具 UCrop -->
<provider
android:name=".global.GenericFileProvider"
android:authorities="${applicationId}.my.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
<activity android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Design.Light.NoActionBar"/>
(4) 创建provider和相关xml文件
public class GenericFileProvider extends FileProvider {
}
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
END