专栏名称: Anlia
Android工程师
目录
相关文章推荐
开发者全社区  ·  香港偶遇王校长 ·  11 小时前  
开发者全社区  ·  吃瓜!华x公司渣男天花板 ·  19 小时前  
开发者全社区  ·  兄弟的心真不是一般的大啊,还在拍呢,格局小了 ·  19 小时前  
开发者全社区  ·  大瓜!顶流男星 ·  昨天  
开发者全社区  ·  顶流男星大瓜? ·  2 天前  
51好读  ›  专栏  ›  Anlia

Android项目实践——三行代码解决照片选择与压缩

Anlia  · 掘金  · android  · 2017-12-23 03:37

正文

版权声明:本文为博主原创文章,未经博主允许不得转载

系列教程: Android开发之从零开始系列

源码: AnliaLee/PhotoFactory ,欢迎star

大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论

初看标题是不是觉得博主是标题党,故意把你们骗了进来?告诉你

博主帮大家封装好了 PhotoFactory 类,只需三行代码就可以完成 选择照片,获取其bitmap或uri路径(可自行配置是否压缩)的功能 。下面来看下如何使用 PhotoFactory


PhotoFactory简介

使用 PhotoFactory 分为三步,首先我们要实例化一个 photoFactory

PhotoFactory photoFactory = new PhotoFactory(this, this);//(Activity activity,Context context)

设置选择照片的方式

//提供三种选择照片的方式
photoFactory.FactoryStart().SetStartType(PhotoFactory.TYPE_PHOTO_UNTREATED).Start();//调用相机拍照,照相后返回高清原图相片
/*photoFactory.FactoryStart().SetStartType(PhotoFactory.TYPE_PHOTO_AUTO_COMPRESS).Start();//调用相机拍照,照相后返回系统自动压缩过的相片
photoFactory.FactoryStart().SetStartType(PhotoFactory.TYPE_PHOTO_FROM_GALLERY).Start();//从本地相册中选取图片*/

获取相片bitmap或uri

/**
 * 在onActivityResult中调用此方法
 */
photoFactory.FactoryFinish(requestCode,resultCode,data).GetBitmap();
//photoFactory.FactoryFinish(requestCode,resultCode,data).GetUri();

就这么简单,当然,你还可以对照片进行压缩处理,这里提供了三种压缩的方式

addScaleCompress(int w, int h)//按目标宽高缩放
addScaleCompress(int scale)//等比例缩放,缩放比为 原图:新图 = scale:1
addQualityCompress(int targetSize)//质量压缩,targetSize为目标大小

你可以选择其中一种或多种压缩方式对相片进行压缩,例如

//只选择一种压缩方式
photoFactory.FactoryFinish(requestCode,resultCode,data)
	    .addQualityCompress(128)
	    .GetBitmap();
	    
//按顺序逐步压缩
photoFactory.FactoryFinish(requestCode,resultCode,data)
	    .addQualityCompress(128)
	    .addScaleCompress(5)
	    .addScaleCompress(300,300)
	    .GetBitmap();

完整示例

PhotoFactory 兼容了 Android 7.0 FileProvider 获取相片 uri 的问题,当然具体 Provider 的配置以及 Android 6.0的动态权限管理 需要大家在项目中自行完成。这里为了方便大家完成配置,我将完整的流程贴出来供大家参考

1.在Github下载photofactory library并导入到你的项目中

地址: AnliaLee/PhotoFactory

2. 在res\xml目录中创建provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

3. 在AndroidManifest.xml中添加相应权限及配置Provider

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
	android:icon="@mipmap/ic_launcher"
	...
	>
	<provider
		android:name="android.support.v4.content.FileProvider"
		android:authorities="${applicationId}.provider"
		android:exported="false"
		android:grantUriPermissions="true">
		<meta-data
			android:name="android.support.FILE_PROVIDER_PATHS"
			android:resource="@xml/provider_paths" />
	</provider>
	...
</application>

4. 在AndroidManifest.xml中添加相应权限及配置Provider

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
	android:icon="@mipmap/ic_launcher"
	...
	>
	<provider
		android:name="android.support.v4.content.FileProvider"
		android:authorities="${applicationId}.provider"
		android:exported="false"
		android:grantUriPermissions="true">
		<meta-data
			android:name="android.support.FILE_PROVIDER_PATHS"
			android:resource="@xml/provider_paths" />
	</provider>
	...
</application>

5. 在Activity中进行动态权限管理以及使用PhotoFactory

public class PhotoTestActivity extends AppCompatActivity {
    private Button btnPhoto;
    private ImageView imgPhoto;
    private PhotoFactory photoFactory;

    @Override
    protected void






请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  香港偶遇王校长
11 小时前
开发者全社区  ·  吃瓜!华x公司渣男天花板
19 小时前
开发者全社区  ·  大瓜!顶流男星
昨天
开发者全社区  ·  顶流男星大瓜?
2 天前
中国证券经纪人协作网  ·  一个非常残酷的现实,房地产把中产阶级消灭了
7 年前