之前遇到各种拍照啊,获取相册图片之类,都是直接去度娘,要么之前的代码复制下,没好好总结过。

再也不要问度娘了,再也不用一堆博客里找啊找了。。。

----------------------------------------------我是正文的分割线-----------------------------------------------------------

一个一个来,先说调用手机相机拍照(最简单版):

cameraButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,TAKE_PHOTO);}
});protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode==RESULT_OK){Bundle bundle=data.getExtras();Bitmap bitmap=(Bitmap)bundle.get("data");photoImageView.setImageBitmap(bitmap);}
}

这个方法简单是简单了,但是得到的图片却是缩略图,通常都非常模糊,很多时候并不满足我们的要求,我们需要的是获取拍照所得照片的原图。

而通常想要获取拍照所得原图的方法,我们首先会自定义图片名称,确认图片存储位置,之后根据图片位置Uri,自然可以获得原图Bitmap。代码如

    /*** 自定义图片名,获取照片的file*/private File createImgFile(){//确定文件名String fileName="img_"+new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())+".jpg";
//        File dir=getExternalFilesDir(Environment.DIRECTORY_PICTURES);
//        File dir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
//        File dir=Environment.getExternalStorageDirectory();File dir;if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){dir=Environment.getExternalStorageDirectory();}else{dir=getExternalFilesDir(Environment.DIRECTORY_PICTURES);}File tempFile=new File(dir,fileName);try{if(tempFile.exists()){tempFile.delete();}tempFile.createNewFile();}catch (IOException e){e.printStackTrace();}//获取文件路径photoPath=tempFile.getAbsolutePath();return tempFile;}
    //拍照cameraButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//只是加了一个uri作为地址传入Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);File photoFile=createImgFile();photoUri=Uri.fromFile(photoFile);intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);startActivityForResult(intent,TAKE_PHOTO);}});

代码应该非常清楚,我们定义了图片名称,将uri传入,那么我们在onActivityResult中就可以得到这个uri,之后岂不是可以直接根据uri得到bitmap了?例如这样:

Bitmap bitmap=MediaStore.Images.Media.getBitmap(getContentResolver(),photoUri);
photoImageView.setImageBitmap(bitmap);

这样做起来是没错的,可惜通常我们手机的摄像头大多非常高清,拍摄出来的照片如果直接加载到手机内存里面,恐怕就啦啦啦啦啦啦了……

那么,我们唯一能想到的,就只有开始压缩图片了:

    /*** 压缩图片*/private void setImageBitmap(){//获取imageview的宽和高int targetWidth=photoImageView.getWidth();int targetHeight=photoImageView.getHeight();//根据图片路径,获取bitmap的宽和高BitmapFactory.Options options=new BitmapFactory.Options();options.inJustDecodeBounds=true;BitmapFactory.decodeFile(photoPath,options);int photoWidth=options.outWidth;int photoHeight=options.outHeight;//获取缩放比例int inSampleSize=1;if(photoWidth>targetWidth||photoHeight>targetHeight){int widthRatio=Math.round((float)photoWidth/targetWidth);int heightRatio=Math.round((float)photoHeight/targetHeight);inSampleSize=Math.min(widthRatio,heightRatio);}//使用现在的options获取Bitmapoptions.inSampleSize=inSampleSize;options.inJustDecodeBounds=false;Bitmap bitmap=BitmapFactory.decodeFile(photoPath,options);photoImageView.setImageBitmap(bitmap);}

以上就是调取相机拍照的全部代码,当然WRITE_EXTERNAL_STORAGE这个权限肯定是要加的。

还有一件经常出现的事,就是可能你拍照之后,照片并没有及时出现在手机相册中,而是需要手机重启之后才会出现。其实我们只需要发送一条广播,就可以将图片添加进手机相册,代码如下:

    //将图片添加进手机相册private void galleryAddPic(){Intent mediaScanIntent=new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);mediaScanIntent.setData(photoUri);this.sendBroadcast(mediaScanIntent);}

困难已经过去,相对而言,从相册里选取照片,简直再简单不过,我相信只要看下代码就会懂了,不信你看:

    //从相册获取照片albumButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//Intent intent=new Intent(Intent.ACTION_PICK);Intent intent=new Intent(Intent.ACTION_GET_CONTENT);intent.setType("image/*");startActivityForResult(intent,PICK_PHOTO);}});
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode==RESULT_OK){switch (requestCode){case TAKE_PHOTO:setImageBitmap();galleryAddPic();break;case PICK_PHOTO://data中自带有返回的uriphotoUri=data.getData();//获取照片路径String[] filePathColumn={MediaStore.Audio.Media.DATA};Cursor cursor=getContentResolver().query(photoUri,filePathColumn,null,null,null);cursor.moveToFirst();photoPath=cursor.getString(cursor.getColumnIndex(filePathColumn[0]));cursor.close();//有了照片路径,之后就是压缩图片,和之前没有什么区别setImageBitmap();break;}}}

很简单吧,我们在onActivityResult()中根据data获取到了所选图片的uri,之后只要一步查询,就可以得到图片路径。而有了照片路径,就没有任何问题了。

整个demo到这里就结束了,接下来的内容可以不必看,demo下载链接:下载地址

自问自答时间:

问:SD卡是什么?因为在我创建File的时候,目录文件默认使用的是Environment.getExternalStorageDirectory(),而在使用之前是需要检测状态的,

也就是这句Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED),询问SD卡是否正确安装。我用了一部新手机,依旧是正确安装的。

答:手机是有内置sd卡的,所以哪怕我买了新手机,但是依旧可以检测到sd卡的存在。

一个有意思的回答是说,内置的sd卡类似于电脑硬盘,外界的sd卡类似于移动硬盘,但也不确定是否正确。

问:创建File的时候,几个不同的目录文件分别什么意思?有什么不同?

答:直接看测试结果吧,Environment.getExternalStorageDirectory()的地址:/storage/emulated/0

Environment.getExternalStoragePublicDirectory()的地址:/storage/emulated/0/Pictures

getExternalFilesDir()的地址:/storage/emulated/0/Android/data/com.example.notificationapp/files/Pictures

问:从相册选取照片的时候,好像有个两个Intent都可以,有什么区别?

答:Intent intent=new Intent(Intent.ACTION_PICK);
Intent intent=new Intent(Intent.ACTION_GET_CONTENT);

这两个确实都可以从相册选取照片,但是具体有什么区别,好吧,我没搞明白。

Android拍照和获取相册图片相关推荐

  1. Android 华为手机获取相册图片路径,获取不到问题

    未经本人授权,不得转载!否则必将维权到底 有个需求,可以从系统相册选择图片,上传到服务器.那么选择从系统相册选择完图片后,图片的名字需要显示在页面上.这里出了个 Bug,华为手机用系统的方法,获取相册 ...

  2. 使用 微信JS-SDK 拍照 或者获取 相册 图片并展示

    最近有在微信公众号的项目需要使用照相机,所以研究了一下微信的拍照功能,以下是具体流程: 根据微信的开发文档,想要使用微信的jssdk,需要5个步骤:  (1)步骤一:绑定域名  先登录微信公众平台进入 ...

  3. android 图片自动裁剪图片,Android实现拍照、选择相册图片并裁剪功能

    通过拍照或相册中获取图片,并进行裁剪操作,然后把图片显示到ImageView上. 当然也可以上传到服务器(项目中绝大部分情况是上传到服务器),参考网上资料及结合项目实际情况, 测试了多款手机暂时没有发 ...

  4. Android开发之获取相册照片和获取拍照照片

    在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...

  5. Android拍照及从相册选择图片传详解(终极版)

    Android 拍照及从相册选择图片传详解 先上图 新知识点速览 URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符.通过使用位置,名称或两者来标识Internet上的 ...

  6. Android6.0动态设置读写权限(Android拍照或从相册中选图片预览出现问题)

    做了一个Android拍照或从相册中选图片传服务器的demo,出现了问题虽然 图片路径 也可以打印出来,然后去看权限那里也申请了读写权限 <uses-permission android:nam ...

  7. android uri图片压缩,详解android 通过uri获取bitmap图片并压缩

    详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onactivityresult中用media.getbitmap来获取返回的图片,如下: uri mimage ...

  8. Android 拍照或从相册取图片并裁剪

    Android 拍照或从相册取图片并裁剪 转载自:http://www.cnblogs.com/w-y-f/p/4028379.html 在Android中,Intent触发Camera程序,拍好照片 ...

  9. # iOS 相册图片多选以及类似微信获取相册图片并使用AFN框架上传至服务器

    iOS 相册图片多选以及类似微信获取相册图片并使用AFN框架上传至服务器 做APP基本上都是需要从系统的相册当中获取一张或多张图片.那怎么做呢?下面我就带你来实现这个内容,第一次写. 我只是记录一下. ...

最新文章

  1. python安装win32api pywin32 后出现 ImportError: DLL load failed
  2. python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)
  3. 有逼格的产品经理的工作台长啥样?
  4. 13个代码注释的小贴士
  5. Activiti工作流框架学习(一)环境的搭建和数据表的了解
  6. Python二级笔记(18,19合集操作篇)
  7. [LeetCode-JAVA] Remove Duplicates from Sorted Array II
  8. 一、 kettle开发、上线常见问题以及防错规范步骤
  9. 终极算法——第二章:终极算法
  10. 虚拟机服务器ip端口映射,VMware虚拟机配置端口转发(端口映射),实现远程访问【转】...
  11. 【愚公系列】2022年01月 Django商城项目14-用户中心-界面设计
  12. 论文中定性分析与定量分析的写作手法
  13. linux下替代windows的软件列表
  14. 高级项目经理资质论文
  15. 使用画图软件更改图片大小
  16. codeforces 730 A Toda 2
  17. 华为认证是什么?这个证值得考吗?网工深思……
  18. iqooneo系统升级好不好_vivo iQOO手机系统更新好吗?
  19. CSS的文本属性阴影效果
  20. 必得沾福气卡两张,可沾花花卡、敬业福。(扫福攻略、扫福技巧)

热门文章

  1. word2vec安装使用教程
  2. CSDN热榜、华为云博客都可用来练习Python scrapy 爬虫
  3. [渝粤教育] 金陵科技学院 服装立体裁剪 参考 资料
  4. 微信公众号文章(HTML)转 Word、PDF 方法
  5. zabbix启动 cannot recreate Zabbix semaphores for IPC 问题
  6. 电商API接口,按图搜索淘宝商品(拍立淘) 返回值说明
  7. 曾经沧海难为水,除却巫山不是云~ 的意思是为思念亡妻
  8. 国内研究团队利用神经反馈训练提高运动想象脑机接口的性能
  9. ubuntu录制桌面视频的教程
  10. FANUC查找PMC [符号注释] 的小技巧