最近在做一個圖片上傳,在上傳之前需要對照片進行裁剪,遇到一個坑,在別的手機上運行都正常,在小米手機上卻遇見一個問題,選中圖片無法裁剪,直接閃退,目前已解決!之前出過問題的地方會標紅 //選擇圖片 private void choosePhotos(){ Intent intent = new Int ...
最近在做一個圖片上傳,在上傳之前需要對照片進行裁剪,遇到一個坑,在別的手機上運行都正常,在小米手機上卻遇見一個問題,選中圖片無法裁剪,直接閃退,目前已解決!之前出過問題的地方會標紅
//選擇圖片
private void choosePhotos(){
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, CHOOSE_PICTURE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CHOOSE_PICTURE:
// 對圖片進行裁剪處理
cutImage(data.getData());
break;
case CROP_SMALL_PICTURE:
if (data != null) {
try {
Bitmap head=BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile));
// 讓剛纔選擇裁剪得到的圖片顯示在界面上
setImageView (head);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
// 對圖片進行裁剪處理
protected void cutImage(Uri uri) {
//com.android.camera.action.CROP這個action是用來裁剪圖片用的
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 設置裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
//這裡不用return-data返回(稍後解釋)
//intent.putExtra("return-data", true);
uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "temp_image.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, CROP_SMALL_PICTURE);
}
//圖片回顯
private void setImageView (Bitmap bitmap){
Bitmap bitmap_bg=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bitmap_bg);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
//這裡使用了繪圖的模式的功能,PorterDuff.Mode.SRC_IN表示兩個圖層顯示重合部分上面圖層的內容
canvas.drawOval(new RectF(0,0,bitmap.getWidth(),bitmap.getHeight()),paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap,0,0,paint);
Drawable drawable =new BitmapDrawable(bitmap_bg);
//personImage是需要賦值的id
image.setImageDrawable(drawable);
}
OK!從照片庫選擇裁剪並且上傳就成功了!
若是截取小圖可以直接 intent.putExtra("return-data", true);
若是大圖可將圖片直接轉成uri進行傳遞