这是我人生中写的第一篇博客,是否要纪念一下这一刻(2016.09.01 16:52)。其实关于写博客,老早就有这种写法,首先觉得他能够帮我总结我学到的和用过的技术,其次还能帮助那些和我有一样需求的人,我也是很开心啊,但是至于为什么现在才写第一篇,首先没有想好写什么,然后前段时间也确实比较忙。是不是那些来观技术的人已经想骂人了啊。。。啊哦!原谅我第一次写博客的激动心情吧!
废话不多说,开始我们的问题吧,首先因为我做了两次关于调用相机和相册获取图片的功能,觉得很有必要总结一下,下面我将从这两个功能出发完成这篇泊车

一、功能描述:

类似于淘宝评论中上传图片的功能先上图

1.实现步骤:

①点击打开底部Dialog去选择拍照或者相册

/*** 1)打开底部弹窗* * @author 陈静* @version 2016-9-1 下午5:21:21*/private void openDialog() {mtakephoteDialog = new Dialog(this, R.style.my_dialog);LinearLayout view = (LinearLayout) LayoutInflater.from(MainActivity.this).inflate(R.layout.my_takephoto_dialog, null);TextView tp_dialog_tv = (TextView) view.findViewById(R.id.tp_dialog_tv);view.findViewById(R.id.tp_dialog_takebtn).setOnClickListener(MainActivity.this);view.findViewById(R.id.tp_dialog_picturebtn).setOnClickListener(MainActivity.this);view.findViewById(R.id.tp_dialog_canclebtn).setOnClickListener(MainActivity.this);tp_dialog_tv.setText("亲,你还可上传" + (2 - PHOTO_SUM) + "张照片");showBottomDialog(MainActivity.this, view, mtakephoteDialog);}/*** 2)显示底部弹窗*/public final void showBottomDialog(Context context, View layout,Dialog myDialog) {// Dialog mCameraDialog = new Dialog(context, R.style.my_dialog);myDialog.setContentView(layout);Window dialogWindow = myDialog.getWindow();dialogWindow.setGravity(Gravity.BOTTOM);dialogWindow.setWindowAnimations(R.style.dialogstyle);// 添加动画WindowManager.LayoutParams lp = dialogWindow.getAttributes();// 获取对话框当前的参数值lp.x = 0;// 新位置X坐标lp.y = -20;// 新位置Y坐标lp.width = (int) getResources().getDisplayMetrics().widthPixels;// 宽度//lp.height = WindowManager.LayoutParams.WRAP_CONTENT;// 高度lp.alpha = 9f;// 透明度layout.measure(0, 0);lp.height = layout.getMeasuredHeight();lp.alpha = 9f; // 透明度dialogWindow.setAttributes(lp);myDialog.show();}/*** 3)在styles.xml中配置弹窗样式*  */<style name="my_dialog" parent="@android:style/Theme.Dialog"><item name="android:windowFrame">@null</item><!-- 边框 --><item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 --><item name="android:windowIsTranslucent">false</item><!-- 半透明 --><item name="android:windowNoTitle">true</item><!-- 无标题 --><item name="android:windowBackground">@android:color/transparent</item><!-- 背景透明 --><item name="android:backgroundDimEnabled">true</item><!-- 模糊 --></style><style name="dialogstyle" parent="android:Animation"><item name="@android:windowEnterAnimation">@anim/dialog_enter</item><item name="@android:windowExitAnimation">@anim/dialog_exit</item></style>/*** 4)在res下创建anim 文件夹,添加用到的两个动画*  */--- dialog_enter.xml<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="400"android:fromYDelta="100%p" />
</set>
--- dialog_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" ><translateandroid:duration="400"android:toYDelta="100%p" />
</set>

②点击打开相册或相机

1)点击打开相册
/*
* 从相册获取
*/
public void gallery() {
// 激活系统图库,选择一张图片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}
2)点击打开相机
// 相机拍照方法
private void takeCamera() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, PHOTO_REQUEST_CAREMA);

