在日常开发中,我们经常需要用到上传图片的 功能,这个时候通常有两种做法,第一种,从相机获取,第二种,从相册获取。今天这篇博客主要讲解利用系统的Intent怎样获取?
主要内容如下
- 怎样通过相机获取我们的图片
- 怎样启动相册获取我们想要的图片
- 在Android 6.0中的动态权限处理】
- 调用系统Intent和自定义相册的优缺点对比
怎样通过相机获取我们的图片
总共有两种方式,
第一种方式:
第一步,通过 MediaStore.ACTION_IMAGE_CAPTURE 启动我们的相机
1 | Intent pIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用摄像头action |
第二步,在onActivityResult进行处理,,核心代码如下
1 |
|
第二种 方式
第一步,通过 MediaStore.ACTION_IMAGE_CAPTURE 启动相机,并指定 MediaStore.EXTRA_OUTPUT ,intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFile)); 传入我们的URI,这样,最终返回的信息会存储在我们的mFile中。
1 | private void startCameraWithHighBitmap() { |
第二步:在onActivityResult进行处理,并对图片进行相应的压缩,防止在大图片的情况下发生OOM
1 | case INTENT_CODE_IMAGE_CAPTURE2: |
1 | public static Bitmap decodeSampledBitmapFromFile(String pathName, int reqWidth, int reqHeight) { |
两种方法的区别
第一种方法获取的bitmap是被缩放的bitmap,第二种方法获取的bitmap是完整的bitmap,实际使用中根据需求情况决定使用哪一种方法。
怎样启动相册获取我们想要的图片
第一步,通过 Intent.ACTION_GET_CONTENT 这个Intent,并设置相应的type,启动相册。
1 | Intent i = new Intent(Intent.ACTION_GET_CONTENT, null); |
第二步,在onActivityResult中对返回的uri数据进行处理
- 需要注意的是:这里我们需要注意是不是MIUI系统,如果不是MIUI系统,我们只需要进行一下处理,就OK了
1 | private void setPhotoForNormalSystem(Intent data) { |
- 如果是MIUI系统,我们需要进行一下处理
1 | private void setPhotoForMiuiSystem(Intent data) { |
在代码中的体现如下,即判断是否是MIUI系统,对于不同的系统采用不同的方法
1 |
|
Android6.0动态权限管理
我们知道在Android6.0以上的系统,有一些权限需要动态授予
1 | group:android.permission-group.CONTACTS |
我们这里容易 得知读取相机需要的权限有,写sd卡权限,读取camera权限,这两个权限都需要动态授予。
这里我们以检查是否授予camera权限为例子讲解
第一步,在启动相机的时候检查时候已经授予camera权限,没有的话 ,请求camera权限
1 | if (ContextCompat.checkSelfPermission(this, permission) |
第二步:重写onRequestPermissionsResult方法,判断是否授权成功,成功的话启动相机,核心代码如下。
1 | @Override |
至于检查sd卡写权限的,这里不再阐述,有兴趣的话,可以下载源码看一下。
关于Android6.0动态获取权限的,可以参考这一篇博客在Android 6.0 设备上动态获取权限
调用系统Intent和自定义相册的优缺点对比
调用系统Intent启动相册
优点: 代码简洁
缺点:对于不同的手机厂商,room往往被修改了,有时候调用系统的Intent,会有一些一项不到的bug, 不能实现多张图片的选择
自定义相册
优点: 实现的样式可以自己定制,可以实现多张图片的选择等
缺点: 代码量稍微多一些
总结
综上所述,对于本地相册的功能,本人还是强烈推荐自己实现,因为采用系统的,灵活性差,更重要的是,经常会有一些 莫名其妙的bug
这里给大家推荐两种实现方式,一个是鸿洋大神以前写的,一个是GitHub的开源库。
Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
android-multiple-images-selector
裁剪图片
关于裁剪图片的Intent,网上的大多数做法是
1 | public static Intent cropPic(Uri imageUri) { |
当你运行代码的时候,部分设备会报错,大致的意思是:com.android.camera.action.CROP 的Activity not found
解决方法,我们可以捕获一下异常,防止发生崩溃,并弹出吐司提醒用户不支持裁剪功能。
1 | try{ |
当然,github上面有两个比较好的开源库
文章首发地址CSDN:http://blog.csdn.net/gdutxiaoxu/article/details/53411790