整个程序的布局很简单
只在一个垂直方向上的线性布局里面有俩个按钮(Button)和一个显示图片的控件(ImageView)
这里就不给出这部分的代码了
1.是打开系统的相册
Intent albumIntent = new Intent(Intent.ACTION_PICK, null); albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(albumIntent, ALBUM_OK);
这里是通过启动一个系统的隐式意图打开的本地相册
2.是开启系统的拍照
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 if (pre.exists()) { pre.delete(); } try { pre.createNewFile(); } catch (IOException e) { e.printStackTrace(); } cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pre)); startActivityForResult(cameraIntent, CAMERA_OK);通过开启一个隐式意图打开照相机3.进行裁剪 这里的裁剪也是通过一个隐式意图调用系统的功能的
/** * 裁剪图片方法实现 * * @param uri 图片来源 */ public void clipPhoto(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1) intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); startActivityForResult(intent, CUT_OK); }
4.显示、保存图片
/** * 保存裁剪之后的图片数据 将图片设置到imageview中 * * @param picdata */ private void setPicToView(Intent picdata) { CLog.d(TAG, "将图片显示在控件上"); Bundle extras = picdata.getExtras(); if (extras != null) { bitmap = extras.getParcelable("data"); // TODO 设置图片之前 应该将之前的图片删除,将最新的图片保存 readBitmap2File(bitmap); headPhoto.setImageBitmap(bitmap); } }
下面附上整个程序的源代码(其中还包括一个队图片进行二次采样的工具类)
这里面有一个问题有待验证。
在保存图片的时候,当时我的做法是先判断SDCard卡是否可用,
不可用的情况直接保存到手机内存,在这个地方,有人和我提到过好像由于某些问题,是不能保存到这个地方的。
可用的情况下,直接就在SDCard卡中保存。
点击下载源代码