③获取到图片时接受相册或相机的返回图片,重写onActivityResult方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {// 拍照返回String imagePath = new String();if (resultCode != Activity.RESULT_OK) {// result is not correctreturn;} else {if (requestCode == PHOTO_REQUEST_GALLERY) {// 从相册返回的数据if (data != null) {// 得到图片的全路径Uri uri = data.getData();// 展示图片if (PHOTO_SUM == 0) {takephoto1.setVisibility(View.VISIBLE);// 加载本地图片(路径以/开头, 绝对路径)bitmapUtils.display(takephoto1,getAbsoluteImagePath(uri));} else if (PHOTO_SUM == 1) {takephoto2.setVisibility(View.VISIBLE);evalute_takephoto_ib.setVisibility(View.GONE);bitmapUtils.display(takephoto2,getAbsoluteImagePath(uri));}PHOTO_SUM += 1;// 图片地址添加到集合中imagePath = getAbsoluteImagePath(uri);mFile.add(new File(imagePath));}} else if (requestCode == PHOTO_REQUEST_CAREMA) {// 根据有没有SD卡给出相关路径String picName = "evalute" + System.currentTimeMillis()+ ".png";String picPath = new String();if (hasSdcard()) {picPath = Environment.getExternalStorageDirectory().toString();imagePath = picPath + "/" + picName;} else {picPath = this.getFilesDir().toString();imagePath = picPath + "/" + picName;}// 得到图片的全路径Bitmap bitmap = data.getParcelableExtra("data");saveBitmap(picPath, picName, bitmap);// 图片保存到本地mFile.add(new File(imagePath));// 保存路径添加到集合中// 在界面上展示对应图片if (PHOTO_SUM == 0) {takephoto1.setVisibility(View.VISIBLE);this.takephoto1.setImageBitmap(bitmap);} else if (PHOTO_SUM == 1) {takephoto2.setVisibility(View.VISIBLE);evalute_takephoto_ib.setVisibility(View.GONE);this.takephoto2.setImageBitmap(bitmap);}PHOTO_SUM += 1;}}// 关闭底部弹窗if (mtakephoteDialog != null) {mtakephoteDialog.dismiss();}super.onActivityResult(requestCode, resultCode, data);
}

④提供这其中用到的几个方法

