Aandroid调用摄像头拍照和从相册选择照片

像QQ,微信可以使用相机拍摄或者直接在相册中选取图片来对别人进行分享,这样的功能在每一个应用程序中都会很常见,下面我们就来学习一下关于如何调用摄像头和相册方面的知识

(这里推荐刚刚学习Android的同学来看一下郭霖大神的最新力作 Android 第一个行代码,我就是在学习这本书!)

1.首先我们来学习一下如何调用摄像头进行拍照:

首先我们需要修改activity_main.xml中的代码,我们需要在布局中加入一个Button,一个ImageView; Button控件是用来打开摄像头进行拍照的,而ImageView 控件则是用来将拍摄的图片显示出来;

Aandroid调用摄像头拍照和从相册选择照片_第1张图片

接下来我们来仔细分析一下MainActivity中要做的事情: 

一: 获取Button 和 ImageView 的实例,并且给Button 注册点击事件,在点击事件中实现调用摄像头:

这里首先创建一个File对象,用于存放拍摄的图片,这里将图片命名为output_image.jpg;并将其存放在手机SD卡的应用关联目录下,调用getExternalCacheDir()方法可以得到这个目录(这里因为在Android6.0开始,读写SD卡就列为了危险权限,而使用应用关联目录则可以跳过运行时权限处理这一步);

接着,就会判断,如果运行的设备的系统版本低于Android7.0,那么就调用Uri的fromFile()的方法将File对象转为Uri对象,这个Uri对象标识着图片的本地真实的路径;否则,就调用FileProvider的getUriForFile()方法将File对象转换成一个封装过的Uri对象。getUriFile()方法接受三个参数;第一个参数要求传入Context对象,第二个参数可以是任意唯一的字符串,第三个参数则是我们刚刚创建的File对象(传入参数是因为Android7.0开始,直接使用本地真实的路径就会抛出一个FileUriExposeException 异常);

接下来就是构建一个Intent对象,并将其action指定为android.media.action.IMAGE_GAPTURE,再调用Intent的putExtra()方法来指定图片的输出地址,最后调用startActivityForResult()来启动活动,由于我们使用的是一个隐士的Intent,系统会响应这个Intent的活动去启动相机;

 注意:这里我们使用startActivityForResult()来启动活动,因此拍完照后会有结果返回到onActivityResult()方法中,如果拍照成功,就会调用BitmapFactory的decodeStream()方法将output_iamge.jpg解析成Bitmap对象,然后把它设置到ImageView中显示出来;

Aandroid调用摄像头拍照和从相册选择照片_第2张图片

Aandroid调用摄像头拍照和从相册选择照片_第3张图片Aandroid调用摄像头拍照和从相册选择照片_第4张图片

当然我们还需要在AndroidManifest.xml中对内容提供其进行注册,并声明一下访问SD卡的权限;

Aandroid调用摄像头拍照和从相册选择照片_第5张图片

这里我们引用了一个@xml/file_paths资源,所以我们需要创建一个file_paths文件(res->New->Directory->创建xml目录,右击xml目录->New->File->创建file_paths.xml),然后修改file_paths.xml中的内容



二:从相册中选择相片:

在相机的基础上进行修改,首先在activity_main_xml布局中添加一个Button用来从相册中选取照片:

Aandroid调用摄像头拍照和从相册选择照片_第6张图片

然后我们膝盖MainActivity中的代码,加入从相册选择照片的逻辑;

首先在按钮的点击事件里进行了一个权限处理,动态申请WRITE_EXTERNAL_STORAGE这个危险的权限,然后调用openAlbum()方法,这里先同样先构建一个Intent对象,并将其action指定为android.intent.action.Get_CONTENT,接着给这个Intent设置参数,然后调用startActivtiyForResult()方法就会进入CHOOSE_PHOTO的case来处理图片,

接下来我们需要判断手机版本,如果是4.4及以上的系统,调用handleImageOnKitKat()方法,否则调用handle-

ImageBeforeKitKat()方法来处理图片;如果是第一种情况,我们需要判断如果返回的是Uri的document类型的话,就取出document的id处理,如果Uri的authority是media格式的haul,document id还需要用于构建新的Uri和条件语句;然后把这些值作为参数传入到getImagePath()方法获得图片的真实路径,再调用dispalyImage()方法将图片进行显示:如果是第二种,直接将Uri传入到getImagePath()获取路径;


Aandroid调用摄像头拍照和从相册选择照片_第7张图片Aandroid调用摄像头拍照和从相册选择照片_第8张图片Aandroid调用摄像头拍照和从相册选择照片_第9张图片Aandroid调用摄像头拍照和从相册选择照片_第10张图片Aandroid调用摄像头拍照和从相册选择照片_第11张图片


你可能感兴趣的:(Android开发)