- 1.把aar文件复制到libs文件夹下,名字可以修改,默认名字是:camsgearlibrary-release.aar
- 2.在app 的gradle文件中增加引用:
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile(name:'camsgearlibrary-release', ext:'aar')
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
}- 3.在AndroidManifest.xml文件中增加权限:
<uses-permission android:name="android.permission.INTERNET" />- 4.是否打印Log。建议在Application或者MainActivity的onCreate方法中设置,代码:
// 开启后也会打印okhttp的Log,
// 所以要在app文件夹下的build.gradle文件中增加 compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
LogUtil.setEnableDebug(true);- 5.设置应用Key。建议在Application或者MainActivity的onCreate方法中设置,代码:
// 应用Key是从服务器获取数据时必需的标识,该Key可以在我们的后台http://admin.camdora.me申请。如有疑问可以联系我们
Utils.setAppKey("WkTU9McNCYKduv80Ld6OQLsW");ImageModel.java 图片列表接口
获取图片列表信息,用于第一次请求图片列表数据。
public void initData(Context context, int limit, int orderBy, final ImageListCallback mImageListCallback)context- 上下文变量limit- 请求的数据个数orderBy- 可取值为MyVideoUtil.DESC(根据时间倒序排序)、 MyVideoUtil.ASC(根据时间顺序排序)mImageListCallback- 回调接口,访问服务器成功调用onSuccess(List<ImageModelBean> mData),mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
ImageModel.getInstance().initData(this, limit, MyVideoUtil.DESC, new ImageModel.ImageListCallback() {
@Override
public void onSuccess(List<ImageModelBean> list) {
}
@Override
public void onFailure(int i) {
}
});刷新图片列表信息,用于获取最新的数据。 3.0的api对刷新操作做了修改,获取数据时已经不需要id了,使用limit限制获得数据个数。 现在刷新会一直获取最新的数据,已经不是id之前的数据了,所以显示刷新数据时要把list清空, 否则数据会重复。所以现在的初始化操作就可以使用刷新代替了,initData和refreshData功能一样了
public void refreshData(Context context, int orderBy, int limit, final ImageModel.ImageListCallback mImageListCallback)context- 上下文变量orderBy- 可取值为MyVideoUtil.DESC(根据时间倒序排序)、 MyVideoUtil.ASC(根据时间顺序排序)limit- 请求的数据个数mImageListCallback- 回调接口,访问服务器成功调用onSuccess(List<ImageModelBean> mData),mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
ImageModel.getInstance().refreshData(this, MyVideoUtil.DESC, 30, new ImageModel.ImageListCallback() {
@Override
public void onSuccess(List<ImageModelBean> list) {
}
@Override
public void onFailure(int i) {
}
});加载图片列表信息,用于分页加载后面的数据,会返回比传入的id号更旧的数据
public void loadData(Context context, int limit, int orderBy, String id, final ImageListCallback mImageListCallback)context- 上下文变量limit- 请求的数据个数orderBy- 可取值为MyVideoUtil.DESC(根据时间倒序排序)、 MyVideoUtil.ASC(根据时间顺序排序)id- 加载的参考值,获取比该id号更旧的数据mImageListCallback- 回调接口,访问服务器成功调用onSuccess(List<ImageModelBean> mData),mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
ImageModel.getInstance().loadData(this,limit, MyVideoUtil.ALL, "id", new ImageModel.ImageListCallback() {
@Override
public void onSuccess(List<ImageModelBean> list) {
}
@Override
public void onFailure(int i) {
}
});VideoModel.java 视频列表、点赞和详情接口
获取视频列表信息,用于第一次请求视频列表数据。
public void initData(int myVideo, Context context, int limit, int orderBy, final VideoListCallback videoListCallback)myVideo- 可取值为MyVideoUtil.ALL(获取视频数据)、 MyVideoUtil.MY_PUBLISH(获取自己发布的数据)、 MyVideoUtil.MY_COLLECTION(获取自己收藏的数据)context- 上下文变量limit- 请求的数据个数orderBy- 可取值为MyVideoUtil.DESC(根据时间倒序排序)、 MyVideoUtil.ASC(根据时间顺序排序)videoListCallback- 回调接口,访问服务器成功调用onSuccess(List<VideoModelBean> mData),mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
VideoModel.getInstance().initData(MyVideoUtil.ALL, this, 10, MyVideoUtil.DESC,
new VideoModel.VideoListCallback() {
@Override
public void onSuccess(List<VideoModelBean> list) {
}
@Override
public void onFailure(int i) {
}
});刷新视频列表信息,用于获取最新的数据。 3.0的api对刷新操作做了修改,获取数据时id可以为空,使用limit限制获得数据个数。 现在刷新会一直获取最新的数据,已经不是id之前的数据了,所以显示刷新数据时要把list清空, 否则数据会重复。所以现在的初始化操作就可以使用刷新代替了,initData和refreshData功能一样了。 这里保留id字段是因为获取个人收藏、发布等数据时,获取的是id之前的最新数据。 获取所有数据时(MyVideoUtil.ALL),id可以传空值。
public void refreshData(int myVideo, Context context, int orderBy, String id, int limit, final VideoListCallback videoListCallback)myVideo- 可取值为MyVideoUtil.ALL(获取视频数据)、 MyVideoUtil.MY_PUBLISH(获取自己发布的数据)、 MyVideoUtil.MY_COLLECTION(获取自己收藏的数据)context- 上下文变量orderBy- 可取值为MyVideoUtil.DESC(根据时间倒序排序)、 MyVideoUtil.ASC(根据时间顺序排序)id- 刷新的参考值,获取所有比该id号更新的数据limit- 请求的数据个数videoListCallback- 回调接口,访问服务器成功调用onSuccess(List<VideoModelBean> mData),mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
VideoModel.getInstance().refreshData(MyVideoUtil.ALL, this, MyVideoUtil.DESC,id,limit,
new VideoModel.VideoListCallback() {
@Override
public void onSuccess(List<VideoModelBean> list) {
}
@Override
public void onFailure(int i) {
}
});加载视频列表信息,用于分页加载后面的数据,会返回比传入的id号更旧的数据
public void loadData(int myVideo, Context context, int limit, int orderBy, String id,final VideoListCallback videoListCallback)myVideo- 可取值为MyVideoUtil.ALL(获取视频数据)、 MyVideoUtil.MY_PUBLISH(获取自己发布的数据)、 MyVideoUtil.MY_COLLECTION(获取自己收藏的数据)context- 上下文变量limit- 请求的数据个数orderBy- 可取值为MyVideoUtil.DESC(根据时间倒序排序)、 MyVideoUtil.ASC(根据时间顺序排序)id- 加载的参考值,获取比该id号更旧的数据videoListCallback- 回调接口,访问服务器成功调用onSuccess(List<VideoModelBean> mData),mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
VideoModel.getInstance().loadData(MyVideoUtil.ALL, this, limit, MyVideoUtil.DESC, id, new VideoModel.VideoListCallback() {
@Override
public void onSuccess(List<VideoModelBean> list) {
}
@Override
public void onFailure(int i) {
}
});视频点赞
public void upVote(Context context, String sid, final VoteCallback voteCallback)context- 上下文变量sid- 给id号为sid的视频点赞voteCallback- 回调接口,访问服务器成功调用onSuccess(VoteBean mData);,mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
VideoModel.getInstance().upVote(this, sid, new VideoModel.VoteCallback() {
@Override
public void onSuccess(VoteBean voteBean) {
}
@Override
public void onFailure(int i) {
}
});取消视频点赞
public void unVote(Context context, String sid, final VoteCallback voteCallback)context- 上下文变量sid- 取消id号为sid的视频点赞voteCallback- 回调接口,访问服务器成功调用onSuccess(VoteBean mData);,mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
VideoModel.getInstance().unVote(this, sid, new VideoModel.VoteCallback() {
@Override
public void onSuccess(VoteBean voteBean) {
}
@Override
public void onFailure(int i) {
}
});获取id号为videoId的视频详情
public void obtainVideoModeBean(Context context, String videoId, final VideoCallback videoCallback)context- 上下文变量videoId- 获取该id号的数据详情videoCallback- 回调接口,访问服务器成功调用onSuccess(VideoModelBean mData);,mData是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
VideoModel.getInstance().obtainVideoModeBean(this, videoId, new VideoModel.VideoCallback() {
@Override
public void onSuccess(VideoModelBean videoModelBean) {
}
@Override
public void onFailure(int i) {
}
});LiveDetailModel.java 直播详情、观看人数接口
获取id号为liveId的直播详情。
public void getLiveDetail(Context context, String liveId, final GetLiveDetailCallback getLiveDetailCallback)context- 上下文变量liveId- 获取该id号的数据详情getLiveDetailCallback- 回调接口,访问服务器成功调用onSuccess(LiveDetailBean liveDetailBean),liveDetailBean是返回的数据,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
LiveDetailModel.getInstance().getLiveDetail(this, liveId, new LiveDetailModel.GetLiveDetailCallback() {
@Override
public void onSuccess(LiveDetailBean liveDetailBean) {
}
@Override
public void onFailure(int i) {
}
});获取id号为liveId的直播观看人数。
public void viewsCount(Context context, String liveId, final ViewsCountCallback viewsCountCallback)context- 上下文变量liveId- 获取该id号的直播观看人数viewsCountCallback- 回调接口,访问服务器成功调用onSuccess(int i),i是观看人数,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
LiveDetailModel.getInstance().viewsCount(this, sid, new LiveDetailModel.ViewsCountCallback() {
@Override
public void onSuccess(int i) {
}
@Override
public void onFailure(int i) {
}
});LoginAndRegisterModel.java 登录、获取验证码接口
获取手机验证码。
public void getVerificationCode(Context context, String phone, final LoginAndRegisterCallback loginAndRegisterCallback)context- 上下文变量phone- 手机号码loginAndRegisterCallback- 回调接口,访问服务器成功调用onSuccess(),访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
LoginAndRegisterModel.getInstance().getVerificationCode(this, phone, new LoginAndRegisterModel.LoginAndRegisterCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailure(int i) {
}
});使用手机号登录。
public void loginOrRegister(final Context context, String name, String phone, String verifyingCodes, final LoginCallback loginCallback)context- 上下文变量name- 昵称(可以为"")phone- 手机号码verifyingCodes- 验证码loginCallback- 回调接口,访问服务器成功调用onSuccess(UserBean userBean),userBean是用户信息,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
LoginAndRegisterModel.getInstance().loginOrRegister(this, name, phone, verifyingCodes, new LoginAndRegisterModel.LoginCallback() {
@Override
public void onSuccess(UserBean userBean) {
//登陆成功后更新一下本地登录状态
String rongYunToken = "";
if(user.getChatServer() != null){
rongYunToken = user.getChatServer().getToken();
}
UserManager.getInstance().updateUser(context, user.getToken(),
rongYunToken,UserManager.ROLE_USER, user.getId());
}
@Override
public void onFailure(int i) {
}
});PersonalModel.java 当前登录用户信息接口
获取当前登录用户的详细信息。
public void getUserInfor(Context context, final GetPersonalInforCallback getPersonalInforCallback)context- 上下文变量getPersonalInforCallback- 回调接口,访问服务器成功调用onSuccess(UserInforBean userInforBean),userInforBean是用户的详细信息,访问服务器失败调用onFailure(int code),code表示失败的信息,详情请参考ErrorUtil.java
PersonalModel.getInstance().getUserInfor(this, new PersonalModel.GetPersonalInforCallback() {
@Override
public void onSuccess(UserInforBean userInforBean) {
}
@Override
public void onFailure(int i) {
}
});UserManager.java 获取登录状态、创建匿名用户接口
获取当前登录状态。
public String isLogin(Context context)context- 上下文变量
null为没有登录,UserManager.ROLE_ANON为匿名登录,UserManager.ROLE_USER为注册用户登录。
String role = UserManager.getInstance().isLogin(this.getActivity());
if(role == null || role.equals("")){
UserManager.getInstance().createAnonymous(this);
}else if(role.equals(UserManager.ROLE_ANON)){
}else if(role.equals(UserManager.ROLE_USER)){
}创建匿名用户。当前没有登录时应该创建匿名用户。
public void createAnonymous(final Context context)context- 上下文变量
String role = UserManager.getInstance().isLogin(this.getActivity());
if(role == null || role.equals("")){
UserManager.getInstance().createAnonymous(this);
}退出登录。执行该函数会清除登录信息并创建一个匿名用户。
public void signOut(Context context)context- 上下文变量
UserManager.getInstance().signOut(this);第三方授权使用友盟SDK,具体集成步骤请参考友盟社会化分享文档:http://dev.umeng.com/social/android/quick-integration
//调用微信授权借口
mShareAPI = UMShareAPI.get(this);
mShareAPI.getPlatformInfo(this, SHARE_MEDIA.WEIXIN, umAuthListener);
//返回授权信息
private UMAuthListener umAuthListener = new UMAuthListener() {
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
LogUtil.i(TAG,"平台:"+platform);
if(platform == SHARE_MEDIA.WEIXIN){
WechatLoginBean bean = new WechatLoginBean(data.get("unionid"),
data.get("gender"), data.get("screen_name"),data.get("openid"),
data.get("language"),data.get("profile_image_url"),
data.get("country"),data.get("city"),data.get("province"));
//微信授权后登录
wechatLogin(bean);
}
showToast(getString(R.string.authorize_succeed));
}
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
showToast(getString(R.string.authorize_fail));
}
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
showToast(getString(R.string.authorize_cancel));
}
};
private void wechatLogin(WechatLoginBean mWechatLoginBean){
LoginAndRegisterModel.getInstance().wechatLogin(this, mWechatLoginBean, new LoginAndRegisterModel.LoginCallback() {
@Override
public void onSuccess(UserBean userBean) {
//登陆成功后更新一下本地登录状态
String rongYunToken = "";
if(user.getChatServer() != null){
rongYunToken = user.getChatServer().getToken();
}
UserManager.getInstance().updateUser(context, user.getToken(),
rongYunToken,UserManager.ROLE_USER, user.getId());
}
@Override
public void onFailure(int i) {
}
});
} UploadImagesToServerModel.java 发布、更新图片接口
- 1.获取临时凭证
- 2.判断图片是否已经发布过
- 3.上传图片、封面
- 4.在服务器上创建或更新图片
判断图片是否上传过。
public void isImagesBelongToMe(Retrofit retrofit, String originId ,final IsBelongToMeCallback mIsBelongToMeCallback)retrofit- 访问网络originId- 图片的IDmIsBelongToMeCallback- 回调接口
private void isBelongToMe(String id){
//获取视频是否存在
UploadImagesToServerModel.getInstance().isImagesBelongToMe(Utils.getServerAccessRetrofit(this), id, new UploadImagesToServerModel.IsBelongToMeCallback() {
@Override
public void onSuccess(boolean b) {
}
@Override
public void onFailure(int i) {
}
});
}创建图片。
public void createImages(Retrofit retrofit, UploadImageBean body, final UploadImageCallback mUploadImageCallback)retrofit- 访问网络body- 图片的信息mUploadImageCallback- 回调接口
更新图片。
public void updateImages(Retrofit retrofit, String originId, UploadImageBean body, final UploadImageCallback mUploadImageCallback)retrofit- 访问网络originId- 图片的IDbody- 图片的信息mUploadImageCallback- 回调接口
UploadToServerModel.java 发布、更新视频接口
- 1.获取临时凭证
- 2.判断视频是否已经发布过
- 3.上传视频、封面
- 4.在服务器上创建或更新视频
获取获取临时凭证。
public void getOssSTS(Context context, final GetOssSTSCallback getOssSTSCallback)context- 上下文变量getOssSTSCallback- 回调接口
UploadToServerModel.getInstance().getOssSTS(this, new UploadToServerModel.GetOssSTSCallback() {
@Override
public void onSuccess(OssSTSBean ossSTSBean) {
mOssSTSBean = ossSTSBean;
String id = "";//视频的ID
isBelongToMe(id);
}
@Override
public void onFailure(int i) {
}
});判断视频是否上传过。
public void isBelongToMe(Context context, String originId, final IsBelongToMeCallback isBelongToMeCallback)context- 上下文变量originId- 视频的IDisBelongToMeCallback- 回调接口
private void isBelongToMe(String id){
//获取视频是否存在
UploadToServerModel.getInstance().isBelongToMe(this, id, new UploadToServerModel.IsBelongToMeCallback() {
@Override
public void onSuccess(boolean b) {
if(b){
//视频已经存在,执行更新操作
}else {
//视频不存在,执行创建操作
uploadVideo();//上传视频
}
}
@Override
public void onFailure(int i) {
}
});
}上传视频。
public void uploadVideo(Context context,final OssSTSBean bean,String mVideoName, String mVideoPath,final UploadTaskCallback uploadTaskCallback)context- 上下文变量bean- 临时凭证(使用getOssSTS获取)mVideoName- 视频的名字mVideoPath- 视频的绝对路径uploadTaskCallback- 回调接口
void uploadVideo(){
UploadToServerModel.getInstance().uploadVideo(this, mOssSTSBean, "", "", new UploadToServerModel.UploadTaskCallback() {
@Override
public void onProgress(PutObjectRequest putObjectRequest, long l, long l1) {
Log.i(TAG,l+" "+l1);
}
@Override
public void onSuccess(PutObjectRequest putObjectRequest, PutObjectResult putObjectResult) {
UploadVideoBean body = new UploadVideoBean();
body.setOriginId(id);
body.setTitle("testMKVTitle");
//MediaInfo 按照如下格式填写
UploadVideoBean.CamdoraMediaInfoBean mediaInfoBean = new UploadVideoBean.CamdoraMediaInfoBean(1, 1080, 2160, 210, 0, 0, 1, 1, false);
body.setCamdoraMediaInfo(mediaInfoBean);
body.setPublished(true);
body.setOrigin(new UploadVideoBean.OriginBean("videos/" + id + ".mp4"));
body.setVideoType(StringUtil.getVideoType(StringUtil.VIDEO_TYPE_PANORAMA));
//MetaData按照真实视频的长宽以及长度和大小填写
UploadVideoBean.MetadataBean metadataBean = new UploadVideoBean.MetadataBean(720, 1280, 3, 300);
body.setMetadata(metadataBean);
createVideo(body);
}
@Override
public void onFailure(PutObjectRequest putObjectRequest, ClientException e, ServiceException e1) {
}
});
}上传封面。
public void uploadCover(Context context, final OssSTSBean bean, String mVideoThumbnailName, String mVideoThumbnailPath, final UploadTaskCallback uploadTaskCallback)context- 上下文变量bean- 临时凭证(使用getOssSTS获取)mVideoThumbnailName- 封面的名字mVideoThumbnailPath- 封面的绝对路径uploadTaskCallback- 回调接口
创建视频。
public void createVideos(Context context, UploadVideoBean body, final UploadVideoCallback uploadVideoCallback)context- 上下文变量body- 视频的信息uploadVideoCallback- 回调接口
void createVideo(UploadVideoBean body){
UploadToServerModel.getInstance().createVideos(this, body, new UploadToServerModel.UploadVideoCallback() {
@Override
public void onSuccess(VideoModelBean videoModelBean) {
//上传的视频地址在:videoModelBean.origin.oss
}
@Override
public void onFailure(int i) {
}
});
}更新视频。
public void updateVideos(Context context, String originId, UploadVideoBean body, final UploadVideoCallback uploadVideoCallback)context- 上下文变量originId- 视频的IDbody- 视频的信息uploadVideoCallback- 回调接口
ErrorUtil.java 错误信息接口
public final static int ACCESS_NETWORK_ERROR = -1;//访问网络出错。
public final static int DATA_ERROR = -2;//返回的数据有问题,或许解析json出错
public final static int BAD_REQUEST = 400;//错误的请求 该请求是无效的。相应的描述信息会说明原因。
public final static int NOT_AUTHENTICATED = 401;//未验证 没有验证信息或者验证失败。
public final static int FORBIDDEN = 403;//被拒绝 理解该请求,但不被接受。相应的描述信息会说明原因。
public final static int NOT_FOUND = 404;//无法找到 资源不存在,请求的用户的不存在,请求的格式不被支持。
public final static int METHOD_NOT_ALLOWED = 405;//请求方法不合适 该接口不支持该方法的请求。
public final static int ACCOUNT_HAS_BEEN_BOUND = 409;//该账号已绑定其他用户,请先解绑
public final static int ONLY_HAVE_ONE_CAN_LOGIN_ACCOUNT = 422;//您只有一个可登陆账号,不能再解绑
public final static int TOO_MANY_REQUESTS = 429;//过多的请求 请求超出了频率限制。相应的描述信息会解释具体的原因。
public final static int GENERAL_ERROR = 500;//内部服务错误 服务器内部出错了。请联系我们尽快解决问题。
public final static int BAD_GATEWAY = 502;//无效代理 业务服务器下线了或者正在升级。请稍后重试。
public final static int UNAVAILABLE = 503;//服务暂时失效 服务器无法响应请求。请稍后重试。PersonalModel.getInstance().getUserInfor(this, new PersonalModel.GetPersonalInforCallback() {
@Override
public void onSuccess(UserInforBean userInforBean) {
}
@Override
public void onFailure(int i) {
ErrorUtil.showErrorInfo(this, i);//显示错误信息
}
});