/*** 将Uri转换为绝对路径* * @author 陈静* @version 2016-7-29 下午2:50:18*/protected String getAbsoluteImagePath(Uri uri) {// can post imageString[] proj = { MediaStore.Images.Media.DATA };Cursor cursor = managedQuery(uri, proj, null, null, null);int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();return cursor.getString(column_index);}/*** 将拍摄的图片保存到本地* * @author 陈静* @version 2016-7-29 下午2:50:53*/public void saveBitmap(String picPath, String picName, Bitmap bm) {File f = new File(picPath, picName);if (f.exists()) {f.delete();}try {FileOutputStream out = new FileOutputStream(f);bm.compress(Bitmap.CompressFormat.PNG, 90, out);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}/** 判断sdcard是否被挂载*/private boolean hasSdcard() {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {return true;} else {return false;}}

2.温馨提示

①此界面显示图片用到了Xutils的bitmaputils
②在此功能中添加private List<File> mFile = new ArrayList<File>();// 把图片保存到file数组中用于循环上传到服务器

二、功能描述:

类似于微信朋友圈点击更换背景图片的功能,即:点击图片后弹窗提示更换背景图片,点击后跳转页面,去选择拍照还是从相册获取,并进行裁剪后返回到上一个页面,这里也上张图吧

1.实现步骤:

①点击弹出popuwindow提示更换背景图片

    // 弹出更换背景图片的popuwindow
private void changBGPopuwindow() {// 1.加载布局View mView = View.inflate(MainActivity.this,R.layout.change_userinfo_bg, null);pm = new PopupWindow(mView, LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, true);// 如果不添加这行代码,点击pw区域之外的地方不能关闭pwpm.setBackgroundDrawable(new ColorDrawable());// pm.showAsDropDown(cic_part1_0_rl,0,-cic_part1_0_rl.getHeight());pm.showAtLocation(rl, Gravity.CENTER, 0, 150);
}

②点击更换背景图片的跳转选择相机或拍照的页面

// 点击更换背景图片的Poupuwindow
public void changUsesBg(View v) {pm.dismiss();Intent intent = new Intent();intent.setClass(MainActivity.this, ChangeBGActivity.class);startActivityForResult(intent, 777);}

③ 点击相机或拍照

  // 相机拍照方法private void takeCamera() {// Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// startActivityForResult(cameraIntent, PHOTO_REQUEST_CAREMA);Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在if (sdCardExist == true) {imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), picName));cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(cameraIntent, PHOTO_REQUEST_CAREMA);} else {imageUri = Uri.fromFile(new File(ChangeBGActivity.this.getFilesDir(), picName));cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(cameraIntent, PHOTO_REQUEST_CAREMA);}}/** 从相册获取*/public void gallery() {// 激活系统图库,选择一张图片Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERYstartActivityForResult(intent, PHOTO_REQUEST_GALLERY);}

④重写onActivityResult方法接收相机或相册传回来的图片,然后调用裁剪的方法得到最终图片后传递到上一个界面

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {String imagePath = new String();if (resultCode != Activity.RESULT_OK) {// result is not correctreturn;} else {if (requestCode == PHOTO_REQUEST_GALLERY) {// 从相册返回的数据if (data != null) {// 得到图片的全路径Uri uri = data.getData();// 裁剪图片crop(uri);// 图片地址添加到集合中imagePath = getAbsoluteImagePath(uri);mFile.add(new File(imagePath));}} else if (requestCode == PHOTO_REQUEST_CAREMA) {// 根据有没有SD卡给出相关路径String picPath = new String();if (hasSdcard()) {picPath = Environment.getExternalStorageDirectory().toString();imagePath = picPath + "/" + picName;} else {picPath = this.getFilesDir().toString();imagePath = picPath + "/" + picName;}// 裁剪图片crop(Uri.fromFile(new File(imagePath)));// 得到图片的全路径// Bitmap bitmap = data.getParcelableExtra("data");// saveBitmap(picPath, picName, bitmap);// 图片保存到本地// mFile.add(new File(imagePath));// 保存路径添加到集合中// 在界面上展示对应图片} else if (requestCode == PHOTO_REQUEST_CUT) {// 从剪切图片返回的数据if (data != null) {Bitmap bitmap = data.getParcelableExtra("data");Intent intent = getIntent();intent.putExtra("bitmap", bitmap);setResult(666, intent);finish();}try {// 将临时文件删除// tempFile.delete();} catch (Exception e) {e.printStackTrace();}}}super.onActivityResult(requestCode, resultCode, data);}

⑤调用裁剪的方法

// 剪切图片private void crop(Uri uri) {// 裁剪图片意图// Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");// 裁剪框的比例,1:1intent.putExtra("scale", true);// 去黑边intent.putExtra("aspectX", 11);intent.putExtra("aspectY", 8); // 裁剪后输出图片的尺寸大小intent.putExtra("outputX", 220);intent.putExtra("outputY", 160);intent.putExtra("outputFormat", "PNG");// 图片格式intent.putExtra("noFaceDetection", true);// 取消人脸识别intent.putExtra("return-data", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());// 设置剪切的图片保存位置Uri cropUri = null;if (hasSdcard()) {cropUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "bg_crop.png"));} else {cropUri = Uri.fromFile(new File(ChangeBGActivity.this.getFilesDir(), "bg_crop.png"));}intent.putExtra(MediaStore.EXTRA_OUTPUT, cropUri);// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUTstartActivityForResult(intent, PHOTO_REQUEST_CUT);}

⑥在上一个界面接受传递过来的图片并显示

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// changBgActivity返回的数据if (resultCode == 666) {Bitmap bitmap = data.getParcelableExtra("bitmap");BitmapDrawable bd = new BitmapDrawable(bitmap);rl.setBackgroundDrawable(bd);}super.onActivityResult(requestCode, resultCode, data);}

⑦在界面下一次打开时,回显该图片

// 判断有没有背景图片Uri cropUri = null;if (hasSdcard()) {cropUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "bg_crop.png"));} else {cropUri = Uri.fromFile(new File(MainActivity.this.getFilesDir(),"bg_crop.png"));}rl.setBackgroundDrawable(Drawable.createFromPath(cropUri.getPath()));}

2.温馨提示:

①此功能中用到的一些方法已在功能已中提供,不在细列
②输出的图片有2种情况:
1)如果你没有指定Intent里面的Extra参数,它就返回一个序列化(putExtra(“data”, bitmap))的Bitmap(参照1. 获得拍照的预览图)。
2)如果你指定了Intent里面的Extra参数MediaStore.EXTRA_OUTPUT,拍照后它就直接把bitmap写到了Uri里面了,返回是空

结语:

至此,我的第一篇博客结束了,可能表达的不是很清楚,但希望能够对需要的人有所帮助,为了能让大家更方便我单独整理除了一个Demo(eclipse),供大家参考,喜欢的话,就鼓励我吧,以后我就会更愿意分享更多的东西了
下载源码:http://download.csdn.net/detail/qq_25283953/9619905

从相机相册获取图片裁剪后用于评论晒图或更换背景图相关推荐

  1. Android 相机 或者 相册 获取图片裁剪 适用6.0/7.0

    随着Android 的版本更新迭代.本来以前代码很简单的打开相册或者相机  获取图片裁剪 给Unity3D 使用的过程 挺简单的.但是随着 Android 版本的 更新 和 安全 的加强 .有几点 和 ...

  2. iOS 从相机或相册获取图片并裁剪

    /load user image - (void)UesrImageClicked { UIActionSheet *sheet; // 判断是否支持相机 if([UIImagePickerContr ...

  3. Android相机、相册获取图片显示并保存到SD卡

    如题,这个需求本不是一个很复杂的过程,但是却存在一些隐患,我也是最近在项目中碰到这个问题,将Android通过相机或相册获取图片并最终显示在界面上做了一个小研究,现将一些结果和附上的一个Demo叙述如 ...

  4. 微信小程序-从相册获取图片,视频 使用相机拍照,录像上传+服务器(nodejs版)接收

    在本文 微信小程序-从相册获取图片 使用相机拍照 本地图片上传之前需要看看 微信小程序-获取用户session_key,openid,unionid - 后端为nodejs 代码封装是在上文添加的. ...

  5. 微信小程录制视频上传服务器,微信小程序-从相册获取图片,视频使用相机拍照,录像上传+服务器nodejs版接收-微信小程序视频上传功能-微信小程序视频上传...

    在本文微信小程序-从相册获取图片使用相机拍照本地图片上传之前需要看看微信小程序-获取用户session_key,openid,unionid-后端为nodejs代码封装是在上文添加的.本文知识点:1. ...

  6. Android 调用系统打开相机,打开相册获取图片路径

    我们在开发中经常遇到一些功能需要调取系统相机拍照获取图片,或者有的时候直接打开图库获取图片,那我们怎么获取呢,今天分享下, 第一步,打开相机 public static final int CAMER ...

  7. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式...

    QRCode 扫描二维码.扫描条形码.相册获取图片后识别.生成带 Logo 二维码.支持微博微信 QQ 二维码扫描样式 参考链接:https://github.com/bingoogolapple/B ...

  8. Unity for IOS 加载手机相册图片以及打开相机拍照获取图片

    Unity for IOS 加载手机相册图片以及打开相机拍照获取图片 最近想做一个使用unity for IOS获取手机图片的功能,所以就研究了一下 这里我们需要创建两个objective-c文件,最 ...

  9. Android自定义相机拍照、图片裁剪的实现

    原文:Android自定义相机拍照.图片裁剪的实现 最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类 ...

最新文章

  1. npm install出现的错误
  2. ActiveReport的小数显示方法
  3. vue 计算属性和data_Vue:计算属性
  4. 布隆过滤器及其数学推导
  5. Netty工作笔记0046---异步模型原理剖析
  6. opencv表面缺陷检测_机器视觉表面缺陷检测 光学元件瑕疵检测
  7. drop user和drop user cascade的区别
  8. XRD .txt 格式转 .xrdml格式
  9. 9种免费在线PDF编辑网站
  10. 从洛伦兹曲线定性地看马太效应的根源
  11. 【ES】Elasticsearch的特点优点 为什么比MySQL快?
  12. colab运行在本地
  13. Apache Struts2远程代码执行漏洞(S2-019)复现
  14. Vue3 京东到家项目实战第一篇(首页及登录功能开发) 进阶式掌握vue3完整知识体系
  15. item_password-获得淘口令真实url接口,淘宝app短链接商品接口,1688商品淘口令url接口
  16. 数据库的登录密码忘记时,我们应该怎么办??
  17. StringBuffer的理解
  18. 如何用python请求接口
  19. Sap Program 自动创建供应商资料,BP
  20. Android 多语言支持

热门文章

  1. windows10家庭版修改中文用户名完美解决
  2. vue input输入框联想输入
  3. /usr/bin/ld: cannot find -lnl-genl-3
  4. pr制作节奏感抖动(变换)
  5. 加速度传感器的计步算法Pedometer
  6. 如何在WPS中打开多个窗口
  7. 如何开通企业付款到零钱||小程序红包功能
  8. cortex-a9 架构概览
  9. 【C#】如何给变量取一个好的名字
  10. Origin Pro 8.5 导出EPS格式稿件图片的设置