美文网首页我爱编程
Android知识串联—主动/隐式上传相册

Android知识串联—主动/隐式上传相册

作者: PrivateEye_zzy | 来源:发表于2018-06-27 15:16 被阅读0次

本章涉及知识点

1、前言

2、案例流程

3、遍历SD卡相册目录

4、OKHttp3批量上传

5、Loading动画的启动和关闭

6、BroadcastReceiver广播组件

7、唤醒第三方App

8、AccessibilityService服务组件

9、案例结果演示

10、心得体会

一、前言

笔者7年没开发Android了,今天突然有兴致想写写原生Android代码,顺便回忆一下Android开发的配置,四大组件通信逻辑,和服务器交互逻辑等,为此写了个小案例将上述的知识点串联起来,当做一个知识回顾吧

二、案例流程

我们写一个案例demo,分两个场景来串联知识点

(1)主动上传:这个非常简单,用Activity实现即可,用户点击上传按钮,带动画的一键上传相册到服务器

(2)隐式上传:为了同时串联BroadcastReceiver和AccessibilityService,我们创建一个场景,监听手机网络状态,当网络改变时,唤醒第三方应用App,并在打开App后上传相册到服务器

三、遍历SD卡相册目录

首先获得SD卡的根路径,数码相机拍摄到照片一般位于/DCIM/Camera文件夹中,得到所有图片路径后返回列表

从SD卡获取所有的图片资源

封装出提取相册照片路径的方法

遍历出SD卡相册所有照片的路径

四、OKHttp3批量上传

得到相册列表路径后,我们需要批量上传到服务器持久化,这里我们使用OKHttp3来做httpClient请求网络,而请求的方法分为同步请求和异步请求

(1)同步请求:需要显示的开启子线程,请求成功后需要跳转到UI线程修改UI

(2)异步请求:不用显示的开启子线程,但是回调方法是执行在子线程中,所以请求成功后也需要跳转到UI线程修改UI

这里我们选择异步的post请求来做图片批量上传

批量上传照片

我们以formdata的形式来提交表单数据,并在回调函数里接收服务器返回的结果,由于在得到服务器结果后可能需要更新UI(如关闭loading动画等),而回调函数是执行在子线程中,所以我们如果需要在此时更新UI,需要跳转到UI线程,这里我们使用Android的handler来传递/监听消息来在UI线程里更新UI

贴上后端批量上传接口,这里我们用NodeJS来实现

后端批量上传接口

五、Loading动画的启动和关闭

主要运用在主动上传相册的场景中,需要用户点击上传按钮后,伴随着批量上传数据和显示loading动画,而在接收到服务器结果后(如上传成功)需要关闭loading动画

关于遮罩层,我们单独封装出一个类LoadingDialog来继承原生AlertDialog类,并在该类中引入动画

遮罩层+loading动画

关于loading动画,这里我们选择所用第三方AVLoadingIndicatorView来做加载动画,并在配置文件里完成注册

LoadingDialog的配置文件

我们简单编写一个继承AppCompatActivity类的photoUploadActivity来做主动上传相册的前端界面

主动上传相册Activity

我们在点击按钮的时候,启动遮罩层动画,在做完一系列逻辑提交后,用handler来接收消息(字线程中异步函数传递消息)关闭遮罩层动画,其配置文件为

photoUploadActivity的配置文件

以上知识部分我们就完成了主动提交相册的场景,接下来我们来做隐式提交的场景

六、BroadcastReceiver广播组件

根据案例流程,我们首先需要监听网络状态,为此我们引入BroadcastReceiver来做广播

首先在AndroidMainifest里注册广播接收器

广播接收器注册

在action里我们注册监听了网络状态变化的行为,然后我们编写MyReceiver类继承BroadcastReceiver

MyReceiver类

在这个类里,我们在注册好的广播里,接收网络状态变化并唤醒第三方App,这里我随便选择了阿里钉钉

七、唤醒第三方App

我们单独封装出该方法,通过packageManager来打开包名对应的第三方App

唤醒第三方App

八、AccessibilityService服务组件

接下来为了串联AccessibilityService知识,我们简单在打开的第三方App里,进行一些自动化操作(和python的Selenium相似),这里演示在进入钉钉主页后,点击工作按钮进入工作页面

AccessibilityService获取界面组件有两种方法

(1)findAccessibilityNodeInfosByViewId:根据Android组件的ID来获取组件,如果是动态ID,需要在Hierarchy View查看对应view的ID,这里就不展开了

(2)findAccessibilityNodeInfosByText:根据Android组件的value来获取组件,注意是模糊搜索,得到的组件是一个列表

尤其注意一点,AccessibilityService只能过去原生Android组件,所以如果界面使用webview开发的,那么我们只能获取到webview组件,对于webview中html或者Javascript写的dom,AccessibilityService是无法获取到的!比如钉钉的工作界面里的九宫格布局(包含签到按钮),就是用webview来load网页的

首先在AndroidMainifest里注册AccessibilityService服务

注册AccessibilityService

在项目的res/xml下新建关于AccessibilityService的配置文件

AccessibilityService的配置文件

这里响应的事件是全局事件typeAllMask,使用通用的反馈feedbackGeneric,注意要设置canRetrieveWindowContent=true,这样才可以获取到界面的根节点

接下来我们编写MyAccessibility类继承AccessibilityService,通过实现onAccessibilityEvent方法来接收监听到的事件执行业务代码,业务代码很简单,通过index来switch到相应的逻辑处理,如index=1执行模拟点击app的按钮进入相应的页面,index=2执行隐式上传相册图片到服务器

MyAccessibility类 通过文字执行点击操作 遍历可点击按钮

九、案例结果演示

主动上传相册结果

主动上传相册结果

当网络状态改变时,自动打开第三方App

网络状态改变打开第三方

模拟自动化点击App中的工作按钮,进入工作界面

自动化点击App中的工作按钮

隐式上传相册

隐式上传相册

十、心得体会

写这个案例的目的就是回顾一下Android编程的风格和各个组件的注册、监听和通信,把OKHttp3、BroadcastReceiver、AccessibilityService等知识串联起来运用

最后从开发者的角度来说,原生Android的功能确实很强大,在实际项目里原生Android做功能强交互,webview做信息展示UI可以得到很好的开发体验,当然root后结合比如Xposed框架更能可以产生更多的黑魔法

案例代码见:Android知识串联—主动/隐式上传相册

相关文章

网友评论

    本文标题:Android知识串联—主动/隐式上传相册

    本文链接:https://www.haomeiwen.com/subject/hxbpyftx.html