private static final int TAKE_PHOTO = 1; //打开相机的请求码 private static final int CROP_PHOTO = 2; //裁剪图片的请求码 private static final int CHOICE_PHOTO = 3; //选择图片的请求码 private Uri imageUri; //图片uri地址定义请求码 、Uri 以及找到 ImageView或者自定义 ImageView控件。
case R.id.main_img_circle: //头像的点击事件、弹出对话框 AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); AlertDialog dialog = builder.create(); dialog.setTitle("更换头像"); dialog.setButton("选择照片", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { choicePhoto(); //调用选择照片方法 } }); dialog.setButton2("拍摄", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { takePhoto(); //调用拍摄方法 } }); dialog.show(); break;
点击头像弹出对话框,执行相应的操作。
//拍摄方法 private void takePhoto() { File outputImage = new File(Environment.getExternalStorageDirectory(), "tempImage.jpg"); //创建文件在sd卡并命名 try { if (outputImage.exists()){ outputImage.delete(); //如果文件存在则删除文件 } outputImage.createNewFile(); //创建文件 } catch (IOException e) { e.printStackTrace(); } imageUri = Uri.fromFile(outputImage); //将文件转化为Uri地址 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //设置Intent的action intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //跳转到相机拍摄 startActivityForResult(intent, TAKE_PHOTO); //相机执行完回调到onActivityResult方法 }
上面是调用相机拍摄的方法。
//选择照片方法 private void choicePhoto() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); //设置intent的action intent.setType("image/*"); //设置类型 startActivityForResult(intent, CHOICE_PHOTO); //照片选择完回调到onActivityResult方法 }
上面是调用图库来选择照片的方法,因为android系统版本问题而导致选择完图片不能裁剪。所以用以上方法选择图片后不裁剪来设置头像。
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case TAKE_PHOTO: //相机执行完的回调 if (resultCode == mActivity.RESULT_OK){ Intent intent = new Intent("com.android.camera.action.CROP"); //跳转到图片裁剪 intent.setDataAndType(imageUri, "image/*"); //设置数据和类型 intent.putExtra("scale", true); //设置可缩放 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //设置位置 startActivityForResult(intent, CROP_PHOTO); //裁剪执行完同样回调到onActivityResult方法 } break; case CROP_PHOTO: //裁剪执行完的回调 if (resultCode == mActivity.RESULT_OK){ holder.main_img_circle.setImageURI(null); //先设置为null,防止第二次点击拍摄时头像不更新 holder.main_img_circle.setImageURI(imageUri); //设置头像 } break; case CHOICE_PHOTO: //选择完图片的回调 if (resultCode == mActivity.RESULT_OK){ //从相册选择照片不裁切 try { Uri selectedImage = data.getData(); //获取系统返回的照片的Uri // String[] filePathColumn = { MediaStore.Images.Media.DATA }; // Cursor cursor =mActivity.getContentResolver().query(selectedImage, // filePathColumn, null, null, null);//从系统表中查询指定Uri对应的照片 // cursor.moveToFirst(); // int columnIndex = cursor.getColumnIndex(filePathColumn[0]); // String picturePath = cursor.getString(columnIndex); //获取照片路径 // cursor.close(); // Uri image_Uri = Uri.parse(picturePath); // Bitmap bitmap= BitmapFactory.decodeFile(picturePath); // picImageView.setImageBitmap(bitmap); holder.main_img_circle.setImageURI(selectedImage); } catch (Exception e) { e.printStackTrace(); } } break; } }
在case为CHOICE_PHOTO那里,因为我是用的自定义ImageView所以不用setImageBitmap方法,而是用setImageURI方法。