1.个人分工
1.1需求分析阶段
1.撰写综合描述,包括产品状况、功能、设计与实现上的限制。
2.产品LOGO设计。
1.2系统设计阶段
1.撰写模块与代码设计,包括算法设计、数据结构设计等。
2.撰写软件测试。
1.3系统编码阶段
1.对于写废的一版,与佘华扬一起完成客户端开发工作。
2.对于引用第三方开发平台的一版:
(1)学习如何在第三方平台上集成。
(2)完成“牵伴”好友体系集成,包括获取好友列表,监听好友列表等。
(3)完成“牵伴”其他功能的收尾集成工作。
(4)与佘华扬一起完成UI美工。
1.4系统测试与交付阶段
1.与小组成员共同进行测试。
2.完成后续内部外部测试相关工作。
2.遇到的问题及解决办法
2.1Android环境搭建
JDK的安装和配置
|
JDK设置对应三个环境变量
|
Eclipse的安装
|
解压安装
|
Android的SDK文件的下载和安装
|
需把tool路径添加到path环境变量
|
Android 的ADT的安装
|
Eclipse的插件安装,把Eclipse和sdk关联起来
|
最后设置
|
Eclipse设置SDK安装位置;创建AVD(Android 虚拟器)
|
eclipse的版本与ADT、SDK的版本必须是匹配的。无论是低版本的eclipse安装高版本的ADT还是,高版本的eclipse安装低版本的ADT,在安装过程中都会出现conflict而导致不能安装,即使安装过程能够顺利通过,也属于安装不成功,因为在打开eclipse后,eclipse界面当中没有AVD安装成功后应出现的一组功能按钮。
如果eclipse安装了对应版本的ADT。而与SDK版本不匹配,则有可能出现在eclipse在新建android project项目时,找不到android平台版本的情况。
2.2平台选择
最初小组打算用Android studio进行开发,但是全部成员在安装AS之后电脑都卡,甚至有时打开一个项目需要一两个小时,而且作为新手被SDK版本更新之后出现的种种问题弄心力交瘁,恨不得把所有版本都一次下全,但是最终还是有一系列问题。
基于以上,小组最终还是选择了熟悉的Eclipse。虽然Eclipse不是专门针对Android开发的平台,一些功能的配置比较繁琐,但我们的电脑都“带的动”。
2.3模拟器
因安卓模拟器运行太慢,每次启动需要大量时间。
所以我们选择了VirtualBox+genymotion的方式进行运行测试。
2.3第一版
做第一版(最终废掉)时,在技术问题上遇到了较多难题。作为一个新手,我们对Android完全不了解。所以我组决定通过网络课程来学习安卓开发的基本流程。比如说学着先创建一个最简单的Hello world程序,然后大致了解应用程序的布局文件,java文件,配置文件等放在哪个文件夹等。
组员找到一本Android入门的电子书,我们按照着书上的代码,模仿学习。从写一个简单的页面开始,实现简单的事件。
下面将描述遇到的具体问题(不完全):
表2.2.1 问题1
报错:
|
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
|
场景:
|
启动弹窗就报错
|
原因:
|
我的弹窗应使用系统级悬浮窗,但代码中使用了应用级的悬浮窗
|
解决方案:
|
换回合适定义的弹窗即可。
|
表2.2.2 问题2
报错:
|
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged
|
场景:
|
一打开有viewpager的页面就报错
|
原因:
|
在更新adapter的内容后调用一下adapter的notifyDataSetChanged方法,否则在ADT22以上编译程序就会报错。
|
解决方案:
|
每次内容改变后都调用adater的 notifyDataSetChanged方法
|
表2.2.3 问题3
报错:
|
Link of class 'Landroid/support/v7/widget/RecyclerView;' failed
|
场景:
|
使用RecyclerView编译不报错,进入RecyclerView的界面就报错
|
原因:
|
详细细节暂时未知,v7和v4版本不对应,v7要用的部分类v4包没有,经导入v7源码到项目确认的,会有类引用不到。使用网上提供的demo包里面的jar包也会报错。
|
解决方案:
|
sdk\extras\android\m2repository\com\android\support\recyclerview-v7\22.1.1 目录下的recyclerview-v7-22.1.1-sources.jar 解压拿源码到src目录下
|
表2.2.4 问题4
报错:
|
Android界面布局层次过多问题
|
场景:
|
如题
|
原因:
|
使用了TabHost+activity比使用viewpager+fragment多三层布局,这三层布局主要是来自于activity三层父布局。
|
解决方案:
|
除了改用fragment之外还有其他一些技巧可以砍掉两层,最终内容上层布局只剩5层,而大部分手机能支持到12层左右,这样整个布局内容的限制就大大减少了
|
表2.2.5 问题5
报错:
|
Android handler 使用sendEmptyMessage发送消息时总是不会触发消息处理
|
场景:
|
如题
|
原因:
|
需要handleMessage这个方法才会处理题中提到的方法发出的消息,dispatchMessage才是对应Message.obtain(handler, “”).sendToTarget()这种方法的,而且一个handler里面不能同时继承这两个方法,这方面需要继续了解原因。
|
解决方案:
|
集成对应方法做处理即可。
|
表2.2.6 问题6
报错:
|
经常出现退出activity后退出桌面的问题
|
场景:
|
如题
|
原因:
|
应该和使用了getBaseContext方法获取Context并在启动activity时使用了intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)建了一个栈
|
解决方案:
|
使用Activity.this取代getBaseContext
|
表2.2.7 问题7
报错:
|
去除ScrollView,ListView,GridView边缘模糊效果
|
场景:
|
题中三种控件都默认带有边缘模糊效果,就是再这些控件滑动时,跟其他空间的交界处会出现一种半透明的模糊效果,这种效果默认比较宽,影响了原本界面的观感。
|
原因:
|
这个是系统控件默认的效果,我们可以通过设置去掉。
|
解决方案:
|
可以通过下面第一句代码设置竖直方向的模糊效果关闭,第二句可以设置颜色,第三句可以设置宽度。
setVerticalFadingEdgeEnabled(false);
setCacheColorHint(Color.RED);
setFadingEdgeLength(4);
也可以再xml中设置这个属性
android:fadingEdge=“none"
这个效果可以分开竖直和水平方向设置是否启用。
|
表2.2.8 问题8
报错:
|
ScrollView 嵌套 GridView最后一行被显示不全
|
场景:
|
如题
|
原因:
|
未知。
|
解决方案:
|
gridview设置一点paddingBottom可以解决问题,连paddingBottom都可以显示完整。
|
表2.2.9 问题9
报错:
|
Android 如何让EditText不自动获取焦点
|
场景:
|
EditText在进入界面后会抢占焦点,在界面再次显示后会再次抢占焦点。
|
原因:
|
未知。
|
解决方案:
|
android:windowSoftInputMode=“stateHidden" 再manifest.xml设置activity后第一次进入就不会在抢占焦点,但是要返回界面后不会再次抢占就需要 在EditText的父级的同级控件注意不是父级控件中找一个,设置成 android:focusable="true" android:focusableInTouchMode=“true”,这样就会截断其的抢占行为。
|
还有在实现发送语音消息上的问题,语音开发难点:
(1)低延迟,语音通话对延时非常敏感
(2)降低噪声、回声消除,静音检测(省流量)
(3)无服务器,去中心化,全双工P2P通信
我们在网上搜了一些关于语音功能的实现方式,但是在了解完其实现流程后,不能正确有效地与项目现有的功能结合,由于技术有限,在浪费大量时间后还是不能将语音功能和原来写好的功能完全融合。且最后发现选择的开发方式不合适,遂这版作废。惨!
2.4环信版
表2.3.1 问题1
报错:
|
android环信语音通话无法拨通bug
|
场景:
|
如题
|
原因:
|
当主叫这方拨打语音通话过程中,断网,导致ERROR_TRANSPORT(也会执行onCallStateChanged(DISCONNNECTED, ERROR_TRANSPORT))断开连接,之后 再连接上网络拨打电话,此时无法拨通对方,返回过来的ERROR 总是ERROR_BUSY和REJECTED。
|
解决方案:
|
关于断网挂断的问题,客户可以监控网络连接,当网络断开时,调用挂断API;但是另一方收不到挂断通知,所以还会保持通话状态,所以再连上网时无法拨通对方,因为对方还处在通话状态。
|
2.4.1集成登录以及集成登录
集成环信的时候,大部分的api基本都是以代理方法来实现,环信本来也是基于XMPPFramework框架来开发的。添加代理一定不要忘了移除代理。
当第一次登录的时,这个时候isAutoLogin的属性为NO,加载登录界面,当退出以后,在后台将这个应用程序退出(杀死),这时候再次进入,此时isAutoLogin的属性值为Yes那么直接加载主界面。
当自动登录时,是向服务器发送的异步请求,只有当自动登录成功以后,才会去显示主界面,才会去加载“联系人列表”“会话列表”等。
在环信的官网文档上也能看到环形给我们提供了一个代理方法,当我们自动登录无论是否成功,都会回调这个代理方法。
2.4.2集成环信的EaseUI
把EaseUI拖进来的时候会报错。
这个是因为用到了UIKit里的类,但是只导入了Foundation框架,这个错误在其他类里也会出现,可以手动修改Founfation为UIKit,但是我不建议这么做,第一这个做法的工程量比较大, 在其他类里面也要导入,二,不利于移植,当以后环信更新的时候我们还是需要做同样的操作,最好是创建一个pch文件,在pch文件里面导入UIKit。
2.4.3库冲突
在集成这个UI之前,就已经使用cocoapods导入了MBprogressHUD,这里又引入EaseUI,就会造成冲突,这个时候的解决方法其实很简单:把EaseUI中的MBProgressHUD删除就可以了。
2.4.4调用出错
在集成“EaseConversationListViewController”会话列表是时,继承自控制器DHConversationController,在这个里面试着去调用环信暴露出来的代理方法,数据源方法等,发现调用失败, 界面也不显示。
解决办法如下:
在DHConversationController添加如下代码
(void)viewDidLoad {
[super viewDidLoad];
[self tableViewDidTriggerHeaderRefresh];}