2012.7.24
又是新开始的一天。虽然是新开始吧,不过起床就已经将近10点了。
今天给程序加广播事件的处理。当用户给奴隶对应的号码打电话(发短信)或奴隶对应的号码给用户打电话(发短信)的时候,经验和金钱会相应增加。
先查查教程,觉得这个东西很好玩,加上应该能挺有意思的。
监听打电话基本没问题了,可以知道电话的状态是主叫还是被叫,可以得到打电话的号码,现在的问题是获得打电话的时间。这里面有点比较纠结的是,电话的状态之间的转换。不是说铃声响了,接了,挂了这么简单。在接听之前会有一个状态是来电,然后才是接听。
当被叫的时候同样麻烦。
主叫:播出 -> (接听)-> 来电 -> 接听 -> (挂断) ->来电 -> 挂断
被叫:(响铃) ->来电 -> (响铃) ->(接听) -> 来电 -> (接听) ->(挂断) -> 来电 -> 挂断
括号中的蓝色状态表示输出有n多次是该状态,当然时间都很短,基本可以忽略不计。由于各个状态的解释都是从网上看到的,所以不免有些出入,现在看来来电可能不仅仅是一个表示有电话打来的状态,它很可能是一个中间态,或者是一个转换状态,表示在这个状态之后电话的通话状态将会有一个变化,那如果把这个中间态去掉的话,上面的状态就变成了下面这样:
主叫:播出 -> (接听)-> 接听 -> (挂断) -> 挂断
被叫:(响铃)-> (响铃) -> (接听) -> (接听)-> (挂断) -> 挂断
这样就可以转换成可以理解的状态啦~
可能是在设置监听的时候不是只执行一次,所以系统要通过不停的刷新来获得当前的通话状态,所以,就会有N多相同的状态,ok,进一步优化一下:
主叫:播出 -> (接听)-> (挂断)
被叫:(响铃)-> (接听) -> (挂断)
这样就更符合正常的思维了,好了,下一步是考虑如何获得通话时间。
通话时间就是对时间差的计算了,这个也查了一段时间,因为不知道这是个什么东西,还想着时间差是能通过直接对Date类型的数据进行运算呢。
这里有一个基础知识:从Android系统获取的时间为自January 1, 1970 00:00:00 UTC后的毫秒数。
所以,取两个毫秒数,然后相减,然后转换成Date类型,然后转换成String类型输出。
想的是这样,试试。
有点问题,抛出了一个什么异常没有被捕获,程序崩溃了,为什么呢。
不用那个方法了,就参考它的意思吧,不用再转换回来,直接将两个Long型的数据转换成Int型或者Long型,如果是返回分钟数,就将结果 / (1000 * 60),如果是返回小时数,就将结果 / ( 1000 * 60 * 60)。这样就直接得到了小时数和分钟数,可是那好几个接听和挂断的状态让我很伤啊。