概述
该项目是我方参与整个APP的部分模块开发,将开发好得功能以SDK的方式提供给APP调用。开发任务比较简单,主要问题出在sdk集成上面,下面记录开发中遇到的问题,还有部分关键技术。
技术点
视频播放
需求:支持视屏播放,在线播放、快进、定位、调节音量、本地播放;需要支持常见的格式
基于该需求,原生的Media框架已经不再能适应,于是寻找到了业内广泛使用的ijkPlayer,并基于该库封装的GSYVideoPlayer,使用很简单,Demo比较全面。有一个问题是该库中引用到了22.2.1的RecycleView,如果自身项目中的RecycleView库版本不一致,就会有类加载异常的问题。不过刚看了一下,库的作者已经更新了supportLibraryVersion,所以大胆用吧。
该库采用的ffmpeg支持了市面上大多数的音视频格式;视频在线播放,缓存处理的都比较恰当,有兴趣的看官可以自行去研究。
Git:
https://github.com/Bilibili/ijkplayer
https://github.com/CarGuo/GSYVideoPlayer
列表下载
需求:多任务同时下载,断点续传,下载历史
思路:主要就是线程、持久化两个点。一个task代表一条下载任务,占用一条线程;利用SqlLite 保存任务下载状态;APP被关闭时保存当前下载任务的状态;APP启动是的时候查询下载任务。这里就先不介绍我的实现代码了。介绍两个三方库,思路更加清晰。
类似IOS浮动圆点菜单
需求:类似IOS的界面圆形Menu,支持滑动,支持json配置
思路:自定义控件,拦截触摸事件,移动View
类代码如下
package com.webber.mcorelibspace.demo.core;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android_mobile.core.utiles.Lg;
import com.android_mobile.core.utiles.Utiles;
import com.webber.mcorelibspace.R;
/**
* Created by mxh on 2017/6/19.
* Describe:滑动菜单圆点
*/
public class SlidMenuBar extends FrameLayout {
private int mLimitSize = 10;
private ImageView imageView;
private int maxW;
private int maxH;
public SlidMenuBar(Context context) {
this(context, null);
}
public SlidMenuBar(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public SlidMenuBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
int mDeviceHeight = Utiles.getScreenHeight(context);
int mDeviceWidth = Utiles.getScreenWidth(context);
int mDevicesStatusBar = Utiles.getStatusBarHeight(context);
imageView = new ImageView(context);
FrameLayout.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
imageView.setBackgroundResource(R.mipmap.ic_launcher);
imageView.setOnTouchListener(new OnTouchListener() {
float mCurrentX = 0;
float mCurrentY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mCurrentX = event.getRawX();
mCurrentY = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float mMoveX = event.getRawX() - mCurrentX;
float mMoveY = event.getRawY() - mCurrentY;
//校验是否符合触发距离
if (Math.abs(mMoveX) > mLimitSize || Math.abs(mMoveY) > mLimitSize) {
FrameLayout.LayoutParams lp = (LayoutParams) imageView.getLayoutParams();
lp.topMargin += event.getRawY() - mCurrentY;
lp.leftMargin += event.getRawX() - mCurrentX;
judgeMargin(lp);
imageView.setLayoutParams(lp);
}
mCurrentX = event.getRawX();
mCurrentY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
//抬起后修正边界
float mUpX = mCurrentX = event.getRawX();
float mUpY = mCurrentY = event.getRawY();
break;
}
invalidate();
return true;
}
});
imageView.measure(0, 0);
maxW = mDeviceWidth - imageView.getMeasuredWidth();
maxH = mDeviceHeight - imageView.getMeasuredHeight() - mDevicesStatusBar;
Lg.print("webber", maxW + "," + maxH);
addView(imageView, lp);
}
private void judgeMargin(LayoutParams lp) {
if (lp.leftMargin >= maxW) {
lp.leftMargin = maxW;
}
if (lp.leftMargin <= 0) {
lp.leftMargin = 0;
}
if (lp.topMargin >= maxH) {
lp.topMargin = maxH;
}
if (lp.topMargin <= 0) {
lp.topMargin = 0;
}
}
}
问题
- SDK集成问题aar
- jar包冲突
- 资源文件、清单文件合并冲突
问题主要体现在包合并上,已经新开一篇来记录,详情请看
Android 打包、资源合并问题 “Manifest merger failed with multiple errors” and “Could not expand ZIP”