一、开发内容简介
最近课程要求仿照华为系统相册做一个android相册客户端,我称之为智能相册(智能是指其使用了机器学习的人脸识别、人脸检测和分类算法)。本着反正实验报告写了也是写了的心态,还有自己在写的过程中搜索资料的时候发现其实好像有关于相册列表获取这部分内容网上讲的其实挺少的,虽然我的办法并不是多么高明,在这里还是给大家分享一下,希望能对一些人起到帮助。二、开发内容要求
智能相册APP参照华为系统相册的样式和功能,主要分为三部分内容:- 照片:显示手机存储的所有图片
- 相册:将手机的所有图片按不同的相册分类,点击各个相册查看其包含图片
- 分类:根据智能算法对手机存储中的所有图片进行整理与分类,例如“人像”、“地点”、“事物”等
华为系统相册样式如下:
三、智能相册效果展示
四、开发过程详述
(1)顶部导航栏的实现
顶部导航栏借用了github上的一个开源第三方库wasabeef/awesome-android-ui实现,选取其中的SmartTabLayout控件,注意这里有andoridx和legacy android support library版本,我选取的是legacy android support library版本,具体实现如下:- build.gradle文件添加依赖
dependencies {
compile 'com.ogaclejapan.smarttablayout:library:1.7.0@aar'
//Optional: see how to use the utility.
compile 'com.ogaclejapan.smarttablayout:utils-v4:1.7.0@aar'
//Deprecated since 1.7.0
compile 'com.ogaclejapan.smarttablayout:utils-v13:1.7.0@aar'
}
- activity_main.xml文件添加代码如下:
<com.ogaclejapan.smarttablayout.SmartTabLayout
android:id="@+id/viewpagertab"
android:layout_width="match_parent"
android:layout_height="48dp"
app:stl_indicatorAlwaysInCenter="false"
app:stl_indicatorWithoutPadding="false"
app:stl_indicatorInFront="true"
app:stl_indicatorInterpolation="smart"
app:stl_indicatorGravity="bottom"
app:stl_indicatorColor="#40C4FF"
app:stl_indicatorThickness="3dp"
app:stl_indicatorWidth="auto"
app:stl_indicatorCornerRadius="2dp"
app:stl_overlineColor="@color/white"
app:stl_overlineThickness="0dp"
app:stl_underlineColor="@color/white"
app:stl_underlineThickness="1dp"
app:stl_dividerColor="@color/white"
app:stl_dividerThickness="1dp"
app:stl_defaultTabBackground="?attr/selectableItemBackground"
app:stl_defaultTabTextAllCaps="true"
app:stl_defaultTabTextColor="#FC000000"
app:stl_defaultTabTextSize="16sp"
app:stl_defaultTabTextHorizontalPadding="50dp"
app:stl_defaultTabTextMinWidth="50dp"
app:stl_distributeEvenly="true"
app:stl_clickable="true"
app:stl_titleOffset="24dp"
app:stl_drawDecorationAfterTab="false"
/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_marginTop="48dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/viewpagertab"
/>
- MainActivity.java文件设置Adapter和ViewPager,代码如下:
FragmentPagerItemAdapter adapter = new FragmentPagerItemAdapter(
getSupportFragmentManager(), FragmentPagerItems.with(this)
.add("照片", PageFragment1.class)
.add("相册", PageFragment2.class)
.add("发现", PageFragment3.class)
.create());
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
viewPagerTab.setViewPager(viewPager);
到这里就顺利完成了顶部导航栏的实现。
(2)实现照片栏展示手机存储中的所有图片
要展示手机中存储的所有图片,首先我们需要成功获取到手机中所有图片的路径,通过图片路径访问图片并把图片加载出来。这个功能的实现主要分为以下几个步骤:- 动态申请读取存储权限
public static void verifyStoragePermissions(Activity activity) {
try {
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
}catch (Exception e) {
e.printStackTrace();
}
}
- 读取手机存储查找所有图片并存储图片路径以及其他相关信息。
- 首先,我定义了一个数据类SpacePhoto用于存储每张图片的相关信息(路径,名称等),SpacePhoto数据类实现了Parcelable类,Parcelable用来从一个组件传输高性能数据到另一个组件,在这里,我们将图片的URL从相册的缩略图界面传递至SpacePhotoActivity。SpacePhoto数据类定义如下:
public class SpacePhoto implements Parcelable { private String mUrl; private String mTitle; public SpacePhoto(String url, String title) { mUrl = url; mTitle = title; } protected SpacePhoto(Parcel in) { mUrl = in.readString(); mTitle = in.readString(); } public static final Creator<SpacePhoto> CREATOR = new Creator<SpacePhoto>() { @Override public SpacePhoto createFromParcel(Parcel in) { return new SpacePhoto(in); } @Override public SpacePhoto[] newArray(int size) { return new SpacePhoto[size]; } }; public String getUrl() { return mUrl; } public void setUrl(String url) { mUrl = url; } public String getTitle() { return mTitle; } public void setTitle(String title) { mTitle = title; } @Override public int