前言,版本兼容问题主要是由于4.4以前和4.4以后的Uri的格式不同所造成的错误
资料 Android 4.4从图库选择图片,获取图片路径并裁剪
1.拍照 和选择图片
①选择图片
1 intent = new Intent(Intent.ACTION_GET_CONTENT); 2 intent.setType("image/*"); 3 startActivityForResult(intent, GALLERY_REQUEST_CODE);
②拍照
1 intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 2 startActivityForResult(intent, CAMERA_REQUEST_CODE);
2.获取系统传来的值
1 标记符 2 private static int CAMERA_REQUEST_CODE = 1; 3 private static int GALLERY_REQUEST_CODE = 2; 4 private static int CROP_REQUEST_CODE = 3; 5 6 7 8 @Override 9 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 10 if (requestCode == CAMERA_REQUEST_CODE) { 11 if (data == null) { 12 return; 13 } else { //拍照 14 Bundle extras = data.getExtras(); 15 if (extras != null) { 16 Bitmap bm = extras.getParcelable("data"); 17 Uri uri = saveBitmap(bm); 18 startImageZoom(uri); 19 } 20 } 21 } else if (requestCode == GALLERY_REQUEST_CODE) { 22 if (data == null) {//相册 23 return; 24 } 25 Uri uri; 26 uri = data.getData(); 27 Uri fileUri = convertUri(uri); 28 startImageZoom(fileUri); 29 } else if (requestCode == CROP_REQUEST_CODE) { 30 if (data == null) { 31 return; 32 }//剪裁后的图片 33 Bundle extras = data.getExtras(); 34 if (extras == null) { 35 return; 36 } 37 Bitmap bm = extras.getParcelable("data"); 38 ShowImageView(bm); 39 } 40 }
3.图片选取后 根据Url 转成流 并保存
private Uri convertUri(Uri uri) { InputStream is = null; try { is = getContentResolver().openInputStream(uri); Bitmap bitmap = BitmapFactory.decodeStream(is); is.close(); return saveBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } }
4.保存图片 记得加权限
1 private Uri saveBitmap(Bitmap bm) { 2 File tmpDir = new File(Environment.getExternalStorageDirectory() 3 + "/xiaoxin"); 4 if (!tmpDir.exists()) { 5 tmpDir.mkdir(); 6 } 7 File img = new File(tmpDir.getAbsolutePath() + "love.png"); 8 try { 9 FileOutputStream fos = new FileOutputStream(img); 10 bm.compress(Bitmap.CompressFormat.PNG, 85, fos); 11 fos.flush(); 12 fos.close(); 13 Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_SHORT).show(); 14 return Uri.fromFile(img); 15 } catch (FileNotFoundException e) { 16 Toast.makeText(MainActivity.this, "失敗了", Toast.LENGTH_SHORT).show(); 17 e.printStackTrace(); 18 return null; 19 } catch (IOException e) { 20 e.printStackTrace(); 21 Toast.makeText(MainActivity.this, "失敗了", Toast.LENGTH_SHORT).show(); 22 return null; 23 } 24 25 }
5.剪裁图片
1 /** 2 * 剪裁图片 3 * 4 * @param uri 5 */ 6 private void startImageZoom(Uri uri) { 7 Intent intent = new Intent("com.android.camera.action.CROP"); 8 intent.setDataAndType(uri, "image/*"); 9 intent.putExtra("crop", "true"); 10 intent.putExtra("aspectX", 1); 11 intent.putExtra("aspectY", 1); 12 intent.putExtra("outputX", 150); 13 intent.putExtra("outputY", 150); 14 intent.putExtra("return-data", true); 15 startActivityForResult(intent, CROP_REQUEST_CODE); 16 }