android 无法调用相册图片进行裁剪

来源:互联网 发布:知乎日报年度吐槽精选 编辑:程序博客网 时间:2024/06/05 11:35
/* 这里出现问题: 三星手机上调用相册进行剪裁失败主要是4.4,如果使用上面pick的原生方法来选图,返回的uri还是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri4.3是完全不一样的,4.3返回的是带文件路径的,4.4返回的却是content://com.android.providers.media.documents/document/image:3951这样的,没有路径,只有图片编号的uri.这就导致接下来无法根据图片路径来裁剪的步骤了.* */public class MainActivity extends Activity {   private ImageView imageView;   private Button clickBtnLocal;   private Button clickBtnCamera;   private Uri photoUri;   private final int PIC_FROM_CAMERA = 1;   private final int PIC_FROM_LOCALPHOTO = 0;   @Override   protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_main);      imageView = (ImageView) findViewById(R.id.image);      clickBtnLocal = (Button) findViewById(R.id.click_local);      clickBtnCamera = (Button) findViewById(R.id.click_camera);      //本地选择      clickBtnLocal.setOnClickListener(new View.OnClickListener()       {         @Override         public void onClick(View v)          {            doHandlerPhoto(PIC_FROM_LOCALPHOTO);// 从相册中去获取         }      });      //拍照      clickBtnCamera.setOnClickListener(new View.OnClickListener()      {         @Override         public void onClick(View v)          {            doHandlerPhoto(PIC_FROM_CAMERA);// 用户点击了从照相机获取         }      });   }   /**    * 根据不同方式选择图片设置ImageView    * @param type 0-本地相册选择,非0为拍照    */   private void doHandlerPhoto(int type)   {      try      {         //sd卡根目录         File pictureFileDir = new File(Environment.getExternalStorageDirectory(), "/upload");         // 文件夹不存在就创建         if (!pictureFileDir.exists()) {            pictureFileDir.mkdirs();         }         // 将此图片存放于sdupload文件夹下         File picFile = new File(pictureFileDir, "upload.jpeg");         // 文件不存在就创建         if (!picFile.exists()) {            picFile.createNewFile();         }         // photoUri标识着图片地址         photoUri = Uri.fromFile(picFile);                  if (type==PIC_FROM_LOCALPHOTO)         {            Intent intent = getCropImageIntent();            startActivityForResult(intent, PIC_FROM_LOCALPHOTO);         }else if (type == PIC_FROM_CAMERA){            // 隐式调用照相机程序            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 拍下的照片会被输入到upload.jpeg里面            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);            Log.e("MainActivity", "doHandlerPhoto: "+MediaStore.EXTRA_OUTPUT );            startActivityForResult(cameraIntent, PIC_FROM_CAMERA);         }      } catch (Exception e)      {         Log.i("HandlerPicError", "处理图片出现错误");      }   }   /**    * 调用图片剪辑程序    */   public Intent getCropImageIntent() {      /*//原始代码---      Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);      intent.setType("image");       Log.e("MainActivity", "可以使用路径: "+photoUri );      setIntentParams(intent);      return intent;*/
// 修改后的代码      Intent intent = new Intent(Intent.ACTION_PICK,null);      intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");      intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);      // file:///storage/emulated/0/upload/upload.jpeg      setIntentParams(intent);      return intent;   }   /**    * 启动裁剪    */   private void cropImageUriByTakePhoto() {      // 此处启动裁剪程序      Intent intent = new Intent("com.android.camera.action.CROP");      intent.setDataAndType(photoUri, "image/*");      setIntentParams(intent);      startActivityForResult(intent, PIC_FROM_LOCALPHOTO);   }   /**    * 设置公用参数    */   private void setIntentParams(Intent intent)   {      intent.putExtra("crop", "true");      intent.putExtra("aspectX", 1);      intent.putExtra("aspectY", 1);      intent.putExtra("outputX", 600);      intent.putExtra("outputY", 600);      intent.putExtra("noFaceDetection", true); // no face detection      intent.putExtra("scale", true);      intent.putExtra("return-data", false);      intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);      intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());   }   @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data)   {      switch (requestCode)      {      case PIC_FROM_CAMERA: // 拍照         try          {            cropImageUriByTakePhoto();         } catch (Exception e)         {            e.printStackTrace();         }         break;      case PIC_FROM_LOCALPHOTO:// 相册         try         {            if (photoUri != null)             {               Bitmap bitmap = decodeUriAsBitmap(photoUri);               imageView.setImageBitmap(bitmap);            }         } catch (Exception e)          {            e.printStackTrace();         }         break;      }   }   // uri转换成bitmap对象   private Bitmap decodeUriAsBitmap(Uri uri)   {      Bitmap bitmap = null;      try       {         bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));      } catch (FileNotFoundException e)      {         e.printStackTrace();         return null;      }      return bitmap;   }}
PS: 非原创,转载的
1 0