android仿华为系统相册之智能相册开发

本文详细介绍了如何开发一个仿华为系统风格的智能相册应用,包括实现顶部导航栏、显示所有照片、根据算法分类相册以及处理权限问题。开发者使用ContentResolver查询图片,Glide库加载图片,Recyclerview展示列表,并通过自定义Adapter实现图片点击跳转。此外,还通过分析图片路径实现相册分类,并展示了如何重写Application类以管理全局数据。
摘要由CSDN通过智能技术生成

一、开发内容简介

最近课程要求仿照华为系统相册做一个android相册客户端,我称之为智能相册(智能是指其使用了机器学习的人脸识别、人脸检测和分类算法)。本着反正实验报告写了也是写了的心态,还有自己在写的过程中搜索资料的时候发现其实好像有关于相册列表获取这部分内容网上讲的其实挺少的,虽然我的办法并不是多么高明,在这里还是给大家分享一下,希望能对一些人起到帮助。

二、开发内容要求

智能相册APP参照华为系统相册的样式和功能,主要分为三部分内容:
  • 照片:显示手机存储的所有图片
  • 相册:将手机的所有图片按不同的相册分类,点击各个相册查看其包含图片
  • 分类:根据智能算法对手机存储中的所有图片进行整理与分类,例如“人像”、“地点”、“事物”等

华为系统相册样式如下:

三、智能相册效果展示

四、开发过程详述

(1)顶部导航栏的实现

顶部导航栏借用了github上的一个开源第三方库wasabeef/awesome-android-ui实现,选取其中的SmartTabLayout控件,注意这里有andoridx和legacy android support library版本,我选取的是legacy android support library版本,具体实现如下:
  1. 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'
} 
  1. 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"
        />

  1. 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)实现照片栏展示手机存储中的所有图片

要展示手机中存储的所有图片,首先我们需要成功获取到手机中所有图片的路径,通过图片路径访问图片并把图片加载出来。这个功能的实现主要分为以下几个步骤:
  1. 动态申请读取存储权限
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();
        }
    }
  1. 读取手机存储查找所有图片并存储图片路径以及其他相关信息。
  • 首先,我定义了一个数据类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 
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值