这里我们调用的都是系统提供的类,所以使用起来非常简单;
每次点击圆形头像都会弹出一个PopupWindow,可以点击“拍照”,“手机相册”和"取消";
1,当点击"拍照"时开启系统拍照页面,拍照完成 成功接收图片以后 携带数据 打开 图片裁剪页面,裁剪完成 成功接收图片显示到view上面;
2,当点击"手机相册"时 开启系统相册选择页面,选择完成以后获取图片路径,显示到view上面;
开启系统拍照的界面:
//启动拍照 private void startCameraActivity() { //获取当前File对象的绝对路径名的字符串形式 String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath(); //声明new file并不会创建文件或文件夹 mOutputFile = new File(sdPath, System.currentTimeMillis() + ".tmp"); Uri uri = Uri.fromFile(mOutputFile); //调用系统的拍照功能 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 指定调用相机拍照后照片的储存路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, CAMERA_REQUEST_CODE); dismissPop(); }我们需要重写系统的onActivityResult()方法,用于接收拍照的相片;在onActivityResult()方法中添加如下代码用于接收拍照图片:
if (requestCode == CAMERA_REQUEST_CODE) {//相册 if (resultCode == RESULT_CANCELED) { ToastUtils.showToast(context, "拍照取消"); return; } if (resultCode != RESULT_OK) { ToastUtils.showToast(context, "拍照失败"); return; } //确定接收成功后,打开系统裁剪图片页面 startCropActivity(Uri.fromFile(mOutputFile)); }打开系统相册裁剪页面: //启动相册裁剪 private void startCropActivity(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // crop为true是设置在开启的intent中设置显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX,outputY 是剪裁图片的宽高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); //MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mOutputFile.getAbsoluteFile() + "tmp"))); startActivityForResult(intent, REQUEST_CODE_CLIP_PHOTO); }然后在onActivityResult()方法中添加如下代码用于接收裁剪完成的图片: if (requestCode == REQUEST_CODE_CLIP_PHOTO) {//裁剪页面 if (resultCode == RESULT_CANCELED) { ToastUtils.showToast(context, "裁剪取消"); return; } if (resultCode != RESULT_OK) { ToastUtils.showToast(context, "裁剪失败"); return; } /** * 在真实项目中获取bitmap之后直接传给后台 */ Bitmap bitmap = BitmapFactory.decodeFile(mOutputFile.getAbsolutePath() + "tmp"); ivCircle.setImageBitmap(bitmap); } 当点击"手机相册"时开启系统相册选择页面: //启动系统相册 private void startPhotoActivity() { //获取当前File对象的绝对路径名的字符串形式 String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath(); //声明new file并不会创建文件或文件夹 mOutputFile = new File(sdPath, System.currentTimeMillis() + ".tmp"); Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult(intent, PHOTE_REQUEST_CODE); dismissPop(); }然后在onActivityResult()方法中添加如下代码用于接收相册选择的图片: if (requestCode == PHOTE_REQUEST_CODE) {//相册 if (resultCode == RESULT_CANCELED) { ToastUtils.showToast(context, "取消相册"); return; } if(resultCode!=RESULT_OK){ ToastUtils.showToast(context,"选择图片异常"); return; } Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); //获取bitmap;在真实项目中将bitmap传递给后台 Bitmap bitmap = BitmapFactory.decodeFile(picturePath); ivCircle.setImageBitmap(bitmap); }最后提醒大家,记得开启相应的权限;
点击打开链接免费下载源码